J'essaie de créer un bon moyen de gérer toutes les collisions possibles entre deux objets. Typiquement, l'un bouge et frappe l'autre, et devrait ensuite «rebondir». Ce que j'ai fait jusqu'ici (je crée un jeu typique où vous avez une planche et faites rebondir une balle sur des briques) est de vérifier si les rectangles se croisent et s'ils le font, inverser la vélocité-Y.Traitement des vecteurs de vitesse pendant la collision le plus proprement possible
Ceci est une solution vraiment laide et temporaire qui ne fonctionnera pas sur le long terme et puisque ce type de traitement est très commun dans les jeux, je voudrais vraiment trouver une excellente façon de le faire pour de futurs projets. . Tous les liens ou informations utiles sont appréciés.
Voici à quoi ressemble ma fonction de gestion des collisions en ce moment.
protected void collision()
{
#region Boundaries
if (bal.position.X + bal.velocity.X >= viewportRect.Width ||
bal.position.X + bal.velocity.X <= 0)
{
bal.velocity.X *= -1;
}
if (bal.position.Y + bal.velocity.Y <= 0)
{
bal.velocity.Y *= -1;
}
#endregion
bal.rect = new Rectangle((int)bal.position.X+(int)bal.velocity.X-bal.sprite.Width/2, (int)bal.position.Y-bal.sprite.Height/2+(int)bal.velocity.Y, bal.sprite.Width, bal.sprite.Height);
player.rect = new Rectangle((int)player.position.X-player.sprite.Width/2, (int)player.position.Y-player.sprite.Height/2, player.sprite.Width, player.sprite.Height);
if (bal.rect.Intersects(player.rect))
{
bal.position.Y = player.position.Y - player.sprite.Height/2 - bal.sprite.Height/2;
if (player.position.X != player.prevPos.X)
{
bal.velocity.X -= (player.prevPos.X - player.position.X)/2;
}
bal.velocity.Y *= -1;
}
foreach (Brick b in brickArray.list)
{
b.rect.X = Convert.ToInt32(b.position.X-b.sprite.Width/2);
b.rect.Y = Convert.ToInt32(b.position.Y-b.sprite.Height/2);
if (bal.rect.Intersects(b.rect))
{
b.recieveHit();
bal.velocity.Y *= -1;
}
}
brickArray.removeDead();
}
Pour en tirer quelque chose, je pense que vous devez énoncer plus précisément le comportement que vous voulez. Dire «c'est vraiment moche et temporaire» ne le coupe pas. –
On entend par Bal une Balle qui devrait rebondir avec précision sur n'importe quelle surface frappée dans l'angle droit, sans "téléporter" à travers elle lorsque la vitesse est trop élevée etc. – bjrnt