Блоги :: Колонка пользователя vanek-ridal :: Игровой движок Phoenix Game Engine - Часть 3

 
 
 
PSP Club
AllHits.Ru - Прокачай свою PSP на максимум!
Разделы портала
Поиск




Авторские колонки о PSP - Расскажи всем о своих впечатлениях
Колонки / Блоги пользователей PSP-Club.Ru

Игровой движок Phoenix Game Engine - Часть 3

Автор: vanek-ridal | Пишет Инструкции Инструкции | Опубликовано 28.10.2009 17:57

Игровой движок Phoenix Game Engine - Часть 3

И снова всем привет! Уже в третий раз.
Цикл статей о PGE продолжается и до сих пор не видит конца.

Это уже третья часть, а предыдущие Вы найдёте здесь:

Игровой движок Phoenix Game Engine - Часть 2
Игровой движок Phoenix Game Engine - Часть 1

------------------------------------------------------------------------

Некоторые из тех, кто уже начал изучать PGE по этому курсу, задавали мне вопросы в личке.
Эти вопросы и ответы на них Вы найдёте прямо здесь.

6. Вопросы и ответы

6.1. А мерцания точно не будет?

Точно. Мерцание избегается с помощью функций pge.gfx.startdrawing(),
pge.gfx.enddrawing() и pge.gfx.swapbuffers().

Подробнее об этом читайте во второй части, пункт 4.1.
Там при разборке hello world об этом говорится.

6.2. Как сделать движущуюся линию?

Для этого нам понадобятся 4 переменные.
Они будут обозначать координаты концов линии.
Назовём эти переменные: x,y,x2,y2.

Зададим переменным начальные значения:

Цитата:

x = 10
y = 10
x2 = 470
y2 = 262


Чтобы вывести линию по этим координатам достаточно сделать вот что:

Цитата:

pge.gfx.drawline(x, y, x2, y2, green)


Теперь, чтобы линия двигалась, нужно постоянно изменять координаты.
Например, чтобы первый конец линии двигался вправо, нужно увеличивать координату x.

Чтобы увеличить какую-либо переменную на 1, нужно сделать так:

Цитата:

x = x+1


Понятно, что для уменьшения нужно поставить минус вместо плюса.

Готовая программа:
Цитата:

x = 10
y = 10
x2 = 470
y2 = 262

green = pge.gfx.createcolor(0, 255, 0) -- делаем зелёный цвет

while pge.running() do

pge.gfx.startdrawing() -- начало рисования
pge.gfx.clearscreen() -- очистка экрана

pge.gfx.drawline(x, y, x2, y2, green) -- рисуем линию

pge.gfx.enddrawing() -- конец рисования
pge.gfx.swapbuffers()

x = x+1
y = y+1
x2 = x2-1
y2 = y2-1
-- изменяем координаты

end


Это самый простой пример движения линии.

Характер движения объекта на экране зависит от того, как изменяются его координаты.
Поэтому, при создании движения Вы должны прежде всего придумать, как изменять координаты объекта
для достижения желаемого результата.

6.3. Почему не выводится русский текст и что с этим делать?

В PGE пока нет поддержки кириллицы, но автор PGE говорит, что скоро это реализует.

Однако, выход есть, точнее, два выхода.

Первый, самый простой - нарисовать текстуру с текстом.
Второй - создать свой TTF-шрифт и подставить в нём вместо английских букв русские.

------------------------------------------------------------------------

Пока остановимся на этих трёх вопросах.
Далее будет идти продолжение уроков по PGE.

7. Ещё несколько уроков

7.1. Урок 5. Создаём меню

Без меню не обходится ни одна игра.
Почти во всех играх мы встречаем такие пункты, как: "Новая игра", "Продолжить" и т.п.

Какие бывают меню? - Самые разнообразные: текстовые, графические, вертикальные, горизонтальные...
А бывают даже меню-гибриды, например XMB: оно и графическое и текстовое одновременно -
значки, возле которых есть подпись, при этом XMB одновременно и вертикальное и горизонтальное,
это, так сказать, 2D-меню.

Как будет выглядеть Ваше меню, зависит от Вашей фантазии,
хотя, Вы можете сделать и самое обычное меню, чему, кстати говоря, я Вас сейчас и научу.

Давайте подумаем, что нужно для простого текстового меню?
Меню состоит из пунктов, значит, нам нужен набор из пунктов (строк), т.е. массив.
А ещё нам нужна переменная (целое число), которая будет указывать номер пункта, который сейчас выбран.

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

При этом нужно предупреждать ситуации, когда выбирается несуществующий пункт (например, номер 0).

Для начала объясню, как создавать массивы в Lua.

В математике множества принято записывать так:
A = {элемент1, элемент2, ...}

В Lua создание массива выглядит так же, за исключением того,
что нельзя употреблять многоточие (...) для обозначения бесконечности массива,
поскольку бесконечной памяти у нас не бывает Улыбается

