Godot3.5 Pong类游戏球拍旋转修正函数异常问题排查
问题分析与修复方案
核心bug原因
你的correction()函数条件分支逻辑错误:第二个if是独立判断,else只绑定第二个if。当球拍正向旋转(rotation_degrees > 0)时,第一个if会把rotation_direction设为-0.2,但紧接着执行第二个if判断,因为rotation_degrees > 0不满足<0,会触发else把rotation_direction重置为0,导致归正逻辑失效。而负向旋转时,第一个if不触发,第二个if生效设置0.2,不会走到else,所以归正有效。
另外,当前代码在玩家按住旋转键时仍会执行correction(),导致输入的旋转方向和归正方向冲突,也会影响正常操作。
修复后的代码
extends KinematicBody2D var rotation_direction = 0 var max_rotation = 10 var correction_speed = 0.2 # 把归正速度单独抽离,方便后续调整 func _physics_process(delta): # 先重置旋转方向,优先处理玩家输入 rotation_direction = 0 if Input.is_action_pressed("right"): rotation_direction = 0.5 elif Input.is_action_pressed("left"): rotation_direction = -0.5 else: # 仅当玩家无输入时,执行归正逻辑 correction() # 应用旋转时乘delta*60,保证帧率无关的速度(基于每秒变化) rotation_degrees += rotation_direction * delta * 60 rotation_degrees = clamp(rotation_degrees, -max_rotation, max_rotation) func correction(): if rotation_degrees > 0.1: # 加小阈值,避免0度附近来回抖动 rotation_direction = -correction_speed elif rotation_degrees < -0.1: rotation_direction = correction_speed else: rotation_direction = 0 rotation_degrees = 0 # 直接归正到0,消除残留微小角度
关键修复点
- 修正条件分支:将
correction()里的独立if改为elif,让else覆盖所有非正负旋转的情况,避免正向旋转时方向被错误重置。 - 输入与归正互斥:仅在玩家未按住旋转键时执行归正逻辑,避免输入操作和归正逻辑的方向冲突。
- 帧率无关处理:旋转时乘以
delta * 60,确保不同帧率下旋转速度一致。 - 抖动优化:添加小角度阈值,解决球拍在0度附近来回微小抖动的问题。
内容的提问来源于stack exchange,提问作者Madoba
相关产品推荐
相关产品推荐

