2017-09-04 3 views
0

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.

Répondre

0

Je sais que j'ai un mois de retard, mais ce type m'a beaucoup aidé dans la programmation de jeux. Click here pour ouvrir un lien où il explique la «bonne» façon de faire la collision dans les plates-formes 2D. Il explique la collision d'un autre point de vue. Je ne posterai aucun code seulement parce que je pense que vous trouverez plus amusant de le faire vous-même. Le truc c'est que si vous vérifiez la collision lorsque votre objet heurte le mur, il est trop tard pour faire quoi que ce soit. L'objet sera très probablement à l'intérieur du mur. Vous devez vérifier la position suivante de l'objet (en ajoutant sa vitesse X et Y à sa position), et si l'objet heurte le mur, déplacez l'objet juste à côté. De cette façon, vous n'aurez jamais une situation d'objet dans le mur. De plus, vous devez d'abord calculer les mouvements X/Y, les vitesses, les accélérations et la COLLISION, puis vous faites la même chose pour l'autre axe.

Voici une sorte de réponse. Je ne vous ai pas donné le code, mais je vous ai dit où trouver votre réponse. Encore une fois, je n'ai pas fourni le code, parce que je pense que vous aurez du plaisir à tout coder vous-même. Je crois que si ce n'est pas le cas, vous seriez sur les forums Unity maintenant, pas XNA.

+1

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

+0

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