строим двухмерное счастье ПАЛАГИН АНТОН Спецвыпуск: Хакер, номер #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-диаграмму, описывающую архитектуру этих классов, смотри на рисунке «Архитектура виджетов». |