2010-07-17 12 views
3

Je voudrais mettre en œuvre une trajectoire balistique dans un jeu XNA et essayait de trouver la meilleure façon de faire le projectile suivre une courbe gravitationnelle.Animate Sprite le long d'un chemin de courbe dans XNA

La meilleure chose à laquelle je peux penser est de simplement calculer la courbe en premier et de la stocker dans une classe "Curve". Ensuite, demandez à l'image-objet de se déplacer le long de cette courbe.

Mais je n'arrive pas vraiment à comprendre comment déplacer réellement l'image-objet le long de cette courbe.

Comment est-ce que je ferais ceci, ou y a-t-il simplement un meilleur moyen?

Répondre

9

Fondamentalement, vous voulez utiliser votre physique de niveau secondaire equations of motion (article Wikipedia).

pour le mouvement du projectile, ceci est l'équation importante:

s = s₀ + v₀t + ½at² 

(déplacement est égal à:. Déplacement initial, plus la vitesse initiale multipliée par le temps, plus l'accélération de la moitié multipliée par le temps au carré)

Supposons que vous ayez un projectile en mouvement en 2D. Vous exécutez essentiellement cette équation pour chaque dimension. Dans la direction X vous aurez une position initiale et une certaine vélocité initiale mais pas d'accélération.

Dans la direction Y vous aurez une position initiale, la vitesse initiale et l'accélération vers le bas en raison de la gravité.

Tout ce que vous avez à faire est de garder une trace du temps écoulé depuis que votre projectile a été tiré, et dessinez votre sprite à la position calculée.

Voici un code XNA rugueux - comme vous pouvez le voir, je peux calculer les deux axes à la fois:

Vector2 initialPosition = Vector2.Zero; 
Vector2 initialVelocity = new Vector2(10, 10); // Choose values that work for you 
Vector2 acceleration = new Vector2(0, -9.8f); 

float time = 0; 
Vector2 position = Vector2.Zero; // Use this when drawing your sprite 

public override void Update(GameTime gameTime) 
{ 
    time += (float)gameTime.ElapsedGameTime.TotalSeconds; 

    position = initialPosition + initialVelocity * time 
       + 0.5f * acceleration * time * time; 
} 

Avec un peu d'algèbre, vous pouvez utiliser ces mêmes équations de mouvement pour faire des choses comme le calcul ce que vitesse pour lancer votre projectile à frapper un point particulier.

+0

Génial. Fonctionne plutôt bien. Mais aucune idée comment ajouter un angle initial à cela? Par exemple, si le projectile est tiré à 0,5 radians? –

+0

@Adam: C'est simple trigonométrie: 'initialVelocity = (cos (0.5), sin (0.5)) * 100' –

+0

Merci, j'avais finalement compris. Le problème que je rencontrais était que je ne me rendais pas compte que les méthodes trigonométriques XNA recherchaient des radians et non des degrés ... donc je les convertissais incorrectement en degrés en premier. –