J'ai créé un petit jeu avec des tuiles et un joueur, et j'essaye de programmer la détection de collision. Donc, j'ai réussi à faire une collision quand le personnage va à gauche ('A') pour fonctionner, mais ça ne marche pas quand ça va bien ('D'). Ceci est mon code:(C# XNA) Caractère passant à travers des objets dans une seule direction
public bool ColX(Texture2D sprite, Vector2 pos, float speed)
{
float PosLeftX = pos.X;
float PosUpY = pos.Y;
float PosRightX = pos.X + sprite.Width;
float PosDownY = pos.Y + sprite.Height;
float DestX = pos.X + speed;
Vector2 tileTopLeft = GetTile(PosLeftX, PosUpY); //using PosLeftX and PosLeftY to set top left tile to a variable
Vector2 tileBotLeft = GetTile(PosLeftX, PosDownY);
Vector2 tileTopRight = GetTile(PosRightX, PosUpY);
Vector2 tileBotRight = GetTile(PosRightX, PosDownY);
Vector2 tileDestUp = GetTile(DestX, PosUpY);
Vector2 tileDestDown = GetTile(DestX, PosDownY);
if(tileTopRight.X < tileDestUp.X)
{
float startX = tileTopRight.X;
float finishX = tileDestUp.X;
float startY = tileTopRight.Y;
float finishY = tileBotRight.Y;
for (int l = (int)startX; l <= finishX; l++)
{
for (int i = (int)startY; i <= finishY; i++)
{
if (tileList[l, i] != null)
{
return true;
}
}
}
return false;
}
else if (tileTopLeft.X > tileDestDown.X)
{
float startX = tileDestUp.X;
float finishX = tileTopLeft.X;
float startY = tileDestUp.Y;
float finishY = tileDestDown.Y;
for (int l = (int)startX; l <= finishX; l++)
{
for (int i = (int)startY; i <= finishY; i++)
{
if (tileList[l, i] != null)
{
return true;
}
}
}
return false;
}
else
{
return false;
}
}
En appuyant sur « A », la vitesse sera un paramètre négatif, ce qui rend la tuile de destination à la gauche du joueur, et il vérifiera si chaque tuile dans le rectangle de la destination tuile à la zone de la tuile inférieure gauche du joueur. S'il y a une tuile, le coup est annulé, et cela fonctionne. Cependant, la même chose ne fonctionne pas pour la touche 'D', bien que je suppose que le même code pour 'A' fonctionnerait pour 'D', avec des modifications mineures.
Merci pour cela, mais j'ai compris ce que j'avais mal fait. Lorsque j'appuyais sur la touche «A», la vitesse restait positive et la position changeait de vitesse * -1. Cela signifie que, ici, il ne vérifie que les tuiles à droite, pas à gauche. J'ai ajouté la vitesse des personnages à la position, et j'ai fait une boîte de carreaux où le personnage passait, vérifiant les collisions tout au long, et dans une méthode différente, si le personnage entrait en collision dans cette boîte, il bouclait en décrémentant vitesse par 1, puis redis la boîte avec la nouvelle vitesse, jusqu'à ce qu'aucune collision ne se produise, et déplacé le personnage. – SentriCast
En fait, d'après ce que j'ai écrit, je ne suis pas sûr de ce que j'ai fait de mal (comme je l'ai dit, c'était la bonne collision qui ne fonctionnait pas, plutôt que la gauche). Mais, je l'ai compris avant, donc j'ai dû laisser de côté tout code qui l'a cassé. – SentriCast