Имитация гравитации в XNA - PullRequest
       18

Имитация гравитации в XNA

5 голосов
/ 24 декабря 2011

Я пытаюсь оживить двухмерный спрайт в моей игре XNA 2D силой гравитации.Я разработал очень простой класс для достижения эффекта симуляции.Это мой пример кода.

namespace Capture
{
class PhysX
{
    static Vector2 g = new Vector2(0.0f, 10.0f);
    public Vector2 pos, vel, acc, accumForce;
    public float mass;
    public bool USE_GRAVITY = true;

    /* Constructor */
    public void Engage(ref GameTime gameTime, uint maxX, uint maxY)
    {

        Vector2 F = Vector2.Zero;
        if (USE_GRAVITY)
        {
            F = accumForce + mass * g;
        }

        acc = F / mass;//This is the Net acceleration, Using Newtons 2nd Law
        vel += acc * gameTime.TotalGameTime.Seconds;// v = u + a*t
        pos += vel * gameTime.TotalGameTime.Seconds;// s = u*t + 0.5*a*t*t, 
        pos.X %= maxX;
        pos.Y %= maxY;

    }

    public void ApplyForce(ref Vector2 f)
    {
        accumForce += f;
    }
}
}

Я вызываю метод PhysX#Engage() в методе Game#Update(GameTime gt).Проблема в том, что я не получаю плавную анимацию.Это потому, что позиция становится очень большой в ближайшее время.Чтобы преодолеть это, я попытался принять модуль, как показано в коде с Viewport.Width, Viewport.Height, но все же координаты положения не совсем гладкие.Что я должен делать.Как сделать анимацию плавной?Пожалуйста помоги.

1 Ответ

3 голосов
/ 24 декабря 2011

Я думаю, что это происходит, потому что вы принимаете значение прошедшего времени как целое.

Попробуйте использовать двойное значение секунд, которое учитывает даже дробную часть:

flaot dt = (float)GameTime.ElapsedGameTime.TotalSeconds;
vel += acc * dt;// v = u + a*t
pos += vel * dt;// s = u*t + 0.5*a*t*t,

Кроме того:

Это потому, что позиция очень скоро станет очень большой.

Ну, вы должны держать значение с плавающей точкой как можно ближе к диапазону [-1, + 1],в противном случае вы получите потерю точности.Мой совет:

  1. сохраняйте свойства float ваших объектов в небольшом диапазоне ([- 1, + 1])
  2. преобразуйте ваши значения перед рисованием в зависимости от вашего разрешения
...