Godot 对象以不同的速度移动

Godot Objects are moving at varying speeds

我是 Godot 的新手,一直在做一个小项目来帮助我学习。在这个项目中,我有一个轮子,当用户触摸屏幕时会转动,还有一个球会从屏幕中心向外移动。当我 运行 这个项目时,球有时会异常快速地运行一两秒钟,并且轮子几乎会立即旋转。我认为这与游戏的帧率有关,但我如何确保在将游戏发布到应用商店时不会发生这种情况?
(所有代码都在 GDScript 中)

移动小球代码(ball.gd):

var movev = Vector2(0,0)
func _process(delta):
    position += movev

转轮代码(Wheel.gd):

var goal = 0
func _process(delta):
    if goal > rotation:
        rotation += deg2rad(1)

点击屏幕时的代码(World.gd):

onready var Wheel = get_node("Wheel/Center")
func _on_Button_button_down():
    Wheel.goal += deg2rad(45)

这是我制作的一段视频,展示了我在说什么:Video Link

是什么导致了这种行为,我该如何稳定它?

参数delta告诉你经过的时间。您需要将速度乘以它。


考虑,例如:

var movev = Vector2(0,0)
func _process(delta):
    position += movev

这里有速度 movev 和位置 position。速度是增量时间上的增量位置。所以位置和速度是不同的单位,不能相加

如果您在增量时间上有增量位置,则需要乘以增量时间以获得增量位置。您可以将那个增量位置添加到您的位置。

另见instantaneous velocity


来自Godot documentation

the delta parameter contains the time elapsed in seconds as a floating-point number since the previous call to _process()

因此,您的代码应该是:

var movev = Vector2(0,0)
func _process(delta):
    position += movev * delta

与 angular 速度类似:

var goal = 0
func _process(delta):
    if goal > rotation:
        rotation += deg2rad(1) * delta

注意:您可能会发现经过此更改后您的速度太慢或太快。记住单位。正如文档所说,参数 delta 以秒为单位。因此,您应该用每秒角度 angular 速度和每秒 位置 位移表示线速度。 另外提醒一下,velocity速度的大小就是速度,也就是时间的距离