Проблема
Прыжки в вашей платформере кажутся «неестественными». Игроки не могут хорошо контролировать персонажа и иногда они «не попадают» при прыжке с края платформ.
Решение
Ответ на эту проблему — использование в Godot техники, называемой «временем койота» («coyote time«). Это придает игроку больше ощущения контроля и небольшой «запас» времени при прыжке с края платформ.
«Время койота» работает следующим образом:
Если игрок идет с края платформы, то в течение нескольких кадров после этого мы все равно позволяем им прыгать, как если бы они все еще стояли на земле.
Происхождение Название «время койота» («coyote time«) происходит от знаменитого мультяшного койота, который не падал, пока не смотрел вниз:


Мы собираемся добавить это к уже существующему персонажу платформера. Смотрите рецепт для создания платформерного персонажа (рецепт опубликован ранее), чтобы узнать, как это сделать.
Чтобы управлять временем, мы добавим узел таймера с именем CoyoteTimer и установим его на однократный запуск.
Проверь свои знания в нашем бесплатном ТЕСТЕ по Godot! Узнай, насколько хорошо ты его знаешь!
Также нам понадобится несколько новых переменных, чтобы отслеживать время койота:
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
