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.
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? –
@Adam: C'est simple trigonométrie: 'initialVelocity = (cos (0.5), sin (0.5)) * 100' –
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. –