Avoider

Материал из wiki.appsalutecreator.com
Версия от 08:28, 9 февраля 2017; Denisov (обсуждение | вклад) (Пример реализации:)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Avoider - встроенный объект редактора, который реализует механику бесконечного движения персонажа по нескольким полосам дороги, избегающего препятствий на своём пути.

Основные параметры

Размер - обязательный параметр высоты и ширины объекта

  • w (w) - ширина в px
  • h (h) - высота в px

Длина свайпа (swipe_length) - на сколько пикселов следует перетянуть указатель мыши (или палец на сенсорном экране), чтобы персонаж переместился на соседнюю полосу. Свайп срабатывает в любом месте экрана.

Персонаж (personage) - машина состояний, представляющая персонаж. Выбирается из списка объектов.

Расстояние между объектами на полосе (track_rows_distance) - расстояние в пикселах между соседними полосами.

Базовая скорость (base_speed) - скорость в px/sec движения всех объектов относительно персонажа.

Скорость перемещения между полосами (personage_speed) - скорость перемещения персонажа в px/sec между соседними полосами.

Флаер столкновения с препятствием (explosion_object) - флаер, запускаемый при столкновении с препятствием.

Имя состояния запуска взрыва (explosion_start_state) - состояние, передаваемое флаеру при столкновении с препятствием, beg по умолчанию.

Имя состояния остановки взрыва (explosion_stop_state) - состояние, передаваемое флаеру для его остановки, end по умолчанию.

Продолжительность взрыва (explosion_time) - продолжительность взрыва в ms.

Время пропадания объекта по альфе (fading_time) - время пропадания объекта с полосы по альфе от 1 до 0, в ms.

Добавляемые параметры

Полоса (stripe) - полоса, на которой может располагаться персонаж. Вдоль полосы также движутся объекты на встречу персонажу. В ней необходимо указать координаты самой полосы и персонажа на ней, отсчет координат от левого верхнего угла, единицы измерения - проценты.

  • координата Х начала полосы (start_x) - координата Х начала полосы (задается в % от левой границы эвойдера)
  • координата Y начала полосы (start_y) - координата Y начала полосы (задается в % от верхней границы эвойдера)
  • координата Х конца полосы (end_x) - координата Х конца полосы (задается в % от левой границы эвойдера)
  • координата Y конца полосы (end_y) - координата Y конца полосы (задается в % от верхней границы эвойдера)
  • графика персонажа (personage_image) - графический ресурс персонажа, перетаскивается мышкой из базы ресурсов. Не требуется заполнять, если указан персонаж в основных параметрах. Графику персонажа для разных полос можно указывать разной.
  • положение персонажа на полосе (personage_position) - задается в % длины полосы от верхней ее точки

Объект:препятствие (track_object_obstacle) - препятствие,

  • Идентификатор (obj_id) - уникальная строка, которой будет задаваться данный объект в файле уровней (например, “*” или “obstacle_1”).
  • Графика (image) - ссылка на изображение из ресурсов для данного объекта.

Объект: монета (track_object_coin)

  • Идентификатор (obj_id) - уникальная строка, которой будет задаваться данный объект в файле уровней (например, “coin_1”).
  • Графика (image) - ссылка на изображение из ресурсов для данного объекта.

Объект: изменение скорости (track_object_change_speed)

  • Идентификатор (obj_id) - уникальная строка, которой будет задаваться данный объект в файле уровней (например, “speed_up_1”).
  • Графика (image) - ссылка на изображение из ресурсов для данного объекта.
  • На сколько процентов изменить скорость (factor) - задает, на сколько процентов изменяется скорость относительно начальной. В качестве начальной скорости используется базовая скорость текущего уровня, если задано абсолютное изменение скорости, либо текущая скорость, если задано относительно изменение скорости.
  • Тип изменения (absolute) - задает, будет ли применено абсолютное или относительное изменение скорости.
  • Время, на которое применяется изменение (apply_time) - время в миллисекундах, по истечении которого будет возвращена предыдущая скорость. Если выставлено значение “-1”, то изменение применяется навсегда.

Объект: неуязвимость (track_object_invulnerability)

  • Идентификатор (obj_id) - уникальная строка, которой будет задаваться данный объект в файле уровней (например, “invulnerability_1”).
  • Графика (image) - ссылка на изображение из ресурсов для данного объекта.
  • Время, на которое применяется изменение (apply_time) - время в миллисекундах, на которое объект приобретает неуязвимость. Если выставлено значение “-1”, то изменение применяется навсегда.

Слушатель расстояния (progress_listeners)

  • Объект слушателя (obj) - ссылка на объект слушателя.
  • Состояние (row_passed_state_name) - имя состояния объекта слушателя, которое вызывается, когда персонаж проходит очередную строку объектов.

