Идея создания игры
Идея попробовать свои силы в чем-то интересном, захватывающем появилась у меня и друзей давно, но мы не знали, как ее реализовать. Были местами неуклюжие, иногда неудачные, а временами успешные попытки программирования микроконтроллеров, создания роботов, не всегда выполнявших свою задачу, но чувствовалось, что это не то…
Так продолжалось довольно долгий промежуток времени, пока знакомые дизайнеры из Киева во время разговора, как бы между прочим, не спросили, смогу ли я помочь им в создании игры, или же найти людей, которым это будет интересно. Сначала я не смог сказать ничего определенного, но пообещал, что подумаю и дам ответ в течение недели. Когда я рассказал об этом разговоре друзьям, они заинтересовались этим предложением, и было принято решение попробовать свои силы в этом деле.
С самого начала было принято решение, что это будет платформер, наподобие старого доброго Марио
, но со своими особенностями. Главным действующим персонажем должна была стать чайка, страдающая проблемами с лишним весом и соответственно не умеющая летать. Целью этого вечно голодающего животного будет охота
на булки – чайка должна поддерживать себя в форме и оставаться такой же круглой, не давая себе похудеть.
Конечно же у главного героя должны были быть враги – куда же без них? В нашем случае суровыми противниками животного, страдающего проблемами с лишним весом стали коварные крабы. У меня было желание ввести в игру енотов, но это предложение было безжалостно отвергнуто большинством. Ну, крабы так крабы – не суть. Эти звери хоть и не обладают возможностью дистанционной атаки, но способны нанести непоправимый ущерб самолюбию гордой птицы, если приблизятся слишком близко. Соответственно таких контактов чайке желательно избегать.
Но неужели бедная птичка будет полностью беззащитна против суровой клешни
противника? Конечно же нет! Съев определенное количество булок у птицы появляется очень полезная способность – она может ими плеваться. Крабы, не переносящие теста (от него слипаются клешни), в панике ретируются и чайка ликует!
Сначала мы хотели сделать бесконечный уровень на выживание с произвольной генерацией карты (набор определенного количества поверхностей, совмещаемых друг с другом плюс случайно генерируемые препятствия и монстры, но с учетом возможности прохода – чайка должна нормально проходить между препятствиями, что, в общем-то, могло вызывать некоторые трудности в виду комплекции этой птицы). Однако все те же дизайнеры настояли на создании карты и при желании дальнейшем разбиении игры на уровни. Конечно, поначалу мы постарались отстоять свою идею, но, как это часто бывает, женская настойчивость победила мужскую логику и мы согласились делать конечный уровень с заранее заданной картой.
Выбор средств реализации
После принятия решения о участии в создании игры, необходимо было выбрать средства реализации – для дизайнеров все было проще, они использовали программы, с которыми работали постоянно, велосипед
им изобретать не пришлось. Нам же предстоял выбор языка программирования, на котором создавалась бы игра.
Изначально выбор стоял между C++ и Java, как между языками, с которыми у нас был опыт работы. С плюсами его было больше, с Java – меньше, но общие представления о нем имелись.
Однако все изменил разговор с инициаторами идеи – все теми же киевскими дизайнерами. Они хотели, чтобы приложение было максимально кросплатформенным, а что может быть более кросплатформенным, чем приложение, работающее в браузере? От Java-апплета мы отказались, так как он мог работать не на всех устройствах. Было принято решение использовать HTML5+JavaScript, так как такие игры с большим или меньшим успехом переваривают
все современные браузеры, причем поддержка HTML5 постоянно улучшается, что не может не радовать.
От HTML5 нам необходим был Canvas для отрисовки на нем игрового процесса и CSS3 для красивого оформления деталей.
Вообще изначально был выбор – использовать Canvas или SVG, но в итоге весы склонились в сторону канваса. SVG используется для масштабируемой векторной графикой и имеет недостаток – довольно низкую скорость рендеринга при сложном рисунке (большое количество объектов DOM модели, что непременно присутствует в игре), Canvas в свою очередь отлично подходит для создания растровой графики и манипулирования изображениями на уровне пикселей. Кроме того, почитав руководства и рекомендации стало ясно, что для создания игровой графики лучше подходит Canvas.
Обзор фреймворков
Для отрисовки графики был выбран фреймворк Pixi.js. Он использует возможности WebGL для рендеринга 2D сцен, при том автору не приходится погружаться в подробности реализации. Данный движок поддерживает текстуры и спрайты, на спрайты можно повесить
обработчики событий, что облегчает разработку (без этого объекты под курсором необходимо было бы определять вручную по положению курсора и текущим координатам объекта).[1]
Для облегчения использования ОО подхода была использована библиотека MooTools, которая существенно облегчает создание и использование классов в приложении.
Реализация
Сначала мы думали использовать уже готовый физический движок например Box2D, но потом посовещавшись решили, что большинство функций данного движка будут не реализованы, а ресурсы потреблять им никто не запретит. Нам же необходима будет простая физика, для возвращения чайки на землю (как уже говорилось выше комплекция животного не позволяет ему летать, хотя поначалу благодаря нашим стараниям
животное могло улетать
в предметы, за пределы игрового пространства или даже погружаться под землю, но это было исправлено, все же главный герой у нас не крот). Физика подразумевает под собой симуляцию противодействующих сил гравитации, передвижения, прыжков и трения. Кроме силы притяжения физический движок определяет столкновения, что не позволяет коварной птице проникать внутрь препятствий и именно благодаря этому свойству снаряды
чайки могут достигать крабов, а те в свою очередь могут угрожать чайке (без столкновений чайка и краб попросту разминулись бы и игра была бы менее кровавой).
В результате гравитация тянет птичку вниз, но определение столкновения с полом не дает ей пройти сквозь него. Так же определение столкновений помогает запретить игроку совершать неправомерные действия – запускать нашу чайку в двойной прыжок. Если чайка не касается земли – игроку запрещаются прыжки. Это происходит, когда чайка спрыгнула с препятствия или же уже находится в состоянии прыжка.
В физическом движке используются следующие понятия:
- Скорость описывает, насколько быстро объект движется в определенном направлении.
- Ускорение описывает, как скорость и направление объекта изменяются со временем.
- Сила – это влияние, которое является причиной изменения в скорости или направлении.
В общем используется следующий алгоритм:
- Если чайка движется или прыгает, к ней применяется сила движения или прыжка, кроме того к ней применяется сила гравитации.
- Вычисляется полученная скорость чайки.
- Исходя из полученных данных обновляется позиция чайки.
- Происходит проверка столкновений.
- В зависимости от объектов, участвовавших в столкновении происходит событие – наносится урон чайке, наносится урон крабу, чайка сдвигается на расстояние от препятствия достаточное для того, чтобы столкновение больше не происходило.
Так как спрайты являются только графическим представлением игровых объектов, каждый объект будет описываться прямоугольником, по которому и будут определяться столкновения. Карта же описывается набором прямоугольников (препятствий), имеющими свои координаты, на эти прямоугольники накладываются графические изображения (земля, вода, трава и т.д.).
Литература: