Gaminator 11 :: Rock the Rocket :: Реализация

Всем привет! Работа над игрой не прекращается и, чтобы дать о себе знать, мы решили опубликовать пост, посвящённый внутренней части игры. Так сказать, со стороны разработчиков, а не игроков.

Дисклеймер: кода здесь нет. Только идеи реализации. Таким образом те, кто не успевает что-то сделать, смогут создать собственные реализации наших идей для своих игр, но возможности просто скопипастить (а у нас — в прямом смысле помочь другим участникам) не будет.

[Внимание, отношение картинки/текст крайне мало.]

0. Меню.

Основные элементы меню — это разделы и пункты. Каждый раздел может содержать несколько пунктов, между которыми можно переключаться. При нажатии кнопки выбора, происходит какое-либо действие (например, переход к другому разделу).

Чтобы реализовать простое и удобное во встраивании меню (то есть его не нужно будет воссоздавать по частичкам каждый раз [ну, в GM, например, будет неудобно строить меню из объектов потому, что придётся их расставлять снова и снова каждый раз, когда оно понадобится]), мы заведём две числовые переменные: одна указывает на текущий раздел, другая — на выбранный пункт меню.

Хотя код может показаться несколько громоздким засчёт того, что нужно прописывать действие для каждого значения этих переменных, меню будет легко встраивать там, где это необходимо. Можно, кстати, несколько упростить код, если завести двумерный массив (первое измерение — раздел, второе — пункт меню), в котором будут храниться названия пунктов меню в разделах, и отрисовывать эти пункты циклом.
[Если у вас есть возможность хранить ссылки на функции, то вы можете завести ещё и массив для них, чтобы реализовать и выбор пункта циклом, но в нашем случае такой возможности нет, да и кода в пунктах меню очень мало, так что это даже не нужно.]

1. Камера.

Нам требовалась динамическая камера, которая не просто будет следить за ракетой, но и реагировать на скорость и направление движения.

Суть, в принципе, проста: плавно переходим от текущей точки к точке, в которую, по расчётам, необходимо поместить камеру. При расчётах нужно учесть текущую и максимальную скорости, чтобы получить плавное удаление камеры под максимум и приближение во время торможения/медленного движения. Точно так же делается с координатами, для которых просматривается скорость по каждой оси в отдельности, чтобы сместить центр камеры так, что ракета находится у границы — тогда игроку видно, что находится по направлению его движения.

2. Спавн врагов.

Мы решили, что врагов в игре должно быть много. Для этого мы расставили по всему уровню множество точек, в которых могут спавниться различные враги. Но, чтобы игрок не замечал появление врагов из неоткуда, мы завели контроллер, который следит за порядком на уровне.

Так, он поддерживает постоянное количество врагов, но не превышающее максимального значения, чтобы игрок не утонул в волнах наступающих врагов. Он постоянно обходит все точки спавна, кроме тех, что находятся в отображаемой области экрана. Если эти точки находятся недалеко от границ отображаемой области, то в них можно создать нового врага.

Созданные враги стремятся добраться до игрока. При этом враги, которые ушли за пределы экрана, уничтожаются как ненужные (но враги, заметившие игрока, исчезают только когда игрок оторвётся от них на достаточно большое расстояние).

3. Заставки.

(Ну, это несложно, но довольно полезно, так что я решил их тоже упомянуть.)

Очевидно, тут много чего можно придумать, но и здесь нам потребовалось простое и удобное решение (т. к. заставки являются [в нашем случае] частью меню).
Заставки будут не одной огромной анимацией из 200−300 кадров, а займут всего два кадра (по одному на логотип).

Мы используем счётчик, указывающий на текущий кадр «анимации». Допустим, с 0 до 30 у нас плавное появление логотипа, потом — отображение в течение 60 кадров и следующее за ним плавное исчезновение за 30 кадров.

Нужно всего лишь отрисовывать спрайт с определённой прозрачностью в зависимости от значения переменной. Так, до 31-го кадра мы отрисовываем спрайт с прозрачностью (counter/30), с 31 до 91 — 1, а после — (120-counter)/30.

Понятно, что сделать другие эффекты тоже не составит труда — вы программируете анимацию, ориентируясь на номер текущего кадра, то есть используете значения счётчика в проверках или в небольших формулках.
Так, min (counter*4,200) будет выдавать вам значения от 0 до 200 с шагом 4 и, если использовать это как значение по оси X, то можно переместить что-либо с позиции 0 до позиции 200 со скоростью 4 пикселя за кадр, т. е. за 50 кадров.


Буду рад услышать от вас комментарии и ответить на интересующие вопросы.

P. S. Для докрутивших:

[Хотя это просто фан-арт.]

  • Tkachov
  • 07 декабря 2012, 19:16
  • 0