Дневник разработки S.L. #3
В третьей части летописи о создании игры про сражения я поведаю о системе захвата цели, боевом перемещении при её наличии и скажу пару слов о реализации поведения камеры. Постараюсь показывать меньше кода и больше иллюстраций.
Игра по прежнему выглядит сырой, но я не считаю нужным добавлять контент пока не реализованы самые главные механики. О его создании и истории я начну писать примерно через 3-5 частей дневника.
Сразу покажу финальный результат, опишу свое видение и разберу как все работает :
Мое видение
Практически каждая игра, посвященная сражениям, имеет таргет систему в каком-либо её проявлении. Исключением может является лишь hack'n'slash, как например старые God Of War, Devil May Cry, где игроку предстоит сражаться с большим количеством врагов.
Серия Dark Souls, новый God Of War и последние 2 части Ведьмака имеют ориентированность механик на таргетинг.
В Темных Душах всё напоказ: нажимаете кнопку и глядите только на врага, в Боге войны ваши атаки намагничиваются к врагам и глядя на него для алгоритмов в коде, враг - ваша цель.
В Ведьмаке систему таргета как таковую распознать невозможно. Геральт прыгает меж врагов и ловко попадает в цель без особых усилий, это заслуга сильного намагничивания, какое есть в последнем Spider Man и серии Batman Arkham.
Таргет система
Получилась у меня весьма кривой и проблемной, требует доработок для четкости отклика, однако работает и сейчас. Громоздкий кривой код я показывать не буду, покажу принцип действия :
При нажатии определенной кнопки (Tab например), вокруг персонажа методом увеличения невидимой сферы-триггера сканируется область. Для удобства и оптимизации сканирует только определенный слой Enemy, такую метку слоя я буду ставить врагам, а пока что это 2 прямоугольника.
После сканирования высчитывает расстояние до каждого из объектов и выбирает тот, с которым меньшая дистанция, при повторном нажатии в цель берется следующий объект из списка.
Сам PNG-файл прицела прилипает к цели, однако остается частью интерфейса и вместе с подопечным может уйти за границы экрана, всё потому что мировые координаты (вектор) преобразуются в экранные (пиксели). Так же из-за изначального белого цвета прицела, его можно менять на любой, либо в настройках, либо я что-нибудь интересное придумаю.
Передвижение
О создании обычного передвижения я писал в прошлой статье, боевое передвижения отличается визуально(огромная заслуга анимаций) и по поведению.
Начнем с того, что когда цель у персонажа имеется, он смотрит на неё.
Голова всегда нацелена на врага вне зависимости от анимаций, здесь я воспользовался процедурной генерацией (инверсной кинематикой) о которой писал в одной и прошлых статей (ссылку оставлю в конце), телом же направлен вперед он кодом :
Вычислил вектор направления, пока что убрал из этого вектора перепады высот и заставил плавно глядеть на врага. Благодаря этому методу, для объекта персонажа вектор направления вперед - теперь всегда в стороне врага что будет важно для боевой системы.
Так же я трансформировал вектор ввода, теперь персонаж может двигаться вокруг врага как бы по кругу и посылает в систему анимаций правильные данные. Системой анимаций я уже горжусь, 4 анимации плавно смешиваются в зависимости от направления движения относительно врага. Пожалуй они будут темой следующей части дневника.
Так же нажав на кнопку спринта (ну Shift например) персонаж ускорится, но бегать во все стороны он одинаково быстро не сможет.
Получив модульные значения прошедшего 5 операций вектора ввода я сделал скорость зависимой от него и теперь если персонаж бежит в сторону то его скорость уменьшается, в зависимости от того на сколько он бежит в сторону. Так же чуть меньше замедляется при беге назад и увеличивается при беге вперед.
Немного о работе с камерой
Пока что прилепил базовые функции как отдаление/приближение и фиксацию. К этому всему нужно будет делать систему избегания столкновений, чтобы камера не провалилась в стены будущей арены.
В этот раз я попытался не перегружать кучей кода и лишь объяснил поведение и работу механик. Код сильно усложнился и увеличился, показывать его отдельные части отныне не имеет много смысла, будут в основном гифки.