Страницы

пятница, 11 сентября 2009 г.

Остов игры

Теперь перейдём к более конкретным действиям по созданию игры. Из поста про Игровой Цикл вы знаете что нужно сделать переходы между состояниями (см. пример Druce). Как вы знаете, этими переходами могут быть: заставка → меню ↔ игра, и другие их комбинаций. Т.е. пока состояние "заставка" мы проигрываем весь код связанный с заставкой, состояние "меню", весь код связанный с меню и т.д. Многие выполняют этот приём неосознанно, но мы сейчас углубимся в этот процесс... Процесс создания Конечного Автомата (сокр. КА).

Хочу сразу сказать, что делать будем недетерминированный КА. Что это такое? Это когда от состояния существует несколько переходов, т.е. например, вы можете выйти из состояния "игра" как в "выход", так и "меню". Что входит в КА? Во-первых состояния. В нашем случае КА будет сам игровой цикл, а его состояния это его части (меню, заставка, игра, игровое меню и т.д.). Ещё есть начальное состояние и конечное. Смотрим:

Игровой цикл

state = 'intro'; //начальное состояние
game = true;

while(game)
switch(state)
{
case 'intro': /*показываем вступление*/; if(вступление_кончилось) state = 'menu'; break;
case 'menu': /*обрабатываем меню*/; if(новая_игра) state = 'game'; break;
case 'game': /*здесь всё что касается игры, внутренний КА, инвентарь и меню*/; if(выход) state = 'quit';break;
case 'quit': /*показываем титры*/ if(титры_кончились) game = false; break; /*конечное состояние*/
default: show_message('Incorrect state. / ' + string(state)); state = 'intro'; break;
}

Несмотря на то что в Game Maker некоторые из этих действий можно реализовать немного другими способами, способ создания Игрового Цикла через КА является главенствующим. Например, состояния могут быть выражены не состояниями в коде, а комнатами. Закончился вступительный ролик, перешли в комнату-меню. Выбрали "Новая игра" перешли в комнату с игрой и т.д. Если проект простой, типа Пак-мана или Тетриса, то такой метод пойдёт, если игра сложнее, жанра РПГ, то метод КА будет предпочтительнее. Главное продумать структуру игры до мельчайших подробностей, иначе можно попасть в такой момент, что добавить или изменить что-то в игре будет невозможно и тогда придётся переделывать, если не весь проект, то большую его часть (у меня уже был такой момент).

Идём далее. Остов игры есть, это наш Игровой Цикл, наш основной КА. Внутри каждого состояния можно вписать любой код, т.е. можно вставить ещё КА, например, по обработке внутренних сообщений в состояний "game". Например, состояние "начало_игры", "инвентарь", "меню" и др. В каждом этом, так скажем, подсостояний игра ведёт себя поразному, хотя и находится в основном состояний "игра".Советы:
  • Структуру игры надо продумывать с самого начала. Иначе можно попасть в тупик. Прорабатывать структуру вам поможет график (как на рис. выше), т.е. визуальное виденье вашей структуры вам сильно поможет.
  • Ваши возможности в созданий игры ограничены только вашей фантазией. Вы можете делать со структурой всё что угодно! Вложенный КА только верхушка айсберга. И кстати, технология КА применяется во многих областях, например, в ИИ или в ракетостроений.
  • Подписывайте ваши состояния. Это чтобы не забыть. В Game Maker есть такая возможность как по-быстрому сравнивать строки, в других языках это несколько осложнено, поэтому составьте таблицу и подпишите, или нарисуйте график КА.
Теперь у вас есть остов, на которой уже можно делать игру, добавлять и редактировать связи. Редактировать и добавлять состояния теперь просто и легко, главное не забыть сделать между ними переходы. Не забываем что в разных состояних мы по разному обрабатываем события. Например, в самой игре мы обрабатываем события клавиатуры так (перемещаем главного героя), а в меню по другому (перемещаемся по пунктам меню). Зная всё это можно делать очень хорошую и крепкую основу. Единственное что ещё надо продумать, сохранение\загрузку данных и перемещение данных из состояния в состояние (переход уровней), т.е. чтобы была готова та часть которая будет отвечать за загрузку данных в данное состояние и перекидывать их в другое.

Не забываем ещё про один пунктик. У состояния есть несколько состояний (пардон за каламбур), а именно: инициализация (подобное Create), тело состояния (подобное Step) и очистка (подобное событию Destroy). Инициализация и очистка, единичные события и вызываются при необходимости, например, повторить состояние или загрузка всех нужных объектов(спрайтов, звуков и др. данных) для игры и последующее их стирание (если вы не подчистите за собою данные, то они будут здесь при следующем заходе в это состояние, т.н. Persistent). Тело состояния работает всегда.


Пример. Хочу отметить что в примере нет цикла while(game). Почему? Да потому что для Game Maker он уже реализован, ввиде блока Step или Draw.

1 комментарий: