Bonjour à tous et à toutes,
Je travaille actuellement sur un Projet XNA et j'ai quelques petits soucis sur la physique du jeu.
En cherchant un moyen simple de faire de la Physique pour un jeu 2D, j'ai voulu essayer d'utiliser une sorte de collision par pixel en m'inspirant de celle-ci qu'on peut trouver un peu partout sur le net :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| private bool IntersectPixels(Rectangle rectangleA, Color[] dataA, Rectangle rectangleB, Color[] dataB)
{
int top = Math.Max(rectangleA.Top, rectangleB.Top);
int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom);
int left = Math.Max(rectangleA.Left, rectangleB.Left);
int right = Math.Min(rectangleA.Right, rectangleB.Right);
for (int y = top; y < bottom; y++)
{
for (int x = left; x < right; x++)
{
Color colorA = dataA[(x - rectangleA.Left) +
(y - rectangleA.Top) * rectangleA.Width];
Color colorB = dataB[(x - rectangleB.Left) +
(y - rectangleB.Top) * rectangleB.Width];
if (colorA.A != 0 && colorB.A != 0)
{
return true;
}
}
}
return false;
} |
Voici le principe :
Je crée une nouvelle image que je charge en noir et blanc. Ce qui est en noir représente les points ou le joueur ne doit pas avoir accès, ce qui est en blanc la surface de jeu où le joueur peut marcher.
Pour vous donner une idée de la chose:
http://nsa26.casimages.com/img/2011/...2351125776.png
Bref, j'ai donc repris cette méthode en mettant tout simple un test différent :
if (colorA.A != 0 && colorB != Color.Black)
J'ai crée deux rectangles :
Classe Heros.cs :
personRectangle = new Rectangle((heros.Position.X), heros.Position.Y,(heros.SourceRectangle.Value.Width*heros.Scale.X), (heros.SourceRectangle.Value.Height*heros.Scale.Y));
Classe Level1.cs :
RectPhysique = new Rectangle(level1_physique.SourceRectangle.Value.X, level1_physique.SourceRectangle.Value.Y, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
Le problème viens avant tout du rectangle "RectPhysique" je pense mais je n'en suis pas sûr.
Pour le Sprite "level1_physique" on l'affiche partiellement et que l'on resize par rapport à la taille de la fenêtre et on applique une méthode de scrolling lorsque le Héros touche les bords de la fenêtre.
Le sprite est défini comme ceci :
level1_physique = new Sprites(new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), new Rectangle(0, 0, 430, 206));
Voila, j'ai donc quelques soucis sur le rectangle. Je pense que les composantes x et y sont bonnes mais pour le width et la height je n'en suis absolument pas certains.
Si vous pourriez m'aider ce serrais super
Bonne journée.
Partager