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

#mobile #game-physics #frame-rate #godot #gdscript

#Мобильный #игра-физика #частота кадров #годо #gdscript

Вопрос:

Я новичок в Godot и работаю над небольшим проектом, который поможет мне учиться. В этом проекте у меня есть колесо, которое вращается, когда пользователь касается экрана, и шар, который выходит из центра экрана наружу. Когда я запускаю проект, шарик иногда на секунду или две движется необычно быстрее, и колесо вращается почти мгновенно. Я предполагаю, что это как-то связано с частотой кадров в игре, но как мне убедиться, что этого не произойдет, когда я опубликую свою игру в App Store?
(Весь код находится в 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)
 

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

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

Ответ №1:

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


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

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

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

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

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


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

параметр delta содержит время, прошедшее в секундах в виде числа с плавающей запятой с момента предыдущего вызова _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 , как указано в документации, указывается в секундах. Таким образом, вы должны выразить свои угловые скорости в углах в секунду, а линейную скорость в положение перемещение в секунду. Я также напоминаю вам, что величина скорости скорости — это скорость, которая равна расстоянию во времени.