Руководство по созданию игр для Game4py.
Проект Game4py создан предже всего для желающих писать игры для смартфонов. Хотя слово писать не совсем для этого подходит. Конструировать вернее. Game4py это не игра, это движек, который "играет" игры.
Делать игры для этого движка очень просто. Достаточно простого графического редактора, текстого редактора и утилиты wav2znd, если вы планируете использовать звуковые эффекты. И конечно же чуточку фантазии, без чего не может обойтись ни одна стоящая идея.
Итак, начнем...
Создание и архитектура проекта.
Игра состоит из уровней.  По окончании первого открывается второй и т.д. При окончании всех жизней, игру приходится начинать сначала.
Любая игра должна распологаться с папке games , который находится в каталоге с программой. Создайте папку с произвольным именем и латинскими буквами, желательно чтоб оно не совпадало с именем, которое может прийти в голову другим создателем игр, например название папки с проектом igra не желательно, а вот ваш ник vasia_pupkin может подойти.  Для того чтобы в меню game4py отображалось нормальное название типа Мега Игра, создайте в папке с игрой файл name.txt и впишите туда имя игры. ВНИМАНИЕ!!! кодировка файла должна быть utf-8!
В этой папке в обязательном порядке должно быть следующее:
  • файл main.xml содержащий нескольно настроек проекта
  • папка images в которой содержится вся графика используямая во всех уровнях игры
  • папка sounds в которой содержатся все звуки используемые на уровнях игры
  • папка levels в которой содержаться непосредственно описания уровней
В папке с игрой могут содержаться еще несколько картинок, могут но это не обязательно. Вот их предназначения:
  • mini-icon.png картинка размером 16х16, если она имеется то вместо стандартного значка эта картинка будет показана рядом с именем игры в списке всех игр
  • icon.png если присутствует эта картинка размеров 176х75 то она будет отображаться как логотип вашей игры в меню выбора уровней.
  • left.png и right.png эти два значка размером 16х16 отвечают  за  отображение значков вокруг выделенного уровня в списке.
Теперь давайте подробнее...
main.xml
Этот файл описывают основные настройки игры. Приведу его пример с пояснениями:
<main> # начало секции main
    <bg>0xcccccc</bg> # цвет фона в меню выбора уровней
    <text>0x0</text> # цвет текста в меню выбора уровней
    <lives>3</lives> # количество жизней которое дается для прохождения игры
    <names> # начало описания уровней (см. далее)
"0=Первый уровень
1=Второй уровень"
    </names>   # конец описания уровней
</main>
#  конец секции main
Самое важное здесь это секция names которая описывает уровни. Список должен обязательно начинаться с кавычки и заканчиваться кавычкой, между ними  выражения типа 0=Название где цифра соответствует номеру уровня (должен начинаться с нуля) и название уровня которое будет отображаться в меню. Каждый элемент должен начинться с новой строки. ВНИМАНИЕ!!! Кодировка файла должна быть utf-8.
Основные принципы.
Игровое поле состоит из блоков, размер каждого 16х16 точек. Движек оперирует этими блоками целиком. Координатная система начинается с нижнего левого угла.
Игрок совершает движения вперед и назад, может совершать прыжки, стрелять, собирать у.е. :)
В игре присутствуют объекты нексольких типов:
  • простой блок, натыкаясь на который герой останавливается. Это могут быть пол, стены, потолок...
  • блок типа danger,  натыкаясь на него герой погибает.
  • блок типа money,  натыкаясь на него герой получает одну условную еденицу :) сам блок при этом изчезает
  • блок типа lom, "Твердое" вещество, однако разрушаемое оружием героя. (кроме исключений, смотри ниже)
  • блок типа exit, при соприкосновении герой закончит прохождение уровня.
  • "живые обьекты", которые движутся в горизонтальной плоскости, могут иметь любой из перечисленных атрибутов. То есть на основе него можно создать как и врага так и движущийся мост например.