Слушатель времени (time_listeners)

  • Объект слушателя (obj) - ссылка на объект слушателя.
  • Состояние (seconds_elapsed_state_name) - имя состояния объекта слушателя, которое вызывается, когда проходит каждая следующая секунда.

Слушатель препятствий (obstacle_listeners)

  • Объект слушателя (obj) - ссылка на объект слушателя.
  • Состояние (met_obstacle_state_name) - имя состояния объекта слушателя, которое вызывается, когда персонаж сталкивается с препятствием.

Слушатель изменения скорости (change_speed_listeners)

  • Объект слушателя (obj) - ссылка на объект слушателя.
  • Состояние (change_speed_state_name) -- имя состояния объекта слушателя, которое вызывается, когда любым способом изменяется скорость движения (то ли за счет перехода на следующий уровень, то ли за счет пойманного бонуса скорости).
  • Параметр (new_speed_parameter_name) - имя параметра объекта слушателя, в который записывается новое значение скорости.

Слушатель монет (coin_listeners)

  • Объект слушателя (obj) - ссылка на объект слушателя.
  • Состояние (met_coin_state_name) - имя состояния объекта слушателя, которое вызывается, когда персонаж подбирает монету.

Слушатель неуязвимости (invulnerability_listeners)

  • Объект слушателя (obj) - ссылка на объект слушателя.
  • Состояние (met_invulnerability_state_name) - имя состояния объекта слушателя, которое вызывается, когда персонаж ловит неуязвимость.

Слушатель потери неуязвимости (lost_invulnerability_listeners)

  • Объект слушателя (obj) - ссылка на объект слушателя.
  • Состояние (lost_invulnerability_state_name) - имя состояния объекта слушателя, которое вызывается, когда персонаж теряет неуязвимость.

Слушатель конца игры (game_over_listeners)

  • Объект слушателя (obj) - ссылка на объект слушателя.
  • Состояние (game_over_state_name) - имя состояния объекта слушателя, которое вызывается, когда персонаж сталкивается с препятствием, и игра заканчивается.

Звуки (sounds) - указывается id звукового файла в базе ресурсов

  • Столкновение с препятствием (obstacle_sound) - звук, который проигрывается, когда персонаж сталкивается с препятствием.
  • Смена полосы (change_stripe_sound) - звук, который проигрывается, когда персонаж переезжает с одной полосы на другую.
  • Собирание монеты (coin_sound) - звук, который проигрывается, когда персонаж подбирает монету.
  • Изменение скорости (change_speed_sound) - звук, который проигрывается, когда изменяется скорость.
  • Неуязвимость (invulnerability_sound) - звук, который проигрывается, когда персонаж приобретает неуязвимость.
  • Потеря неуязвимости (lost_invulnerability_sound) - звук, который проигрывается, когда персонаж теряет неуязвимость.
  • Конец игры (gameover_sound) - звук, который проигрывается, когда персонаж сталкивается с препятствием, и игра прекращается.
  • Изменение уровня (change_level_sound) - звук, который проигрывается, когда игра переходит на следующий уровень.

Пример реализации:

Пример реализации эвойдера

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

Базовая скорость движения объектов эвойдера и объектов фона должна совпадать. Также стоит позаботится об изменении скорости объектов фона, когда персонаж наезжает на объект:ускорение и возврат ее в начальное значение.

Расположение препятствий,монет, объектов для ускорения и неуязвимости задается в файле уровней levels.xml, который необходимо разместить в папке, где находится редактор.

Файл уровней
Идентификаторы в настройках эвойдера

Пример заполненного файла уровней изображен на скрине. Корневым тегом является <levels></levels> внутри которого может находится несколько пар тегов для каждого уровня <level></level>, имеющих уникальный id.

Чтобы создать разнообразие появления объектов, они группируются внутри тегов <track></track>, у которого есть атрибут weight (вес). Треков внутри уровня может быть любое количество. Значение атрибута weight определяет вероятность появления определенного трека. То есть, если значения веса у всех треков одинаковы, то и вероятность равна, а если есть три трека, у одного weight=2, а у остальных weight=1, то вероятность появления треков 50%, 25% и 25% соответственно.

Объекты эвойдера обладают полем “идентификатор”, где необходимо указать уникальный символ или слово. Далее именно этот идентификатор вносится в levels.xml. Вертикальные полосы на дороге отделяются просто запятыми, а горизонтальные - переносом строки. На рисунке изображен avoider с 3-мя полосами движения. Если какая-то часть полосы пустая, то в этом месте указывается “0” (ноль).

Описание создания бесконечных объектов

В играх различного типа часто востребованы объекты, бесконечно появляющиеся на экране и совершающие движение за его пределы. Среди них:

  • облака,
  • птицы,
  • автомобили, корабли, самолёты,
  • бесконечные препятствия.

