GDScript实现按住跳跃键跳更高功能异常,空中重跳重力异常求助
问题分析与修复方案
问题根源
你的代码核心问题是修改了全局的gravity变量,且未严格限制修改条件:
- 仅在地面按下jump时会减少重力,但在空中松开jump时,无论之前是否在地面修改过重力,都会执行
gravity += 500,导致重力值不断异常累加。 move_and_slide调用顺序错误:应先计算速度变化,再调用该函数(它会处理碰撞并更新速度),你先移动再叠加重力,逻辑顺序颠倒。
Godot检测按键按住的方法
检测按键持续按住用Input.is_action_pressed("jump"),和另外两个函数的区别:
Input.is_action_just_pressed("jump"):仅在按键按下的第一帧返回trueInput.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
相关产品推荐
相关产品推荐

