Суббота, 19.09.2020, 12:29 | Приветствую Вас Гость
Архив готовой игры, если захотите узнать больше, чем здесь написано :)

 

Создание игры "Змейка” для [PSP]


Эту тему я хотел бы посвятить мануалу по созданию одной очень популярной в своё время игры с тетриса - змейка.

Облазив интернет по гуглу, я так и не нашёл приличного манула по коддингу этой игры, и поэтому решил написать свой собственный, дабы юзеры, ищущие по гуглу, натыкались на этот сайт, среди прочих, и получали достойную помощь =)

Я не пишу мануал для совсем ничего не знающих людей в области программирования, ибо это слишком хлопотно и долго, однако я постараюсь, как можно подробнее прокомментировать весь код…

С чего начнём, наверное с понимания принципа работы игры.
А их - этих принципов может быть много, лично мною были испробованы 3.
Но без сомнений ТРЕТИЙ- самый экономный, безбаговый и понятный, его основной принцип действия, то есть идея удаления массива хвоста и расширения массива по средствам постановки головы, был предложен vladgalay-ем, и превосходил, по вышеизложенным параметрам 2 моих собственных принципа =)

О нём я и буду писать.

И так, как же работает змейка, ну по сути её голова всегда движется вперёд, а хвост волочится за нею, но причём ровно в той последовательности, как мы ходили головой.

То есть нам надо прорисовывать постоянно новую голову вперёд а хвост затирать(удалять), а когда змейка будет кушать, то и хвост затирать не надо.

Мы поняли задачу, а теперь приступим к реализации.

Что нужно для счастья ? - представить змейку в качестве массива, но не просто массива а массива в массиве, если так можно выразиться, то есть у каждого квадратика, из которых состоит змея, будет свой массив, хранящий координаты этого квадратика по х и по у.

 

 

P.S. Условимся, что тело змейки, состоит из кубов размера 8 пикселей в ширину и 8 пикселей в высоту.

КОД
 

n,m,timer=1,0,0

kub=Image.load("kub.png")

 
--"создание первых 4-х звеньев змейки"
local telo={{x=1,y=1},{x=2,y=1},{x=3,y=1},{x=4,y=1}}

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"
screen:blit(telo[i].x*10,telo[i].y*10, kub)--"распечатка тела змеи из кубов размера 8*8, умножение на 10 сделано для того, чтобы между кубами образовывался зазор в 2 пикселя"
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.

А как домашнее задание даю вам сделать систему генерации пищи и поедания этой пищи змейкой.

Ответ на это задание будет выложен мною в следующей теме =)
Навигация
Форма входа

Календарь
«  Сентябрь 2020  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
282930