2017-09-04 4 views
0

Ich habe ein kleines Spiel mit Kacheln und einem Spieler erstellt, und ich versuche, in Kollisionserkennung zu programmieren. Also habe ich es geschafft, eine Kollision zu machen, wenn der Charakter nach links geht ('A'), um zu arbeiten, aber es funktioniert nicht, wenn es nach rechts geht ('D'). Dies ist mein Code:(C# XNA) Zeichen durch Objekte in nur einer Richtung

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; 
     } 
    } 

auf ‚A‘ drückt, Geschwindigkeit wird ein negativer Parameter sein, die Zielkachel links von dem Spieler machen, und es wird geprüft, ob jede Kachel in dem ein Rechteck aus dem Ziel Kacheln Sie in den unteren linken Bereich des Spielers. Wenn es eine Kachel gibt, wird die Bewegung abgebrochen und es funktioniert. Dasselbe funktioniert jedoch nicht für den 'D' Schlüssel, obwohl ich annahm, dass der gleiche Code für 'A' mit kleinen Änderungen für 'D' funktionieren würde.

Antwort

0

Ich weiß, ich bin einen ganzen Monat zu spät, aber dieser Typ hat mich viel im Spiel Programmierung heleped. Click here, um eine Verknüpfung zu öffnen, in der er den 'richtigen' Weg erklärt, die Kollision in 2D-Plattformen zu machen. Er erklärt die Kollision aus einer anderen Perspektive. Ich werde keinen Code posten, nur weil ich finde, dass es unterhaltsamer ist, es selbst zu machen.

Der Vorteil davon ist, dass wenn Sie die Kollision überprüfen, wenn Ihr Objekt die Wand trifft, dann ist es zu spät, etwas zu tun. Das Objekt wird höchstwahrscheinlich in die Wand gezogen. Sie müssen die nächste Position des Objekts überprüfen (indem Sie seiner Position die Geschwindigkeit X und Y hinzufügen), und wenn das Objekt dann auf die Wand trifft, bewegen Sie das Objekt direkt daneben. Auf diese Weise haben Sie nie eine Situation in der Wand. Außerdem berechnen Sie zuerst X/Y-Bewegungen, Geschwindigkeiten, Beschleunigungen und Kollision, und dann machen Sie dasselbe für die andere Achse.

Dies ist eine Art von Antwort. Ich habe dir den Code nicht gegeben, aber ich habe dir gesagt, wo du deine Antwort finden kannst. Auch hier habe ich den Code nicht zur Verfügung gestellt, weil ich denke, dass Sie viel Spaß haben werden, alles selbst zu programmieren. Ich nehme an, dass, wenn das nicht der Fall ist, du jetzt im Unity-Forum bist, nicht bei XNA.

+1

Danke dafür, aber ich habe herausgefunden, was ich falsch gemacht habe. Wenn ich die 'A' Taste drückte, blieb die Geschwindigkeit positiv und die Position wurde um die Geschwindigkeit * -1 geändert. Dies bedeutet, dass hier nur nach rechts und nicht nach links nach Fliesen gesucht wird. Ich fügte jedoch die Geschwindigkeit der Charaktere der Position hinzu und machte eine Kachel mit Kacheln, durch die das Zeichen hindurchgehen würde, wobei alle auf Kollisionen überprüft wurden. Wenn das Zeichen in diesem Feld kollidierte, wurde es schrittweise dekrementiert Geschwindigkeit um 1, und dann erneut die Box mit der neuen Geschwindigkeit, bis keine Kollisionen passiert sind, und bewegte das Zeichen. – SentriCast

+0

Eigentlich, von dem, was ich geschrieben habe, bin ich mir nicht sicher, was ich falsch gemacht habe (wie ich sagte, es war die richtige Kollision, die nicht funktioniert, anstatt die linke). Aber ich habe es vorher herausgefunden, also muss ich den Code weggelassen haben. – SentriCast