Итак, попробуем создать массив пунктов нашего меню:
Цитата:

items = {"Start game","Options","Quit"}


При этом к первому пункту мы будем обращаться как к items[1], ко второму как к items[2], и т.д.
Если мы попытаемся обратиться к элементу items[4] или items[0], то получим nil.

Теперь я научу Вас выводить элементы массива на экран.
Всё очень просто, достаточно вспомнить hello world.

Только вместо "Hello, World!" нужно поставить items[1] или items[2] или вообще всё, что хотите.

Пример:
Цитата:

white = pge.gfx.createcolor(255,255,255) -- создаём белый цвет

MyFont = pge.font.load("verdana.ttf",12) -- загружаем шрифт

items = {"Start game","Options","Quit"} -- создаём массив

while pge.running() do -- цикл до тех пор пока pge выполняется
pge.gfx.startdrawing() -- начало рисования
pge.gfx.clearscreen() -- очистка экрана
MyFont:activate() -- активируем шрифт перед использованием
MyFont:print(25,20,white,items[1]) -- печатаем белым цветом в координатах (25,20)
pge.gfx.enddrawing() -- конец рисования
pge.gfx.swapbuffers()
end -- конец цикла


В этом примере выводится первый элемент массива items.

Как вывести весь массив?
Давайте сначала попробуем самым тупым способом - выведем каждый элемент отдельным print 'ом.

(я не буду писать весь скрипт, Вы сами догадаетесь, что куда вставлять)

Цитата:

MyFont:activate() -- активируем шрифт перед использованием
MyFont:print(25,20,white,items[1])
MyFont:print(25,40,white,items[2])
MyFont:print(25,60,white,items[3])


Давайте подумаем, чем плох этот способ.
Представьте, что в Вашем массиве 100 элементов или, что ещё хуже, неизвестное кол-во элементов.
В первом случае пришлось бы писать целых 100 строк, а во втором мы бы вообще не смогли вывести массив.

Давайте не будем мазохистами и подумаем, каков же хороший способ.
Хороший способ - воспользоваться циклом for.

Цикл for в Lua:
Цитата:

for счётчик = нижняя_граница, верхняя_граница do
действия
end


Для вывода массива из трёх элементов нам потребуется следующая конструкция:
Цитата:

MyFont:activate()
for num = 1, 3 do
MyFont:print(25,10+num*20,white,items[num])
end


Я рекомендую не просто пробежаться глазами по этому примеру, а внимательно его рассмотреть.
Буквально весь этот отрывок значит следующее:

цикл для num от 1 до 3
пишем пункт с номером num
конец цикла

И ещё поясню вот это:
Цитата:

10+num*20


Это нужно для того, чтобы между верхними краями текста был отступ в 20 пикселей плюс ещё 10 пикселей от верха экрана.
Таким образом первый элемент будет написан в координатах 25, 30 (т.е. 25, 10+1*20),
второй элемент - в координатах 25, 50 (т.е. 25, 10+2*20), третий элемент - в координатах 25, 70 (т.е. 25, 10+3*20).

Ну вот, Вы уже, наверное, обрадовались...
Так вот, я хочу Вам напомнить, что это ещё не готовое меню, а просто пункты, выведенные на экран.

Итак, я говорил, что нам ещё нужна переменная-число, которая показывает, какой пункт сейчас выбран.
Назовём эту переменную index:

Цитата:

index = 1


Так мы заранее сделаем первый пункт выбранным по умолчанию.

Теперь надо как-то сделать, чтобы выбранный пункт как-нибудь выделялся.
Давайте модифицируем предыдущий отрывок так, чтобы выбранный пункт рисовался зелёным цветом.

Цитата:

MyFont:activate()
for num = 1, 3 do
if num==index then
MyFont:print(25,10+num*20,green,items[num])
else
MyFont:print(25,10+num*20,white,items[num])
end
end


Здесь проверяется каждый пункт: если номер пункта равен index, тогда пишем пункт зелёным цветом,
а в противном случае - белым цветом.

Не забудьте создать цвет green в начале.

Теперь надо сделать так, чтобы index изменялся в зависимости от нажатий кнопок вверх/вниз.
Вспомним один из предыдущих уроков.

Цитата:

if pge.controls.pressed(PGE_CTRL_UP) then
index = index-1 -- уменьшаем index на 1
end

if pge.controls.pressed(PGE_CTRL_DOWN) then
index = index+1 -- увеличиваем index на 1
end


Вот и всё!
Осталось только собрать все эти отрывки вместе.
Готовая программа:

Цитата:

index = 1
white = pge.gfx.createcolor(255,255,255)
green = pge.gfx.createcolor(0,255,0)

MyFont = pge.font.load("verdana.ttf",12)

items = {"Start game","Options","Quit"} -- создаём массив

while pge.running() do
pge.controls.update() -- не забываем обновлять инфу о кнопках
pge.gfx.startdrawing()
pge.gfx.clearscreen()

