You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Godot 2D平台游戏中无法实现Coyote Time功能求助

Godot 2D平台游戏Coyote Time修复及代码优化

核心问题:Coyote Time未生效的原因

你的代码里Coyote Time逻辑存在几个关键错误:

  • was_on_floor仅在变量定义时赋值一次,不会随帧更新,导致永远无法触发离开地面后的判断
  • 计时器启动时机错误:应该在角色刚离开地面时启动,而不是在按下跳跃键时才启动
  • 重复叠加重力:代码中两次执行motion.y += GRAVITY,导致重力翻倍,角色下落过快
  • 条件分支逻辑混乱,空中动画的设置被错误的else分支覆盖

修复后的完整代码

extends KinematicBody2D

const UP = Vector2(0,-1)
const GRAVITY = 9
const SPEED = 150
const JUMP_HEIGHT = -400
const COYOTE_DURATION = 0.15  # 调整这个值控制 Coyote Time 时长,0.15秒比较合理

var motion = Vector2()
var coyote_timer: Timer
var is_jumping = false
var was_on_floor = false  # 初始化为false,后续每帧更新

func _ready():
    # 初始化计时器
    coyote_timer = Timer.new()
    coyote_timer.one_shot = true
    coyote_timer.wait_time = COYOTE_DURATION
    add_child(coyote_timer)
    $AnimationTree.active = true

func _physics_process(delta):
    # 更新上一帧的地面状态
    was_on_floor = is_on_floor()

    # 应用重力(只加一次)
    motion.y += GRAVITY

    # 水平移动逻辑
    if Input.is_action_pressed("move_right"):
        motion.x = SPEED
        $Sprite.flip_h = false
        $AnimationTree.set("parameters/state/current", 1)
    elif Input.is_action_pressed("move_left"):
        motion.x = -SPEED
        $Sprite.flip_h = true
        $AnimationTree.set("parameters/state/current", 1)
    else:
        motion.x = 0
        $AnimationTree.set("parameters/state/current", 0)

    # Coyote Time 核心逻辑
    # 当角色刚离开地面时启动计时器
    if was_on_floor and not is_on_floor():
        coyote_timer.start()
    
    # 跳跃判断:落地时允许跳,或者Coyote Time期间允许跳
    if Input.is_action_just_pressed("jump") and not is_jumping:
        if is_on_floor() or coyote_timer.is_processing():
            is_jumping = true
            motion.y = JUMP_HEIGHT

    # 落地时重置跳跃状态
    if is_on_floor():
        is_jumping = false
        coyote_timer.stop()  # 落地立即停止计时器

    # 空中动画逻辑
    if not is_on_floor():
        if motion.y < 0:
            $AnimationTree.set("parameters/state/current", 2)  # 上升动画
        else:
            $AnimationTree.set("parameters/state/current", 3)  # 下落动画

    # 移动角色
    motion = move_and_slide(motion, UP)

其他代码优化点

  • 给变量添加类型标注(如var coyote_timer: Timer),方便Godot编辑器提示,减少错误
  • 将Coyote时长设为单独常量COYOTE_DURATION,更易调整参数
  • 调整逻辑顺序:先更新地面状态,再处理移动、跳跃、动画,逻辑更清晰
  • 移除冗余的pass语句,_physics_process不需要空语句
  • 落地时立即停止计时器,避免落地后还能触发Coyote跳跃

关键逻辑说明

  1. was_on_floor更新:每帧开头把当前is_on_floor()的值赋给was_on_floor,这样才能检测到角色刚离开地面的瞬间
  2. 计时器启动时机:当角色从落地状态变为空中状态时,启动Coyote计时器
  3. 跳跃触发条件:按下跳跃键时,只要角色在地面,或者计时器还在运行(Coyote Time窗口内),就允许跳跃
  4. 重力只加一次:避免角色下落速度异常

内容的提问来源于stack exchange,提问作者DevDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:30:59