Développement XNA pour la XBox et le PC
216
Passons maintenant à l’écriture de la méthode CollisionPerPixel (dans le projet exemple,
elle est rattachée à la classe ChapitreDix). La première chose à faire est de déterminer le
rectangle contenant tous les pixels concernés par la collision entre les deux sprites. Une
fois la position des quatre côtés du rectangle déterminée, utilisez-les pour parcourir le
tableau de pixels. Attention, tous les pixels sont classés de manière linéaire dans le
tableau puisque celui-ci ne comporte qu’une dimension.
Pour chacun des pixels de cette zone, vérifiez la composante alpha (la transparence). Si elle
n’est pas nulle pour les deux sprites, alors les deux sprites ne sont pas totalement transparents
et il y a collision.
protected bool CollisionPerPixels(Sprite spriteA, Sprite spriteB)
{
int top = Math.Max(spriteA.Rectangle.Top, spriteB.Rectangle.Top);
int bottom = Math.Min(spriteA.Rectangle.Bottom, spriteB.Rectangle.Bottom);
int left = Math.Max(spriteA.Rectangle.Left, spriteB.Rectangle.Left);
int right = Math.Min(spriteA.Rectangle.Right, spriteB.Rectangle.Right);
for (int y = top; y < bottom; y++)
{
for (int x = left; x < right; x++)
{
Color colorA = spriteA.TextureData[(x - spriteA.Rectangle.Left) +
(y - spriteA.Rectangle.Top) * spriteA.Rectangle.Width];
Color colorB = spriteB.TextureData[(x - spriteB.Rectangle.Left) +
(y - spriteB.Rectangle.Top) * spriteB.Rectangle.Width];
if (colorA.A != 0 && colorB.A != 0)
return true;
}
}
return false;
}
Reprenez la méthode et ajoutez l’appel à la fonction CollisionPerPixels() en plus de la
méthode de détection qui utilise les rectangles.
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
Langage C# Opérateur &&
Lorsque vous utilisez l’opérateur && de la manière suivante :
test_A && test_B
Si le résultat de test_A est faux, test_B ne sera même pas exécuté. Ainsi, le test qui descend au niveau
de détails des pixels ne sera exécuté que si le test plus large avec les rectangles a détecté une collision
potentielle.
=Labat FM.book Page 216 Vendredi, 19. juin 2009 4:01 16
216
Passons maintenant à l’écriture de la méthode CollisionPerPixel (dans le projet exemple,
elle est rattachée à la classe ChapitreDix). La première chose à faire est de déterminer le
rectangle contenant tous les pixels concernés par la collision entre les deux sprites. Une
fois la position des quatre côtés du rectangle déterminée, utilisez-les pour parcourir le
tableau de pixels. Attention, tous les pixels sont classés de manière linéaire dans le
tableau puisque celui-ci ne comporte qu’une dimension.
Pour chacun des pixels de cette zone, vérifiez la composante alpha (la transparence). Si elle
n’est pas nulle pour les deux sprites, alors les deux sprites ne sont pas totalement transparents
et il y a collision.
protected bool CollisionPerPixels(Sprite spriteA, Sprite spriteB)
{
int top = Math.Max(spriteA.Rectangle.Top, spriteB.Rectangle.Top);
int bottom = Math.Min(spriteA.Rectangle.Bottom, spriteB.Rectangle.Bottom);
int left = Math.Max(spriteA.Rectangle.Left, spriteB.Rectangle.Left);
int right = Math.Min(spriteA.Rectangle.Right, spriteB.Rectangle.Right);
for (int y = top; y < bottom; y++)
{
for (int x = left; x < right; x++)
{
Color colorA = spriteA.TextureData[(x - spriteA.Rectangle.Left) +
(y - spriteA.Rectangle.Top) * spriteA.Rectangle.Width];
Color colorB = spriteB.TextureData[(x - spriteB.Rectangle.Left) +
(y - spriteB.Rectangle.Top) * spriteB.Rectangle.Width];
if (colorA.A != 0 && colorB.A != 0)
return true;
}
}
return false;
}
Reprenez la méthode et ajoutez l’appel à la fonction CollisionPerPixels() en plus de la
méthode de détection qui utilise les rectangles.
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
Langage C# Opérateur &&
Lorsque vous utilisez l’opérateur && de la manière suivante :
test_A && test_B
Si le résultat de test_A est faux, test_B ne sera même pas exécuté. Ainsi, le test qui descend au niveau
de détails des pixels ne sera exécuté que si le test plus large avec les rectangles a détecté une collision
potentielle.
=Labat FM.book Page 216 Vendredi, 19. juin 2009 4:01 16
