Продолжая первую часть статьи о создании реплики Angry Birds с попутным разъяснением всего подряд, настало время реализовывать самое сложное : механики. Ну и строить уровни, но здесь дело фантазии да и только.
Стрельба из рогатки
Самая важная и интересная часть игры очевидно. Я попробую без скучного занудства объяснить как же стреляет рогатка.
И так, что же тут написано?
Проверки и действия происходят каждый кадр.
Если нажата левая кнопка мыши, то :
Отслеживаем положение курсора мыши на экране, приобразуя экранные координаты в мировые (внутри игры непосредственно).
Вычисляем вектор смещения от изначальной позиции в рогатке.
Задаем новую позицию птичке, которая равна стартовой позиции + ограниченный до единицы вектор, не дающий птичке летать по всей карте за курсором, а оставляющий её в районе рогатки, как бы натягивая :
Второй кусок кода повествует о непосредственно катапультировании птички :
Тут написано :
Если левая кнопка мыши отпускается, то :
Вычисляем вектор дистанции между птичкой и стартовой позицией (его можно использовать для регулирования силы : натягиваем слабо - стреляет слабо и наоборот)
Активируем динамичный тип поведения твердого тела. Изначально он был кинематичным (воздействие только через скрипт), чтобы не падал вниз во время натяжения.
"Подталкиваем" его в направлении вектора, который равен = стартовая позиция в рогатке минус настоящее положение птички, умножаем на 700.
Эту цифру я взял в ходе экспериментов, протыкивая различные значения я пришел к приемлимой цифре в 700.
Свинья и капля интерфейса
Настало время научить эту свинью сдаваться, а нам предоставлять проход на следующие уровни в случае победы.
Я создал две кнопки, задачу которых вы уже поняли, какой у нас уровень и конечно название своего канала с лого Дзена :)
Кнопки будут высвечиваться в случае устранения свиньи.
Я задал переменную здоровья равную пяти, обозначил компонент твердого тела и дал понять где находятся высвечивающиеся в конце кнопки.
Так же каждый кадр проверяется здоровье. Если его значение окажется меньше или равно нулю, то свинья уничтожится, кнопки покажутся.
Здесь я определил в каких случаях здоровье будет уменьшаться.
При столкновении с другим телом : спросить скорость этого тела и вычесть эту величину из здоровья. Таким образом падающий блок или летящая птица навредит свинье.
Так же если свинья летит сама и её скорость при столкновении с чем-либо выше условной единицы, то из здоровья вычитается половина значения скорости. Так можно убиться от падения или отскока в препятствие.
Пробуем :
Справедливости ради я задействую в одном из следующих уровней каменный блок и валун. Если у досок масса 1, то камню я задал массу 15, чтобы он обладал внушительной останавливающей силой :
Очевидно это заставляет игрока искать более хитрые решения :
На создание этой поделки я потратил 4 часа. Как видите достаточно простые идеи сейчас так же просто реализовать благодаря встроенным инструментам движка и горстке знаний.