Объекты Годо движутся с разной скоростью

Я новичок в 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)

Вот сделанное мной видео, показывающее, о чем я говорю: Ссылка на видео

Что вызывает такое поведение и как его стабилизировать?


person Lori Martini    schedule 28.11.2020    source источник


Ответы (1)


Параметр delta указывает истекшее время. Вам нужно умножить на это вашу скорость.


Рассмотрим, например:

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

Здесь у вас есть скорость movev и позиция position. Скорость - это дельта-положение относительно дельта-времени. Таким образом, позиция и скорость - разные единицы, складывать их не следует.

Если у вас есть дельта-позиция по сравнению с дельта-временем, вам нужно умножить ее на дельта-время, чтобы получить дельта-позицию. И эту дельта-позицию вы можете добавить к своей позиции.

См. также: мгновенная скорость.


Из документации Godot:

параметр дельта содержит время, прошедшее в секундах в виде числа с плавающей запятой с момента предыдущего вызова _process ()

Таким образом, ваш код должен быть:

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

Аналогично для угловой скорости:

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

Примечание: после этого изменения вы можете обнаружить, что ваша скорость слишком низкая или слишком высокая. Помните единицы. Параметр delta, как написано в документации, находится в секундах. Таким образом, вы должны выразить свои угловые скорости в углах в секунду, а вашу линейную скорость в position смещения в секунду. Я также напоминаю вам, что величина скорости - это скорость, то есть расстояние во времени.

person Theraot    schedule 29.11.2020