2011-12-24 12 views
5

Intento animar un 2d sprite en mi juego XNA 2D, por la fuerza de la gravedad. Desarrollé una clase muy básica para lograr el efecto de simulación. Este es mi código de muestra.Simulando la gravedad en 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; 
    } 
} 
} 

Voy a llamar al método PhysX#Engage() en Game#Update(GameTime gt) método. El problema es que no estoy obteniendo una animación fluida. Esto es porque la posición se vuelve muy grande pronto. Para, superar que traté de tomar el módulo, como se muestra en el código con el Viewport.Width, Viewport.Height, pero aún así las coordenadas de posición no son para nada suaves. Que debería hacer. ¿Cómo hacer que la animación sea más suave? Por favor ayuda.

+0

¿Cuál es tu masa establecida en? cuanto mayor es la masa, más lenta es la aceleración. –

+0

@SteveH el término masivo en la fuerza y ​​la división en masa cancela. La aceleración de la gravedad no depende de la masa. – CodesInChaos

+0

@Anurag Tu velocidad aumenta linealmente con el tiempo. Por lo general, introduce un término de reducción de velocidad lineal para simular la fricción y limitar la velocidad terminal. – CodesInChaos

Respuesta

3

Creo que eso está sucediendo porque está tomando el valor del tiempo transcurrido como número entero.

Probar Usar valor doble de segundos que tiene en cuenta incluso la parte fraccionaria:

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

Además:

Esto se debe a la posición se hace muy grande pronto.

Bueno, debe mantener el valor del flotador lo más cerca posible del rango [-1, + 1], de lo contrario, perderá precisión. Mi consejo es:

  1. mantener las propiedades de flotación de los objetos en un pequeño rango ([- 1, + 1])
  2. transformar sus valores antes de sacar Dependiendo de la resolución
+0

gracias, mostró algunas mejoras, pero aún así es muy rápido ... – batman