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

GDScript实现按住跳跃键跳更高功能异常,空中重跳重力异常求助

问题分析与修复方案

问题根源

你的代码核心问题是修改了全局的gravity变量,且未严格限制修改条件:

  • 仅在地面按下jump时会减少重力,但在空中松开jump时,无论之前是否在地面修改过重力,都会执行gravity += 500,导致重力值不断异常累加。
  • move_and_slide调用顺序错误:应先计算速度变化,再调用该函数(它会处理碰撞并更新速度),你先移动再叠加重力,逻辑顺序颠倒。

Godot检测按键按住的方法

检测按键持续按住用Input.is_action_pressed("jump"),和另外两个函数的区别:

  • Input.is_action_just_pressed("jump"):仅在按键按下的第一帧返回true
  • Input.is_action_just_released("jump"):仅在按键松开的第一帧返回true

修复后的代码

我们不修改全局重力,而是通过按住jump的时间控制跳跃高度(设置最大上限,避免无限跳):

var gravity : int = 1800
var vel : Vector2 = Vector2()
var jump_force_base : int = 800  # 基础跳跃力
var jump_force_max : int = 1200  # 最大跳跃力
var jump_charge_speed : int = 400  # 按住时跳跃力的增长速度

func _physics_process(delta):
    vel.x = 0
    
    # 先处理重力
    vel.y += gravity * delta
    
    # 跳跃逻辑:地面按住时持续提升向上速度,直到达到最大值
    if is_on_floor():
        if Input.is_action_pressed("jump"):
            # 计算当前跳跃力,不超过设定的最大值
            var current_jump_force = min(jump_force_base + jump_charge_speed * get_action_strength("jump"), jump_force_max)
            vel.y = -current_jump_force
    
    # 最后执行移动处理碰撞
    vel = move_and_slide(vel, Vector2.UP)

额外说明

  • get_action_strength("jump")可获取按键按住时长(返回0到1的数值,按住越久越接近1),用来平滑控制跳跃力增长。
  • 保留全局gravity初始值,避免场景内状态变化导致重力异常,空中跳跃(若允许二段跳)也不会干扰重力逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:55:18