#xna
#xna
Вопрос:
вот мой код для метода обновления класса projectile. каждый кадр previousXposition добавляется к последнему результату вместо замены последнего результата. в чем причина и решение проблемы?
public void Update(GameTime gameTime)
{
if (Position.X != previousXPosition)
{
flightTime = (float)gameTime.ElapsedGameTime.TotalSeconds;
Position.X = previousXPosition;
Position.Y -= previousYPosition;
previousXPosition = (projectileVelocity.X * flightTime) 0.5f * (wind * (float)Math.Pow(flightTime, 2));
previousYPosition = (projectileVelocity.X * flightTime) 0.5f * (gravity * (float)Math.Pow(flightTime, 2));
}
Ответ №1:
накопление «времени полета» таким образом не приводит к изменению скорости. Каждый кадр, в котором предполагается, что скорость для всего полета была такой, какая она есть в данном конкретном кадре, что не так.
Вот способ, которым я бы рекомендовал кодировать полет снаряда. Установите ‘velocity’ как вектор2, направление которого представляет направление, в котором движется снаряд, и величина которого представляет скорость в единицах в секунду, с которой он движется.
float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds; // time since last frame only
// the velocity vector will have a magnitude equiv to units traveled per second.
float speed = velocity.Length();
Vector2 windDrag = (Vector2.Negate(velocity) / speed) * (speed * speed * dragCOef);
Vector2 gravity = Vector2.UnitY * gravCOef;// gravity can be a constant per unit time.
Vector2 velocityChange = windDrag gravity;
velocity = velocityChange * elapsed;// adds just the change of velocity this frame to the overall velocity
Position = velocity * elapsed;// 'velocity' is distance traveled per second. 'velocity * elapsed' is just distance traveled per frame
o
Комментарии:
1. спасибо за ответ, но мне было интересно, почему знак = действовал как = вход: previousXPosition = , который обозначает дельту. должен ли я обнулять его каждый раз?
2. Предыдущее расположение не является дельтой. Это потому, что «время полета» — это не время разности, а накопленное время. такое накопление времени обычно не является хорошим способом.
3. Выражения, которые вы вычисляете, нелегко выполнить. Подумайте о том, чтобы упростить их или разделить на несколько вложенных выражений, чтобы сделать их более удобочитаемыми и обслуживаемыми.