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.
¿Cuál es tu masa establecida en? cuanto mayor es la masa, más lenta es la aceleración. –
@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
@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