Прыжки в ручную и передвижение объекта по заранее определенной трaектории
Предположим у нас есть маленький синий человечик,
и мы хотим чтобы он бегал по заснеженному рельефу и перепрыгивал через небольшие пропасти.
Для этого первым делом надо создать вышеупомянутый рельеф и самого человечека, который умеет бегать и прыгать.
Создаем рельеф из двух спрайтов ground и hill ( можно было использовать один, но так удобней настраивать). Так как человечек должен уметь бегать и прыгать, нарисуем соответствующие анимации. Рельеф поместим вручную в комнате (room), а человечека пусть создает контроллер "gameController" помещеный в этой комнате.
ПРЫЖОК(JUMP):
Анимация:
Для бега используем обычную анимацию из 3 кадров, а вот с прыжком чуть сложнее.
Прыжок можно разделить на 3 фазы: толчок, полет и приземление - "start_jump", "jump" и "finish_jump" соответственно.
Можно конечно использовать механизм обычной анимации когда кадры сменяют друг друга через равный интервал, но в прыжке у каждой фазы своя продолжительность (200ms, 900ms и 300ms), тогда анимация прыжка будет содержать 14 кадров, с интервалом по 100ms (2 х start_jump, 9 x jump, 3 x finish_jump). Но можно это сделать иначе, кому как удобней.
Тут это сделанно следующим образом:
По окончании каждой анимации (если была отмеченна птичка "Run Once"), вызывается "Animation Ended" event, в котором переключaeмся на другую анимацию (в данном случае меняем фазу прыжка)
Это то, что касается визуальной стороны дела.
Логика
В данном примере задуманно чтобы человечeк "подпрыгнул" и приземлился на той же высоте с которой начал прыжок. Для этого в начале прыжка ("StartJump" custom event) переменная startJumpYPos получает значение начальной высоты прыжка. Теперь когда человечeк вновь будет на этой высоте сработает условие окончания прыжка:
Сам прыжок совершается функцией "StartJump" которая задает начальную скорость в направлении прыжка и отрицательнное ускорение вниз и назад (гравитация + спротивление воздуха). По окончании прыжка, человечек продолжает бежать в том же направлении, что и до прыжка.
В данном примере есть 2 прыжка. Первый происходит когда срабатывает условие:
self.XPos >= FIRST_JUMP_X && self.XSpeed > 0
А второй сразу после прохoждения Path_1 (заранее заготовленой траектории):
self.onPath == 1 && self.PosInPath == -1
MOVE IN PATH (движение по заранее заготовленной траектории)
Для передвижения по path, надо его сначала создать. Открываем Room и выбираем инструмент рисования траекторий
Рисуем path повторяющий рельеф холма и даем ему имя Path_1
(при малом расстоянии между точками стрелки не отображаются)
Подобным образом создаем второй path по дну оврага, и получает имя Path_2.
Теперь у нас есть две траектории (path). Для того чтобы человечeк начал двигаться по заданной траектории, нам надо знать когда он находится в подходящем для этого месте.
Существует много способов, воспользуемся следующим: Создается объект checkpoint. На канвасе (canvas) рисуется небольшой прямоугольник с прозрачным контуром. Поместим этот объект в место желаемого начала движения по траектории. Теперь у человечека (man) создается Collision event с этим объектом checkpoint_1. (Важно установить уровень точности на Bounding Box)
Для того чтобы checkpoint не был виден во время игры. В его "Create" event-е вызываем "Change Background Color", и делаем его прозрачным
Когда объект заканчивает движение по траектории его параметр PosInPath получает значение "-1", создаем Condition Event который сообщит нам (как только, так сразу) что перемещение по траектории окончилось.
self.onPath == 1 && self.PosInPath == -1
Переменную onPath используем для того, чтобы знать по какой траектроии движется объект, в данном случае по первой или по второй.
Спасибо Games Developer Mo'Minis за предоставленный урок.