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

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,消除残留微小角度

关键修复点

  1. 修正条件分支:将correction()里的独立if改为elif,让else覆盖所有非正负旋转的情况,避免正向旋转时方向被错误重置。
  2. 输入与归正互斥:仅在玩家未按住旋转键时执行归正逻辑,避免输入操作和归正逻辑的方向冲突。
  3. 帧率无关处理:旋转时乘以delta * 60,确保不同帧率下旋转速度一致。
  4. 抖动优化:添加小角度阈值,解决球拍在0度附近来回微小抖动的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:42:13