метод обновления xna — почему знак = действует как =

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