2011-10-31 2 views
14

Я делаю игру на C++, где есть танк, который может перемещаться по сцене. Танк имеет угол (поплавок, в градусах, и я полагаю, что танк равен 0º, когда его пушка указывает вправо), скорость (float), и есть постоянная времени, называемая deltaT (float).C++ gamedev: truncating float to int

Когда игрок перемещает танк вперед, я использую тригонометрию и физическое уравнение положения в зависимости от времени (я имею в виду X (t), я не знаю, как это говорит на английском языке), чтобы рассчитать новый координаты резервуара в стадии.

Это моя проблема: из-за перехода от float к int значения, близкие к нулю, не учитываются. Таким образом, под определенными углами резервуар поворачивается, но движется в другом направлении.

Это то, что мой код делает:

1 - первый, я разделить скорость в ее компонентах X и Y, с использованием угла в Wich танк движется:

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)); 

проблема начинается с первого шага: при определенных углах, значение соз или грех очень близок к нулю. Итак, когда я умножаю его на скорость, чтобы получить, скажем, 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

+4

+1: хорошая работа, объясняя свой вопрос и обеспечение минимального соответствующего кода. – ObscureRobot

+1

Хранение углов как градусов редко бывает полезным. C++ изначально работает в радианах. Вы закончите конвертировать туда и обратно. Единственное исключение, в котором вы не использовали радианы, - это когда у вас есть массив спрайтов, по одному для каждого вращения танка. В этом случае полезно использовать индекс массива. Но никто не сделал бы 360 спрайтов; 128 (4x32) будет гораздо более распространенным явлением. – MSalters

+0

@MSalters Да, я слишком поздно пересчитал радианы. Но на самом деле код, который я опубликовал, немного упрощен: я не использую функции sin и cos из математической библиотеки, но я подсчитал значения cos и sin определенных углов, чтобы избежать вычисления их во время выполнения. Кроме того, для повернутых изображений у меня нет 128 спрайтов, но у меня есть только один, и используйте функцию «rotozoomSurface» (в SDL_gfx lib, добавление для SDL), которая работает со степенями. – Granjero

ответ

9

Как я могу сделать направление резервуара более точным? Для того, чтобы повысить скорость и значение deltaT не являются опционами, поскольку речь идет о танке, а не формула 1: P

Вы должны хранить свои ценности позиции, как float с, даже если они в конечном счете используются как int с для на экране. Таким образом, вы не потеряете нецелую часть своей позиции. Просто бросьте до int прямо в конце, когда вы делаете свой рисунок.

+1

О, огромное спасибо! Я только что внес изменения в код, и он работает! Я не могу сказать, что это было так просто – Granjero

5

Храните место в баке в float s все время. В качестве альтернативы, только танк может вращаться с шагом 45 градусов. Решите, будет ли ваша игра использовать приблизительные позиции и заголовки или точные и придерживаться этого решения на всем пути.

+0

_Возможно, только танк вращается с шагом 45 градусов. Да, я пробовал это раньше, но танк вращается слишком быстро и не очень жидким способом. – Granjero