Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #64, МАРТ 2006 г.

строим двухмерное счастье

ПАЛАГИН АНТОН

Спецвыпуск: Хакер, номер #064, стр. 064-076-1


(TONY@EYKONTECH.COM)

ТЕТРИС: ДЕЛАЕМ СВОИМИ РУКАМИ

КАКОЙ ЖЕ БУДЕТ НОМЕР ЖУРНАЛА ОБ ИГРОПАЯНИИ, ЕСЛИ В ПРОЦЕССЕ РАБОТЫ НАД НИМ НЕ УБИТО НИ ОДНОГО КРО… — ТЬФУ! — НЕ НАПИСАНО НИ ОДНОЙ ИГРЫ?! ПЛОХОЙ НОМЕР! ВЫКИНУТЬ ЕГО! МУСОР! ВОПЛИ ВОЗМУЩЕННЫХ РЕДАКТОРОВ ЖУРНАЛА БЫЛИ ПРЕРВАНЫ РЕПЛИКОЙ ОДНОГО АВТОРА (ТО ЕСТЬ МЕНЯ): «НЕ ВОЛНУЙТЕСЬ, ГОСПОДА, СЕЙЧАС ВСЕ СТАНЕТ КРУТО… ПРЕДСТАВЛЯЮ ВАШЕМУ ВНИМАНИЮ ХTREAS…» ПО ПРАВДЕ ГОВОРЯ, ЭТО САМЫЙ ОБЫЧНЫЙ И БАНАЛЬНЫЙ ТЕТРИС, НО ОН РАЗРАБОТАН СПЕЦИАЛЬНО ДЛЯ СПЕЦА И ЕГО ЧИТАТЕЛЕЙ И ДОСТУПЕН ДЛЯ НИХ ПО ОСОБОЙ ЛИЦЕНЗИИ :)

инструменты

Для работы нам понадобятся некоторые инструменты. Во-первых, это 2D-движок, который используется в тетрисе, — я использовал PopCap Framework (см. ссылки). Чтобы получить этот SDK, необходимо зарегистрироваться «у них» на форуме и скачать файлик весом около 7 Мб. На базе этого инструмента сделана целая куча офисных развлекалок наподобие Zuma и Dynomite. Кроме движка, мы не обойдемся без библиотеки Boost (www.boost.org). Откомпилируй PopCap SDK и настрой свою среду разработки на его заголовочные и экспортные файлы. Также не забудь указать путь к Boost'у. Как среду разработки я использовал MSVC++ 6.0. Кроме нее, ты спокойно можешь использовать VC 7 и 8, достаточно просто конвертировать проекты и откомпилировать новую библиотеку PopCap.

архитектура виджетов

Прежде чем углубляться в дебри кода, посмотрим на архитектуру приложения PopCap.

Листинг «Точка входа»

//Создаем ядро игры

GameApp* anApp = new GameApp();

//Инициализируем ресурсы игры

anApp->Init();

//Запускаем игру

anApp->Start();

//Завершаем работу ядра игры

delete anApp;

В точке входа в программу создается объект класса GameApp. Этот класс производится от базового класса SexyAppBase — ядра любого приложения PopCap. Он хранит в себе все игровые сущности и менеджеры, с его помощью происходит управление игровыми событиями, такими как: начало игры, пауза, просмотр дополнительной информации, завершение работы программы. Игровое поле реализуется в классе Board, который является производным от класса Widget и агрегируется классом GameApp. Игровое поле разделяется на две части: левую панель (меню) и правую панель — стакан, куда падают фигуры. Класс Board настраивает положение главного меню и игровой области (зоны), следит за освобождением памяти при завершении работы и обрабатывает нажатия кнопок: перемещение фигур влево-вправо (кнопки <влево>/<вправо>), поворачивание (пробел) и ускорение (кнопка <вниз>). Главное меню игры реализуется в классе LeftPanel, который является производным от классов Widget и ButtonListener, то есть кроме графической нагрузки несет ответственность за обработку событий, генерируемых кнопками главного меню игры. Агрегируется классом Board.

Игровая зона также является виджетом, но не обрабатывает никаких кнопок — используется только для отображения тетрисных фигур. Игровая зона реализуется классом PlayArea и агрегируется классом Board. Еще один виджет в нашей игре — заставка, этот экран демонстрируется пользователю перед началом игры (во время загрузки игровых ресурсов). Здесь можно демонстрировать пользователю информацию об игре и требовать ввести ключ разблокировки, если ты пишешь условно-бесплатную игру. UML-диаграмму, описывающую архитектуру этих классов, смотри на рисунке «Архитектура виджетов».

Содержание  Вперед на стр. 064-076-2