Проблема
Прыжки в вашей платформере кажутся «неестественными». Игроки не могут хорошо контролировать персонажа и иногда они «не попадают» при прыжке с края платформ.
Решение
Ответ на эту проблему — использование в Godot техники, называемой «временем койота» («coyote time«). Это придает игроку больше ощущения контроля и небольшой «запас» времени при прыжке с края платформ.
«Время койота» работает следующим образом:
Если игрок идет с края платформы, то в течение нескольких кадров после этого мы все равно позволяем им прыгать, как если бы они все еще стояли на земле.
Происхождение Название «время койота» («coyote time«) происходит от знаменитого мультяшного койота, который не падал, пока не смотрел вниз:
Мы собираемся добавить это к уже существующему персонажу платформера. Смотрите рецепт для создания платформерного персонажа (рецепт опубликован ранее), чтобы узнать, как это сделать.
Чтобы управлять временем, мы добавим узел таймера с именем CoyoteTimer и установим его на однократный запуск.
Также нам понадобится несколько новых переменных, чтобы отслеживать время койота:
var coyote_frames = 6 # How many in-air frames to allow jumping
var coyote = false # Track whether we're in coyote time or not
var last_floor = false # Last frame's on-floor state
Поскольку мы используем кадры для установки длительности, мы можем перевести это во временные единицы при установке длительности таймера в _ready():
$CoyoteTimer.wait_time = coyote_frames / 60.0
На каждом кадре мы будем сохранять текущее значение is_on_floor(), чтобы использовать его на следующем кадре. Поместите это в _physics_process() после move_and_slide():
last_floor = is_on_floor()
Когда мы обнаруживаем ввод прыжка, нам нужно проверить, находится ли персонаж на земле или в состоянии «времени койота»:
if Input.is_action_just_pressed("jump") and (is_on_floor() or coyote):
velocity.y = jump_speed
jumping = true
Время койота начинается, если игрок уходит с края платформы. Это означает, что персонаж больше не находится на земле, но был на земле на предыдущем кадре. Мы можем проверить это и запустить таймер, если мы только что перешли с состояния «на земле» на «в воздухе»:
if !is_on_floor() and last_floor and !jumping:
coyote = true
$CoyoteTimer.start()
CoyoteTimer сообщает нам, когда заканчивается состояние «койота»:
func _on_coyote_timer_timeout():
coyote = false
Вы можете применить тот же процесс к 3D персонажам.
Скачайте этот проект
Скачайте код проекта здесь: https://github.com/godotrecipes/2d_moving_platforms