Posted June 26, 2019 by koydas
Je viens d’arriver sur le premier problème qui va demander de la réflexion.
J’ai une propriété HitBox sur chacun de mes éléments de gameplay et lorsqu’ils se touchent ça touche le joueur.
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.
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);
}