С++ gamedev: truncating float to int
Я делаю игру на С++, где есть танк, который может двигаться на сцене. Танк имеет угол (поплавок, в градусах, и я полагаю, что танк равен 0º, когда его пушка указывает вправо), скорость (float), и есть постоянная времени, называемая deltaT (float).
Когда игрок перемещает танк вперед, я использую тригонометрию и физическое уравнение положения в зависимости от времени (я имею в виду X (t), я не знаю, как это говорит на английском языке), чтобы вычислить новый танк координаты на этапе.
Это моя проблема: из-за перехода от float к int значения, близкие к нулю, не учитываются. Таким образом, под определенными углами резервуар поворачивается, но движется в другом направлении.
Это то, что делает мой код:
1 - во-первых, я выделяю скорость в своих компонентах X и Y, используя угол, в котором перемещается резервуар:
float speedX = this->speed * cos(this->angle);
float speedY = this->speed * sin(this->angle);
2 - затем используйте уравнение, упомянутое выше, чтобы получить новые координаты:
this->x = (int) ceil(this->x + (speedX * deltaT));
this->y = (int) ceil(this->y - (speedY * deltaT));
Задача начинается с первого шага: при определенных углах значение cos или sin очень близко к нулю.
Поэтому, когда я умножаю его на скорость, чтобы получить, скажем, speedX, я все еще получаю очень низкое число, а затем, когда я умножаю его на deltaT, он все еще слишком низок, и, наконец, при применении ceil эта сумма полностью теряется.
Например, при 94º с deltaT = 1.5 и скоростью = 2, и если начальное значение X равно 400, мы имеем:
speedX = -0.1395...
this->x = 400 //it must be 399.86..., but stays in 400 due to the ceiling
Итак, в моей игре танк кажется повернутым, но движется прямо вперед. Кроме того, иногда он движется хорошо назад, но неправильно вперед и наоборот.
¿Как я могу сделать, чтобы направление резервуара было более точным? Чтобы повысить скорость или значение deltaT не являются параметрами, так как это касается резервуара, а не формулы 1: P
Ответы
Ответ 1
Как я могу сделать направление резервуара более точным? Чтобы повысить скорость или значение deltaT не являются параметрами, так как это касается резервуара, а не формулы 1: P
Вы должны сохранить ваши значения позиции float
s, хотя в конечном итоге они используются как int
для позиционирования на экране. Таким образом, вы не потеряете нецелую часть своей позиции. Просто нажмите int
в конце, когда вы сделаете свой рисунок.
Ответ 2
Держите место в резервуаре в float
все время. В качестве альтернативы, только танк может вращаться с шагом 45 градусов. Решите, будет ли ваша игра использовать приблизительные позиции и заголовки или точные и придерживаться этого решения на всем протяжении.