Я делаю игру на C ++, где есть танк, который может двигаться на сцене. У танка есть угол (плавать в градусах, и я предполагаю, что танк находится в 0º, когда его пушка указывает вправо), скорость (плавание), и есть постоянная времени, называемая «deltaT» (плавание).
Когда игрок двигает танк вперед, я использую тригонометрию и физическое уравнение положения в зависимости от времени (я имею в виду 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