Эту тему я хотел бы посвятить мануалу по созданию одной очень популярной в своё время игры с тетриса - змейка.
Облазив интернет по гуглу, я так и не нашёл приличного манула по коддингу этой игры, и поэтому решил написать свой собственный, дабы юзеры, ищущие по гуглу, натыкались на этот сайт, среди прочих, и получали достойную помощь =)
Я не пишу мануал для совсем ничего не знающих людей в области программирования, ибо это слишком хлопотно и долго, однако я постараюсь, как можно подробнее прокомментировать весь код…
С чего начнём, наверное с понимания принципа работы игры.
А их - этих принципов может быть много, лично мною были испробованы 3.
Но без сомнений ТРЕТИЙ- самый экономный, безбаговый и понятный, его основной принцип действия, то есть идея удаления массива хвоста и расширения массива по средствам постановки головы, был предложен vladgalay-ем, и превосходил, по вышеизложенным параметрам 2 моих собственных принципа =)
О нём я и буду писать.
И так, как же работает змейка, ну по сути её голова всегда движется вперёд, а хвост волочится за нею, но причём ровно в той последовательности, как мы ходили головой.
То есть нам надо прорисовывать постоянно новую голову вперёд а хвост затирать(удалять), а когда змейка будет кушать, то и хвост затирать не надо.
Мы поняли задачу, а теперь приступим к реализации.
Что нужно для счастья ? - представить змейку в качестве массива, но не просто массива а массива в массиве, если так можно выразиться, то есть у каждого квадратика, из которых состоит змея, будет свой массив, хранящий координаты этого квадратика по х и по у.
P.S. Условимся, что тело змейки, состоит из кубов размера 8 пикселей в ширину и 8 пикселей в высоту.
КОД
n,m,timer=1,0,0
kub=Image.load("kub.png")
while true do--"главный игровой цикл нашего приложения"
screen:clear()--"функция для осуществления очистки экрана"
pad = Controls.read()--"инициализация переменной pad"
if timer>=0 then--"условие таймера, сравниваем его с 0-лём"
timer=timer+1--"увеличить счетчик при выполнении условия"
end
if timer>10 then--"условие таймера, если он больше 10"
table.remove(telo,1)--"удаление последнего звена массива, т.е. хвоста змейки"
table.insert(telo,{x=telo[table.getn(telo)].x+n,y=telo[table.getn(telo)].y+m})--"постановка нового звена"
timer=0--"обнуление таймера"
end
for i=1, table.getn(telo) do--"функция table.getn(telo) определяет размер массива telo"
end
--"алгоритм управления направлением движения"
if pad:right() then
if n~=-1 and m~=0 then
n=1
m=0
end
elseif pad:left() then
if n~=1 and m~=0 then
n=-1
m=0
end
elseif pad:up() then
if m~=1 and n~=0 then
m=-1
n=0
end
elseif pad:down() then
if m~=-1 and n~=0 then
m=1
n=0
end
end
screen:flip()--"проявление изображения на экран из буфера"
end--"конец главного цикла"
И так, мы получили бегающую по экрану змейку, изгибающуюся на поворотах и при этом затрачиваемую минимум ресурсов, как раз под силы тетриса.
А теперь поподробнее для тех, кто по той или иной причине не знает некоторых функций кода. =)
НЮАНСЫ
1) kub=Image.load("kubik.png")—загрузка картинки в переменную kub
2) local telo={{x=1,y=1},{x=2,y=1},{x=3,y=1},{x=4,y=1}}—local это объявление масс ива который написан далее, то есть массива telo, далее идёт присваивание этому массиву данных, по средствам вложенных массивов. То есть первый кубик,а это у нас-хвост будет иметь координаты по х-1, по у-1, второй по х-2, по у-1 и т.д.
3) table.remove(telo,1)—функция для удаления первого э-та массива telo, то есть нашего хвоста, цифра 1 указывает, как раз на номер э-та массива
4) table.insert(telo,{x=telo[table.getn(telo)].x+n,y=telo[table.getn(telo)].y+m})—функция для постановки нового кубика змеи, то есть расширения нашего массива tela.
5) screen:blit(telo[i].x*10,telo[i].y*10, kub)—цифры 10 указывают на ширину/высоту нашего изображения kub-эти цифры можно менять по своему усмотрению.
Вот и всё, что я хотел вам сказать по поводу коддинга змейки на PSP.
А как домашнее задание даю вам сделать систему генерации пищи и поедания этой пищи змейкой.
Ответ на это задание будет выложен мною в следующей теме =)