2016-06-19 7 views
1

My Problem can be seen through this video.. Kollision nicht zwischen zwei 2D-Objekten im Spiel passiert, passieren sie sich, wenn einer von ihnen

bewegt wird können Sie in dem obigen Link, das sehen, bis ich Stange nach unten gut alles funktioniert, aber wie Sobald ich nach unten gehe, bleibt der Burger in der Rute stecken. Hilf mir, dass ich es nur von der Oberfläche ablenke. Etwas wie Ping-Pong-Spiel ....

Für die Ablenkung habe ich den folgenden Code-Schnipsel verwendet.

Hier Gameball bezieht sich auf den Burger und Rod bezieht sich auf die Bilder an der Spitze und am Boden.

Antwort

0

Ist Ihr CollisionRectangle die eingebaute Rectangle-Klasse in MonoGame/XNA?

Angenommen, es ist und die Schleife ist in Update, vielleicht könnten Sie versuchen, eine Pause einzufügen, so dass es aufhören wird, die Gameball-Geschwindigkeit sofort nach der ersten Änderung zu aktualisieren. Dies liegt daran, dass das Spiel 60 Mal pro Sekunde aktualisiert wird, da die Bedingung für einige Millisekunden oder so wahr sein kann, wenn das Spiel aktualisiert wird.

foreach (Bar rod in bar) 
{ 
    if(rod.CollisionRectangle.Intersects(GameBall.CollisionRectangle)) 
    { 
     GameBall.speed *= -1; 
     Console.WriteLine("game" + GameBall.speed); 
     break; 
    } 
} 

Lassen Sie mich wissen, wenn es nicht und vielleicht funktioniert, ich kann es in einem neuen Projekt versuchen, wenn ich frei bin.

+0

Dies funktioniert nicht. Das Ergebnis war das gleiche wie zuvor. –

1

Was scheint zu passieren ist, dass die Stange den Ball mehr als der Ball bewegt sich in einem Rahmen überlappt. Mit anderen Worten, wenn sich der Ball um 3 Pixel pro Bild bewegt, aber die Objekte sich um 5 Pixel überlappen, können sie nicht durch einfaches Ändern der Richtung aus der Kollision kommen. Sie müssen tatsächlich bewegen den Ball aus der Kollision zuerst.

Das heißt, Kollisionserkennung und Antwort ist immer kniffligen Code zu schreiben. Der Schlüssel besteht darin, den Erkennungscode vom Antwortcode zu trennen.

Mit anderen Worten. Für jeden Rahmen:

  1. erkennen alle Kollisionen
  2. Verschieben Sie alle Objekte

Was Sie jetzt tun Dinge, die während der Erkennungsphase bewegt. Das wird zu Schwierigkeiten führen, wenn sich zwei Objekte aufeinander zu bewegen.

Es gibt viel mehr Material zu diesem Thema, als ich in eine Antwort einfügen kann. Ich schlage vor, nach Tutorials zur AABB-Kollisionserkennung zu suchen.

0

Wenn der Ball mit der Stange schneiden, ändern Sie die Richtung, aber die Kollision ist hier noch so vielleicht können Sie dies versuchen:

foreach (Bar rod in bar) 
{    
     if(rod.CollisionRectangle.Intersects(GameBall.CollisionRectangle)) 
     { 
      GameBall.speed *= -1; 

      // Reset position of the ball 
      // Something like : 
      // For the top bar 
      Gameball.y = rod.y + rod.height; 

      // For the bottom bar 
      // Gameball.y = rod.y - Gameball.height 

      Console.WriteLine("game" + GameBall.speed);     

     } 
    } 
Verwandte Themen