Problème de collision imprécise


Je viens d’arriver sur le premier problème qui va demander de la réflexion.

Fonctionnement actuel

J’ai une propriété HitBox sur chacun de mes éléments de gameplay et lorsqu’ils se touchent ça touche le joueur.

 

Problème

Les HitBoxes sont de la grandeur de l’image complète (incluant la transparence), alors un laser peut toucher le joueur même si celui ci n’est pas réellement touché.

De plus, lorsque LaserBoss est en phase 3, il fait une attaque en cone, l’image est tournée de 20 degrés, mais pas le hitbox. Alors le hitbox est touché alors que le joueur est loin d’etre touché par l’image vue.

 

Pistes de solutions

  1. Créer un système de “pixel perfect”, qui va vérifier qu’au moins 1 pixel de chaque élément se touche pour détecter la collision
  2. Revoir comment le hitbox est généré pour qu’il soit de la grandeur exacte des pixels visibles
  3. Enlever la transparence superflu des images

 

Solution 1

J’ai programmé un système de “pixel perfect”, qui vérifie lorsque 2 hit boxes se touchent qu’il y a au moins un pixel de chaque image qui se croisent.

Voici mon code :

private bool PixelPerfectHit(IGameObject second)
{
 var sectionHitted = GetOverlapsedSection(second);
   var gameObjectHasColor = HasColorInSection(Texture, sectionHitted);
 var projectileObjectHasColor = HasColorInSection(second.Texture, sectionHitted);
   return gameObjectHasColor && projectileObjectHasColor;
}

private Rectangle GetOverlapsedSection(IGameObject second)
{
return Rectangle.Intersect(HitBox, second.HitBox);

}

private bool HasColorInSection(Texture2D texture, Rectangle section)
{
   int size = section.Width * section.Height;
   Color[] buffer = new Color[size];
   Texture.GetData(0, section, buffer, 0, size);
   return buffer.Any(x => x != Color.Transparent);
}

Get Laser beams pew pew

Download NowName your own price

Leave a comment

Log in with itch.io to leave a comment.