MyFont:activate()
for num = 1, 3 do
if num==index then
MyFont:print(25,10+num*20,green,items[num])
else
MyFont:print(25,10+num*20,white,items[num])
end
end

if pge.controls.pressed(PGE_CTRL_UP) then
index = index-1 -- уменьшаем index на 1
end

if pge.controls.pressed(PGE_CTRL_DOWN) then
index = index+1 -- увеличиваем index на 1
end

pge.gfx.enddrawing()
pge.gfx.swapbuffers()
end


Ффуууу... как я задолбааался этот урок писать Улыбается

На самом деле это ещё не всё. Осталась ещё одна нерешённая проблема -
в нашем меню можно выбрать несуществующие пункты.
О том, как исправить это, пойдёт речь в следующем уроке.

7.2. Урок 6. Дорабатываем меню

Проблему, о которой я говорил в конце предыдущего урока, решить легко.
Давайте посмотрим на кусок скрипта, отвечающий за проверку нажатий кнопок вверх/вниз:

Цитата:

if pge.controls.pressed(PGE_CTRL_UP) then
index = index-1 -- уменьшаем index на 1
end

if pge.controls.pressed(PGE_CTRL_DOWN) then
index = index+1 -- увеличиваем index на 1
end


У нас есть условия pge.controls.pressed(PGE_CTRL_UP) и pge.controls.pressed(PGE_CTRL_DOWN).
Мы проверяем ими нажатие кнопок, но не проверяем номер выбранного пункта.
Мы должны проверять номер выбранного пункта, чтобы запретить выбор несуществующих пунктов.

Для этого нужно изменить условия следующим образом:
Цитата:

if pge.controls.pressed(PGE_CTRL_UP) and ( index > 1 )
if pge.controls.pressed(PGE_CTRL_DOWN) and ( index < 3 )


Думаю, всё понятно.

Но это не всё.
Вы, наверное, помните, что я говорил о том, что у нас может быть такая ситуация,
когда нам не задано кол-во элементов в массиве, задан только массив.

Здесь нам пригодится оператор # (решётка), который умеет определять кол-во элементов в массиве:

Цитата:

#массив


Пример:
Цитата:

#items


Нам осталось только поменять число 3 в нашем скрипте на #items.
Тогда мы сможем сколько угодно добавлять в наш массив элементы, не заботясь о том, сколько их в нём.
В общем, # - полезный оператор.

7.3. Урок 7. Альфа-канал в цвете

Почти во всех примерах мы пользовались функцией pge.gfx.createcolor(), которая создаёт цвет.
Я говорил, что она имеет 3 аргумента: red, green, blue.
На самом деле она имеет ещё один (необязательный) аргумент - alpha.
Он задаёт непрозрачность (т.е. прозрачность наоборот) задаваемого цвета.

Пример:
Цитата:

pge.gfx.createcolor(255,100,20,120)


Кстати, я не говорил о том, что все 4 аргумента могут принимать значения от 0 до 255 включительно.
Учтите это.

Вы можете попробовать создать цвет с альфа-каналом 128 и вывести текст этим цветом.
Этот текст будет полупрозрачным.

P.S. Если Вы работаете в Фотошопе, то Вы точно всё это поняли ;)

------------------------------------------------------------------------

8. Немного полезной информации о PGE

8.1. Кто такой InsertWittyName?

Это автор PGE! Спасибо тебе, о великий InsertWittyName! Улыбается
К этому человеку всегда можно обратиться за помощью, с вопросом или пожеланием о PGE.

8.2. Куда обращаться?

Зайдите на сайт luaplayer.org.

Там есть форумы о Lua и в этих форумах есть раздел о PGE.
Там можно узнать всё.
Правда, Вам нужно хорошо знать английский язык.

Также на luaplayer.org есть документация к PGE, но она состоит из простого описания каждой функции.
Так что лучше познавайте PGE по этой статье.

На том же сайте Вы можете найти готовые игрушки, написанные на PGE.

------------------------------------------------------------------------

Это не последняя часть моей статьи. Так что ждите - будет ещё много интересного!

------------------------------------------------------------------------

Специально для PSP-Club.Ru

С Вами был vanek-ridal, всем спасибо за внимание!
PSP Club Vote Bar Проголосовать противПроголосовать за!
Текущий рейтинг +40 Голосов против 6 Голосов за 46
Для того чтобы добавить комментарий, вам необходимо авторизоваться.
Это не займет много времени, а авторизованные пользователи получают доступ к расширенным возможностям клуба.


 
 
Контакты | Обратная связь | Реклама на сайте | RSS RSS Лента. Сводка последних добавлений игр для PSP
MaxiPack Web Projects © 2021. При копировании материалов ссылка на сайт обязательна.
"PSP" и "Play Station" - зарегистрированные торговые марки корпорации Sony Computer Entertainment.