Можно задавать длинну уровня, которая ограничена только оперативной памятью. Можно создавать условия выхода из уровня, например если не собраны все у.е. и не убито 2 врагов, выйти из уровня нельзя.
Комбинируя все это, можно создавать разнообразные уровни и игры. Например, простая аркада, где нужно бежать и убивать врагов, имея много патронов, или лабиринт, который нужно проити весь, либо простую головоломку, где ограниченное число патронов нужно израсходовать правильно, прорубая стены к выходу, либо вообще не дать игроку патронов, требуя от него ловкости.
Графика в игре
Графика. как уже было сказано выше, содержится в папке images. Движек расчитан на то, чтоб один файл со спрайтом (так будем впредь называть картинки)  мог использоваться неограниченное количество раз в пределах уровня, и при этом он будет загружена всего один раз. Один и тот же спрайт может использоваться и на нескольких уровнях.
Для соответствия блокам, спрайты должны иметь размер 16х16 пикселей (кроме исключений, о котором поговорим ниже). Каждый спрайт может иметь маску.
Маска, это черно-белый спрайт. Грубо говоря, если наложить маску поверх исходного слайда, то на экране отрисуются только те точки исходного спрайта, где у маски белый цвет.
Вообще маску создавать не обязательно, тогда исхожный спрайт будет показан весь. Но рекомендуется их делать для изображений героя, а так же для спрайтов, которые имеют форму не квадрата, полностью занимающего пространство 16х16. В таких случаях оставшееся "прозрачное" пространство нужно закрашивать цветом фона, а если этот спрайт будет использован на разных уровнях с разнами цветами фона, то все же понадобится маска.
Все изображения должны иметь формат png. Если, например вы сохранили спрайт под имени image.png и хотите добавить маску для него, сохраните ее под названием image-mask.png и тогда маска автоматически подхватится движком и будет использована везде.
Можно сделать и исключения в размерах. Например, если вы хотите сделать облако, то необязательно его разбивать на кусочки. Сделайте один спрайт нужного размера, но помните, что для главного героя это будет лишь один блок, который находися в одной ячейки, хотя на экране он будет занимать большее место.
Звуки в игре
Звуковой сопровождение делится на два типа:
  • Звуковые эффекты формата znd, которые озвучивают некоторые действия
  • Фоновая музыка в формате mod которая играет на протяжении всего уровня.
Музыку в формате mod можно найти на бескрайних просторах интернета, либо написать самому. Эффекты в формате znd можно получить сконвертировав их из wav файлов при помощи утилиты wav2znd, написанная watt"ом. Эта утилита работает прямо на смартфоне и скачать ее можно отсюда
Описания уровней
Напомню, что уровни лежат в папке levels, нумеруются с нуля целыми числами и имеют формат xml. Этот формат имеет много плюсов. Самый главный это удобочитаемость. Просто заглянув в этот файл, который по сути является текстом, уже можно судить о том что за что отвечает.
файл имеет разделы, каждый из которых я сейчас опишу:
  • main - основные настройки уровня
  • images - "регистрация" спрайтов для использования движком
  • sounds - звуковая схема уровня
  • hero - описание героя
  • world - описания элементов игрового мира
  • life_objects - описания движущихся объектов
И теперь подробнее:
Раздел images
Для начала приведу пример раздела
<images>
    <file="money">money</file>
    <file="some_picture">kamen</file>
</images>
начинается он с тега <images> и заканчивается закрывающим тегом  </images>, как это и должно делаться в xml
Для того чтобы движек мог использовать спрайт, он должен быть загружен и зарегестрирован под каким либо именем. В этом примере загружаются два спрайта:
  1. Загружается спрайт money.png (и маска к нему, если существует money-mask.png. Имена файла нужно писать без расширения .png ) и регистрируется в движке под именем  money
  2. Загружается спрайт some_picture.png и регистрируется под именем kamen
Теперь в любом месте можно использовать спрайты с именами kamen и money.
Раздел sounds
Раздел может быть и пустым, вы можете удалять не нужные вам звуки.
На фон необходимо ставить музыку в формате mod а эффекты должны быть в формате znd.
Вот пример полного раздела sounds
<sounds>
    <file="intro.mod">bg</file> # Если файл имеет разрешение mod то он автоматически становится фоновой музыкой
    <file="jump.znd">jump</file> # звук при прыжке
    <file="shoot.znd">shoot</file> # звук при выстреле
    <file="shoot.znd">fire</file> # звук при попадании
    <file="money.znd">money</file> # звук при прибавлении у.е.
    <file="killed.znd">killed</file> # звук при смерти героя
    <file="killed.znd">finish</file> # звук при окончании уровня
</sounds>

Как вы нареное уже заметили, в атрибуте file необходимо писать название файла с расширением, а в содержании, заранее зарезервированные имена, которые изменять нельзя. Как видите, один и тот же звук можно ставить на разные события
Раздел hero
Описание героя. Все поля обязательны для заполнения.
Сам герой должен иметь 4 спрайта. 2-при движении влево, 2-при  движении вправо. При движении спрайты меняются, создавая анимацию. Вы можете использовать хоть одно изображения на все 4 состояния, как хотите :)
вот полное содержание раздела с пояснениями:
<hero>
    <left>image_name</left> # спрайт номер 1 при движении налево
    <left1>image_name</left1> # спрайт номер 2 при движении налево
    <right>image_name</right> # спрайт номер 1 при движении направо
    <right1>image_name</right1> # спрайт номер 2 при движении направо
    <weapon_left>image_name</weapon_left> # спрайт с изображением снаряда летящего влево
    <weapon_right>image_name</weapon_right> #  спрайт с изображеним снаряда леящего вправо
