В прошлый раз мы рассмотрели механику движения в нашей 3D-игре на движке Godot Engine. В этой статье мы погрузимся в две механики: скорость и выносливость, а так же создадим дочерний скрипт.
Для начала добавим клавишу для бега в Input Map, следуя привычным нам действиям:
Теперь переходим к объявлению и инициализации переменных isRunning, isMoving и run_speed. Первые две переменные помогут нам избежать различных багов:
Наконец переходим к объявлению функции run(), где будет вся основная логика нашей механики, и изменению функции move:
- Мы присваиваем значение true переменной isMoving, когда персонаж движется, чтобы предотвратить возможность бега на месте.
- Затем проверяем, бежит ли игрок, и если нет, устанавливаем скорость на walk_speed.
- В функции run() мы проверяем, нажата ли наша клавиша (в моём случае, shift) и движется ли игрок. Если оба условия выполняются, устанавливаем значение isRunning в true
- Если одно из условий не выполняются, то устанавливаем значение на false
- Если значение isRunning true, то мы плавно изменяем скорость на run_speed.
Но зачем нам 2 условия? Разве нельзя написать всё в одном? Использование двух условий обеспечивает гибкий доступ к механике бега. Например, мы можем запретить игроку бегать даже тогда, когда клавиша бега зажата и игрок движется.
Однако, непрерывный бег - не самая лучшая идея. Именно здесь в игру вступает механика выносливости. Давайте создадим дочерний скрипт, который будет отвечать за управление нашей выносливостью.
Отлично. В новом скрипте нам необходимо объявить переменную stamina, а также функцию stamina_change с аргументом stamina_new и coef(coefficient):
Для чего нам нужно явно преобразовывать значения во float? Я сталкивался с ошибками, связанными с типами переменных. Чтобы избежать их, мы будем проводить явное преобразование во float. Вот так может выглядеть подобная ошибка:
Теперь, чтобы вызывать функции и управлять значениями из дочернего скрипта, сначала мы должны создать переменную для него в главном скрипте:
Вернёмся к нашей функции run() и проведём там следующие изменения:
Вот что мы сделали:
- Добавили условие, чтобы минимальное значение стамины было строго больше 5.
- Реализовали плавное уменьшение стамины.
- Внедрили плавное восстановление стамины.
Однако, при проведении тестов вы можете столкнуться с ошибкой: ваша выносливость будет тратиться ниже 5 и моментально восстанавливаться до значения выше 5, что приведет к бесконечному бегу. Вот какой я нашёл способ решения:
- Мы добавили переменную canrun с логическим типом данных в условие.
- Если одно из условий ложное (например, стамина меньше 5), то выполняется ветвь else.
- В этой ветви мы проверяем значение стамины, и если оно меньше или равно 15, то запрещаем нашему игроку бежать, в ином случае разрешаем.
Вот и все! Вы также можете рассмотреть добавление уменьшения стамины при прыжке, но у меня отсутствует данная механика. В следующей статье мы рассмотрим не менее важные вещи - приседание (crouch), а так же возможные баги с коллизией. Удачи в разработке!