вторник, 2 октября 2012 г.

GWT game development

     В этой статье я не буду рассказывать, как сделать игру на GWT, потому что это займет ряд статей. Я просто опишу, что у меня получилось и какие особенности игры. Исходный код есть в свободном доступе на github и dropbox.
     Игра называется Space Shooter - это аркадный шутер с элементами прокачки. Суть ее сводиться к тому, чтобы уничтожить как можно больше объектов и продержаться как можно дольше. Игрок управляет космическим кораблем и уничтожает постоянно приближающиеся астероиды, за это начисляются очки/баллы. Вначале игрок появляется в центре игрового пространства, с определенным количеством здоровья и нулевым опытом. Сверху на него произвольно приближаются астероиды с различной скоростью, но также есть возможность собирать бонусы, которые позволяют получить игроку временные преимущества. Количество этих объектов постоянно увеличивается в зависимости от набранных балов. Соприкосновение корабля с астероидами отнимает у игрока здоровье. Игра заканчивается если у игрока не осталось жизней, лучший результат будет записан в coookie и извлечен при старте игры и отображен в специальном info блоке.
     Итак, давайте рассмотрим детали 2D игры Space Shooter на GWT. Все действия будут происходить на HTML5 canvas элементе.
     В проекте есть пакет core, где содержаться базовые классы и интерфейсы. Это базовый абстрактный класс GameComponent, он является родительским для всех игровых элементов(Spaceship, Asteroid, Bullet, PowerupElement). И такие интерфейсы как: GameElement, Renderer, Updater. В которых содержаться методы для обновления объекта на канвасе, отрисовки, уничтожения и т.д.
     Все что связано с ресурсами для игры(css файлы, изображения, звуки и мелодии) содержится в пакете bundle. В интерфейсе SpaceShooterClientBundle подключены все необходимые и используемые ресурсы.
     Управление кораблем осуществляется через движение мыши или через клавиши: Up, Down, Left, Right. Стрельба из пушки происходит по нажатию левой клавиши мыши или через Shift. Тип пуль изменяется в зависимости от набранных балов. Также в игре по умолчанию возле каждого игрового объекта рисуется его координаты, включить или отключить это состояние можно с помощью Ctrl. Если же вы решили немножко отдохнуть от всех этих перестрелок или посмотреть, не напрягаясь на все это безумство на канвасе, можно включить паузу нажав на Esc. В состоянии паузы в правом верхнем углу будет отображен специальный лейбл.  
     Обработчики клавиатуры и мыши(GameKeyHandler, GameMouseHandler) содержаться в пакете - handlers. А в пакете math можно найти базовые классы для позиции объектов в игре(Position2D) и их размеров(Size2D).
     Также в проекте есть полезные классы ApplicationContext и ApplicationUtils, в которых содержатся константы, статические поля и очень много интересных методов.
     Типов астероидов в игре всего три: Coaly(углеродистый), Flinty(кремнёвый), Metal(металлический) и они содержаться в перечислении AsteroidType. У каждого астероида есть ускорение (AsteroidAcceleration). Их соответственно тоже три типа: Daydream(дрёма), Nightmare(кошмар) и Madness(безумство).
     Давайте разберемся в магической силе бонусов (power-ups).
     Бонусы, как и астероиды в рандомном порядке приближаются сверху игрового поля. Для игрока доступны следующие бонусы: Freeze(заморозка астероидов), Reflex_boost(замедляет движение всех астероидов на карте), Shield(игрок получает неуязвимость при помощи защитного поля, которое окружает корабль), Double_exp(за каждого уничтоженного астероида игрок получает 2 очка/балла), Medikit(+1 к здоровью игрока). Бонусы очень облегчают игру, но чем больше астероидов на карте, тем больше приходит понимание, что без бонусов никак не обойтись. К тому же бонусы добавляют динамичность и интересность к игровому процессу. Время бонусов длиться в течении 5 секунд после его соприкосновения с кораблем. Нельзя взять два одинаковых бонуса, пока не закончиться время действия бонуса. Но можно взять все бонусы сразу по одному виду. Время окончания действия бонусов будет отображаться пользователю на игровом поле.
     Эффект от бонусов никак не влияет на их появление и скорость движения, что очень приятно для игрока. Например случай когда использован бонус заморозки, все астероиды заморожены, а игрок спокойно подбирает бонусы и использует их по максимуму.
     Для бонусов и их генерирования в проекте есть перечисление Powerup и класс PowerupsGenerator.
     В главном классе SpaceShooter происходит все самое интересное. Включение/отключение главного таймера игры, инициализация основных элементов и обработчиков, регистрация используемых звуков, обновление игровых объектов и информации, проверка столкновений между кораблем/пулей и астероидом, кораблем и бонусом.
     При загрузке игры генерируется градиентный фон и произвольно рисуются множество маленьких звезд разных размеров. Для начала игры следует нажать на кнопку Play Game. Внутри игры в левом верхнем углу расположена info панель, которая содержит набранные баллы, лучший результат, количество жизней, общее время игры и количество кадров в секунду(FPS). Для расчетов fps в проекте предусмотрен класс FrameRate.
     В игре присутствует фоновая музыка и звуки при столкновении. Вся логика обработки звука находится в пакете sound. Где можно найти фабрику SoundManagerFactory, которая позволяет достучаться к менеджеру SoundManager, а он в свою очередь дает нам возможность работать со звуком через SoundPlayer, внутри которого и реализована логика воспроизведения. Вся магия звука возможна благодаря библиотеке gwt-voices.
     Игровой процесс игры Space Shooter во всей своей красе :)