2011-12-24 12 views
5

XNA 2Dのゲームで重力によって2dスプライトをアニメートしようとしています。私は、シミュレーション効果を達成するための非常に基本的なクラスを開発しました。これは私のサンプルコードです。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; 
    } 
} 
} 

私はGame#Update(GameTime gt)方法でPhysX#Engage()メソッドを呼んでいます。 問題はこれです。滑らかなアニメーションが得られません。これは、すぐに位置が非常に大きくなるためです。これを克服するために、Viewport.Width, Viewport.Heightのコードに示されているようにモジュラスを取ろうとしましたが、依然として位置座標は全く滑らかではありません。私は何をすべきか。アニメーションをスムーズにする方法は?助けてください。

+0

は何であるあなたの解像度に応じて描画する前に、自分の価値観を変えますあなたの質量は?質量が大きいほど加速が遅くなります。 –

+0

@ SteveH力の質量項と質量による除算は相殺されます。重力加速度は質量に依存しない。 – CodesInChaos

+0

@Anuragあなたのスピードは時間とともに直線的に増加します。通常は、摩擦をシミュレートして端末速度を制限するために、速度において線形な減速項を導入します。 – CodesInChaos

答えて

3

私はあなたが整数として経過時間の値を取っているので、起こっていると思います。また

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]の範囲のできるだけ近くにfloat値を維持する必要があります。 私のアドバイスは次のとおりです。

  1. 小さな範囲であなたのオブジェクトのfloatプロパティを維持する([ - 1、+ 1])
+0

ありがとう、それはいくつかの改善を示したが、まだ非常に速い... – batman

関連する問題