2017-02-03 5 views
2

Ich habe ein paar Probleme mit 2D-Kollisionserkennung in meinem Spiel.
Das Problem ist, dass das Rechteck meines Spielers eine Kreuzung mit den Rechtecken anderer Objekte nicht korrekt registriert.Ursprung des Rechtecks ​​für Kollisionserkennung in MonoGame

Ich frage mich, ob die Ursprungsvariable, die ich verwendet habe, um meinen Player zu drehen, irgendetwas mit meinem Problem zu tun hat und wie ich es beheben kann.

Ich werde das Problem genauer erklären, aber hier ist mein Code zuerst: HINWEIS: Herkunft ist vom Typ Vector2, Winkel ist vom Typ float, alle Kollisionsrechtecke sind vom Typ Rectangle.

//Player.Update method 

     //origin needs to be in update, because position of source changes for every frame of animation 
     origin = new Vector2(Width/2, Height/2); 
     playerDirection = new Vector2((float)Math.Sin(angle), (float)Math.Cos(angle)); 

     //Updating the position of my collision rectangle 
     collisionRect.X = (int)position.X; 
     collisionRect.Y = (int)position.Y; 

     //Changing the values of angle while key is pressed 
     if (Keyboard.GetState().IsKeyDown(Keys.A)) 
     { 
      angle -= 0.05f; 
     } 

     if (Keyboard.GetState().IsKeyDown(Keys.D)) 
     { 
      angle += 0.05f; 
     } 
     //Updating player's position 
     if (Keyboard.GetState().IsKeyUp(Keys.X)) 
     { 
      keyPress = false; 
     } 

     if (Keyboard.GetState().IsKeyDown(Keys.W)) 
     { 
      position -= playerDirection * Speed; 
     } 

     if (Keyboard.GetState().IsKeyDown(Keys.S)) 
      position += playerDirection * Speed; 
     //Checking for collision detection with background objects 
     if(BackgroundMaker.collisionPositions.Count >= 1) 
     { 
      foreach(Rectangle colPos in BackgroundMaker.collisionPositions) 
      { 
       if(collisionRect.Intersects(colPos)) 
       { 
        if (collisionRect.X < colPos.Right) 
         position.X = colPos.Right; 
       } 
      } 
     } 
    } 
} 

Das Problem mit diesem Code ist, mein Spieler kollidiert nur mit der Wand, wenn er auf halbem Weg ist. Ich habe noch keine Kollision für die rechte, obere und untere Seite implementiert, nur für die linke Seite.

Hier ist, wie es aussieht: enter image description here

Vielen Dank im Voraus für jeden, der mir diese Frage beantworten helfen kann. Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen.

+0

Ich würde empfehlen, eine Debug-Modus mit dem Sie das Kollisionsbox für den Spieler ziehen , dann wird es deutlicher, was passiert – Ben

+0

Wie groß ist das Kollisionsrechteck? – Ben

+1

@Ben Die Größe des Rechtecks ​​ist 32x32, was der Größe der Breite und Höhe des Zeichen-Sprites entspricht. –

Antwort

2

Ihr Code funktioniert, wie Sie

if (collisionRect.X < colPos.Right) 
    position.X = colPos.Right; 

Hier können Sie prüfen, wird angewiesen, wenn die Mitte des Kollisionsbox kleiner als die rechte Seite des Objekts und dann den Spieler Mitte Position auf der rechten Seite des Objekts, daher kann die Mitte des Spielers nicht weiter gehen als das Objekt, das es schneidet.

Dies ist jedoch nicht unter Berücksichtigung der Spieler Breite

Sie müssen Ihren Code anzupassen eher wie dies funktioniert:

float halfWidth = 16.0f; // ideally add a width to the player class and divide by 2 
if (collisionRect.X - halfWidth < colPos.Right) 
    position.X = colPos.Right + halfWidth; 
+1

Danke für die Antwort! Ich wusste nicht, dass die X- und Y-Koordinaten der Mitte des Sprites entsprechen. Ich war mir sicher, dass sie der oberen linken Seite entsprachen und so wird das Rechteck damit erstellt –

Verwandte Themen