Все объекты можно разделить на две группы: фоновые и интерактивные. С фоновыми взаимодействие не требуется, они лишь создают видимость, что изображение на экране не статично. Также их можно использовать для эффекта перспективы, о чем будет сказано ниже.

Фоновые объекты обычно создают в виде анимации или видеороликов. Вариант позволяет ограничиться лишь одним объектом, однако отбирает довольно много памяти. Поэтому такой метод наименее эффективный. Тем более, он обладает минимальной гибкостью.

Еще один способ - воспользоваться флаером (патиклом). Этот способ имеет свои особенности. Допустим, что необходимо разместить пару облаков на сцене, часть которых там будет видно пользователю изначально, а часть появится позже. Очевидно, что облака не могут появляться не понятно от куда, они должны или там быть сразу или влетать из-за границы сцены.

Флаер, создающий облака не сразу, должен находится за границей сцены. Но тогда он не сможет создать облака при входе в игру, он лишь сможет создать облака, которые через какое-то время окажутся в видимой части. Поэтому для первоначально видимых облаков нужен дополнительный флаер (или несколько). Для него потребуется дополнительная машинка, которая через время после запуска игры, когда облако покинет пределы сцены, один раз сместит флаер за сцену. Все новые облака будут создаваться за пределами сцены. Либо этому флаеру будет присвоено состояние “end”.

Настройки флаера

Для флаера потребуются особые настройки, один из примеров изображен на рисунке. Здесь показаны настройки генератора облаков, движущихся вправо, сам флаер находит слева за пределами видимого экрана:

  • указана вертикальная область рождения. Облака генерируются на разной высоте.
  • указан одинаковый угол “от” и “до”, его значение определяет направление движения облаков.
  • общее количество и каскады в значении “-1” означают бесконечность циклов создания.
  • интенсивность определяет разницу появления облаков по времени, исключает случай их одновременной генерации. Т.е. здесь новое облако появится только через 6 секунд после предыдущего. Важно, что самое первое облако появится через это же время после начала игры. Время жизни и скорость важна, так как определяют успеет ли облако покинуть видимый экран до того, как перестанет существовать


Интерактивные объекты предполагают взаимодействие с ними. Поэтому для их создания, в зависимости от потребности, можно использовать физические объекты или машины состояний. Рассмотрим их создание на примере машинок.


На скрине показана минимальная настройка бесконечного объекта, реализованного на машине состояний. И для фоновых и для интерактивных объектов эта схема общая

Настройки машины состояний бесконечного объекта

Состояние init устанавливается опционально. Оно требуется, если движение будет начато не сразу, там можно установить начальное положение объекта и другие его параметры. Если решено init не использовать, то первым состоянием ставим move.

После перехода в move объект зацикливает свои состояния между move и init_1. В команде move следует указывать значение скорости (v), а не времени (t) за которое объект должен переместиться. Это необходимо для равномерности движения. Поскольку положение в init и init_1 обычно различается, то при установке параметра t в команде move объект будет за одинаковое время преодолевать различное расстояние, а значит и с разной скоростью.

Также надо указать конечную координату tx, а не просто смещение dx все для той же равномерности движения.

Внутри move устанавливаем переход в init_1 по достижению конечного положения tx. В init_1 объект инициализируется в точке за пределами видимого пользователю экрана. Где именно будет эта точка зависит от размера объекта и сцены. И сразу переходим в move для запуска движения.

То есть общая схема действий такая:

  • 1) объект перемещается, покидая экран
  • 2) покинув пределы экрана, помещаем объект с другой его стороны
  • 3) возврат в пункт 1)


Создав основу для бесконечного движения, можно добавить остальные команды и состояния. Например, у нас есть игровой объект, который пытается избегать препятствия на своем пути. Эти препятствия создаются, как бесконечные объекты. Столкновения отлавливаются командой apply, которую можно поместить либо внутрь игрового объекта, либо внутрь бесконечных объектов. Тогда в каждом объекте необходимо будет создать состояние apply, куда поместить необходимые команды.

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

Создание эффекта перспективы

создание эффекта перспектывы

Довольно простой эффект, основанный на том, что одни объекты фона движутся медленно, а объекты, которые накладываются сверху - быстрее.

Например, на фоне расположено изображение города из зданий разной высоты, а мы совершаем движение слева-направо или наоборот. Тогда здания, которые находятся на переднем плане, стоит двигать быстро, а здания заднего плана - медленней.

Дополнительно усилить эффект перспективы можно за счет правильно подобранной графики: условно ближние объекты рисуются детально, а объекты заднего плана однотонными или с минимумом деталей. Пример изображен на рисунке, где есть тусклые кусты и пальмы, почти сливающиеся с фоном. Их скорость минимальна. Пальмы переднего плана более выражены, их скорость больше. При каждом прыжке персонажа пальмы переднего плана смещаются со скоростью 70px/sec, а на заднем плане - лишь 30px/sec.