我正在尝试在 Godot 3.5 中编写一个类似“Pong”的游戏。与经典的乒乓球游戏相比,我想建立稍微旋转乒乓球杆以获得更多变化的可能性。在玩家对 Pong 栏设置一些旋转后,我想将其慢慢修正到旋转为 0 的起点。不知何故,我的修正函数仅适用于负旋转_度数(“左”)。如果存在正的rotation_degs(“右”),则不应用任何校正。
我的代码看起来像这样。我已经在寻找打印方法的错误。函数修正将rotation_direction设置为-0.2,但不知何故,上面一行中的rotation_direction(请参阅我的错误评论)似乎保持值0。
extends KinematicBody2D
var rotation_direction = 0
var max_rotation = 10
func _physics_process(delta):
if Input.is_action_pressed("right"):
rotation_direction = 0.5
if Input.is_action_pressed("left"):
rotation_direction = -0.5
rotation_degrees += rotation_direction ##possible bug?
rotation_degrees = clamp(rotation_degrees, -max_rotation, max_rotation)
correction()
func correction():
if rotation_degrees > 0:
rotation_direction = -0.2
if rotation_degrees < 0.0:
rotation_direction = 0.2
else:
rotation_direction = 0.0
缠绕旋转
这不是当前的问题。因为我在这里解决的问题只会发生在大轮换的情况下。然而,它会帮助其他有类似问题的人。它会消除你对这个错误的怀疑。
一般建议是包裹你的角度,如下所示:
或对于学位:
所以你可以让角度累积,当你需要检查它时,你可以将它包裹起来,这样你就可以让它们代表短距离的旋转。例如,四分之三圈变成负四分之一圈。
如果您要将旋转限制在一定范围内,这一点很重要:
错误
在 中
correction
,rotation_direction
将是0.2
或0.0
:是的,你有这样的
if
说法:然而,无论如何,第二个 if 语句都会运行,并且执行流程将进入其中一个分支:
最小的改变是使用
elif
:但是,我鼓励使用
sign
(signf
在 Godot 4 中):这里
sign
将返回-1
,0
或1
代表 的符号rotation_degrees
。我们对其求反以获得相反的符号。一旦与0.2
可能的值相乘,则为0.2
、0.0
、 和-0.2
。是的,你也可以将角度包裹在那里:
由于这只是一行,您可能会考虑这样做,
_physics_process
而不是使用单独的correction
方法。