</hero>

Помните, что имена изображений (image_name) используемые здесь должны быть зарегестрированы в разделе images
Раздел main
Все поля обязательны для заполнения:

<main>
    <width>50</width> # ширина уровня в блоках

    <bg>0x4caaff</bg> #  цвет фона в hex
    <start_x>0</start_x> # x координата места откуда появляется герой в начале
    <start_y>3</start_y> # y координата места откуда появляется герой а начале
    <weapon>10</weapon> #  число зарядов оружия которое дается в начале уровня
    <kill_danger>1</kill_danger> # 1 или 0, убиваются ли оружием опасные объекты
   
    <panel_bg>0x4caaff</panel_bg> # цвет панели состояния сверху
    <panel_txt_color>0xffffff</panel_txt_color> # цвет текста панели состояния
    <panel_money_img>money</panel_money_img> # имя спрайта значка у.е. на пенели
    <panel_weapon_img>bomba</panel_weapon_img>
# имя спрайта значка остатка зарядов на пенели
    <panel_killed_img>mouseL</panel_killed_img> # имя спрайта значка убитых врагов на пенели
    <panel_lives_img>heroL</panel_lives_img> # имя спрайта значка оставшихся жизней на пенели

    <need_kill>1</need_kill> # количество убитых для выхода с уровня
    <need_money>2</need_money> # количество у.е. для выхода с уровня
    <menu_bg>0x8B6B6E</menu_bg> # цвет фона в меню
    <menu_txt>0xffffff</menu_txt> # цвет текста в меню
    <menu_select>0x484F74</menu_select> # цвет выбранного в меню
</main>
Раздел world
Раздел содержит блоки данных, которые описывают игровой мир. В этом разделе блоки разбиты на элементы, которые начинаются тегом <data> и закрываются тегом </data>
Между ними распологаюся данные об этом элементе. Приведу пример:
<world>
    <data>"type=box
image=money
x=3
y=3
money=1"
    </data>

</world>
Здесь описан игровой мир который состоит всего из одного элемента, который распологается по координатам x=3 y=3 и имеет атрибут money.
Подробности:
type=box или type=rectangle указывает на то что этот элемент либо еденичный (box), либо прямоугольник из элементом (rectangle)
x=3 указывает координату по горизонтали местоположения элемента
y=3 указывает координату по вертикали местоположения элементы
money=1 (danger=1, lom=1, exit=1) указывает на тип элемента, может и не содержать данный атрибут вообще, тогда мы получим простое "твердое тело"
Если указать type=rectanglle, то нужно добавить еще два атрибута:
height=1 высота обьекта
width=10 ширина обьекта
При этом все элементы созданного прямоугольника будут иметь одинаковый атрибут свойства
Элементы <data> должны следовать друг за другом, не важно в какой последовательности.
<world>
    <data>
        ...
    </data>

    <data>
        ..
    </data>
    ..
</world>
И так, шаг за шагом мы создали игровой мир, пора его наполнить "живыми существами"
Раздел life_objects
Этот раздел имеет такую же структуру как и раздел world, поэтому приведу пример описания одного "живого существа"
<life_objects>
    <data>"img_left=mouseL # изображение элемента движущегося влево
img_right=mouseR #
изображение элемента движущегося вправо
type=danger # тип объекта.. об этом говорилось выше
x=3 # координата x
y=1 # координата y
len=2 # длинна движения влево вправо.
direction=-"  # первоначальное  направление + или - 
    </data>
</life_objects>

Все движущиеся обьекты двигаются бесконечно между 2 точками от x до x+len
Заключение
Надеюсь, я рассказал вам все, что поможет вам сделать игру на движке game4py.
Если что то остается непонятным, предлагаю посмотреть пример игры который идет в комплекте с game4py.
Если же, и там не найдете ответа, отвечу на ваши вопросы по почте soft@mobile-master.org с пометкой в теме письма "game4py".
В крайнем случае, если вопрос не терпит отлагательств, воспользуйтесь кнопкой "помощь по смс" на сайте либо, нажав меню в программе game4py и следуйте инструкциям... В ответном смс придет номер моей аськи.

Удачного творчества, друзья!
Размещение данного текста целиком либо по частям на других интернет ресурсах а так же в прочих изданиях, разрешается только при согласовании с автором.
©2008 Igor aka kAIST