2011-12-24 2 views
5

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

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, но все же координаты позиции не совсем гладкие. Что мне делать. Как сделать анимацию гладкой? Пожалуйста помоги.

+0

Что такое ваш массовый набор? чем выше масса, тем медленнее ускорение. –

+0

@SteveH массовый термин в силе и деление по массе компенсируют. Ускорение силы тяжести не зависит от массы. – CodesInChaos

+0

@Anurag Ваша скорость увеличивается линейно со временем. Обычно вы вводите замедленный термин, линейный по скорости, чтобы имитировать трение и ограничивать конечную скорость. – CodesInChaos

ответ

3

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

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

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. сохраняют свои свойства поплавка ваших объектов в небольшом диапазоне ([- 1, + 1])
  2. трансформировать свои значения перед рисованием в зависимости от разрешения
+0

спасибо, он показал некоторое улучшение, но все еще очень быстро ... – batman

Смежные вопросы