2011-12-24 15 views
5

Sto provando ad animare uno sprite 2d nel mio gioco XNA 2D, dalla forza di gravità. Ho sviluppato una classe molto semplice per ottenere l'effetto di simulazione. Questo è il mio codice di esempio.Simulazione della gravità in 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; 
    } 
} 
} 

che sto chiamando il metodo PhysX#Engage() in Game#Update(GameTime gt) metodo. Il problema è che non sto ottenendo un'animazione fluida. Questo perché la posizione diventa molto grande presto. Per superare quello che ho provato a prendere modulo, come mostrato nel codice con il Viewport.Width, Viewport.Height ma ancora le coordinate di posizione non sono affatto lisce. Cosa dovrei fare. Come rendere l'animazione liscia? Per favore aiuto.

+0

Che cosa è la tua messa? maggiore è la massa, più lenta accelerazione. –

+0

@SteveH il termine di massa nella forza e la divisione per massa si cancellano. L'accelerazione per gravità non dipende dalla massa. – CodesInChaos

+0

@ Anurag La tua velocità aumenta in modo lineare con il tempo. Di solito si introduce un termine di rallentamento lineare nella velocità per simulare l'attrito e limitare la velocità terminale. – CodesInChaos

risposta

3

Penso che stia accadendo perché si sta prendendo il valore del tempo trascorso come numero intero.

uso Prova valore doppio di secondi che tenga conto anche la parte frazionaria:

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

Inoltre:

Questo perché la posizione diventa molto grande presto.

Bene, si dovrebbe mantenere il valore flottante il più vicino possibile all'intervallo [-1, + 1], altrimenti si otterrà una mancanza di precisione. Il mio consiglio è:

  1. mantenere le proprietà float dei vostri oggetti in un piccolo intervallo ([- 1, + 1])
  2. trasformare i vostri valori prima di disegnare In base alla risoluzione
+0

grazie, ha mostrato dei miglioramenti ma è ancora molto veloce ... – batman