2016-05-05 16 views
0

Hallo allerseits Ich habe vor kurzem begonnen, mein eigenes Plattformspiel zu machen, ich habe es geschafft, die Karte mit einem 2D-Array zu erstellen und habe auch meinen Player mit Bewegung erstellt. Ich bin jetzt fest auf, wie man sich der Rechteckkollisionsseite nähert jede Hilfe wird sehr geschätzt.Rechteck Kollisionserkennung xna

Hier ist, wie ich meine Karte erstellt habe und jetzt muss ich nur herausfinden, wie die Kollision zu nähern.

List<Texture2D> tileTextures = new List<Texture2D>(); 
    private const int tileWidth = 64; 
    private const int tileHeight = 64; 


    public void Draw(SpriteBatch spriteBatch, Camera camera) 
    {   
     int tileMapWidth = tileMap.GetLength(1); 
     int tileMapHeight = tileMap.GetLength(0); 

     for (int x = 0; x < tileMapWidth; x++) 
     { 
      for (int y = 0; y < tileMapHeight; y++) 
      { 
       int textureIndex = tileMap[y, x]; 
       Texture2D texture = tileTextures[textureIndex]; 

       spriteBatch.Draw(
        texture, 
        new Rectangle(x * tileWidth - (int)camera.cameraPosition.X, 
         y * tileHeight - (int)camera.cameraPosition.Y, 
         tileWidth, 
         tileHeight), 
        Color.White); 
      } 
     }   
    } 
+0

Von tun, was ich erinnere mich, als ich mit XNA begann, mußte man diese Rechteck-Klasse mit einer intersects Methode, die Sie bestimmen, verwenden könnten, ob ein Objekt mit einer anderen –

+0

wurde kollidiert Wissen Sie, wie Ich würde mein Spielerrechteck mit meinen Fliesen vergleichen? Da ich jedesmal ein neues Rechteck in der Kachel-Zeichnungs-Funktion setze, habe ich keine Ahnung, wie ich es tatsächlich bezeichnen würde, um zu überprüfen, ob es sich überschneidet. – Spoingen

+0

Wenn Sie XNA tun, sollten Sie wahrscheinlich eine 'update', Methode, und Sie können nur über alle Ihre Spieler und Kacheln iterieren, und ein neues Rechteck machen, und dort auf Kollisionen zu überprüfen –

Antwort

1

können Sie die Rectangle Ihres Objekts verwenden und es Intersect Methode ist wheter sie oder nicht kollidiert sind zu überprüfen.

Sie können ein wirklich einfaches Beispiel finden, wie auf meinem blog Rechteck Kollisionen zu überprüfen, wo der Benutzer klickt auf einen Feind, es zu zerstören:

if (mouseState.LeftButton == ButtonState.Pressed) 
{ 
    for (int index = this.enemies.Count - 1; index >= 0; index--) 
    { 
     if (this.enemies[index].Intersects(
       new Rectangle((int)this.mouseCoordinates.X, 
          (int)this.mouseCoordinates.Y,  
          this.mouseTexture.Width, 
          this.mouseTexture.Height))) 
     { 
      this.enemies.RemoveAt(index); 
     } 
    } 
} 
0

Was zum Erfassen Kollision großen @Nahuel Ianni sagte sind. Nun, Sie haben nicht angegeben, wofür Sie eine Kollision brauchen, und ich kann sehen, dass Sie es wahrscheinlich für zerstören werden, Feinde und Kugeln, die @Nahuel Ianni erklärte sehr gut, aber ich denke, Sie brauchen auch Kollision zwischen Spieler (n) und Wänden.

Shaun Spalding machte einen großen Punkt in this tutorial (für GameMaker) auf, wie man Kollision in einem Platformer erkennt und auflöst, der auch in Birds-Eye-View-Spiel verwendet werden kann. Kurz gesagt, in seinem Tutorial erklärt er Ihnen, wie Sie die nextRectangle * Ihres Players bekommen und prüfen, ob es irgendwelche Wände kollidiert, und wenn es ist, bewegen Sie den Spieler gerade neben dieser Wand. Auf diese Weise werden Sie keine Spieler in einer Wand sehen, wenn ein Rahmen/Spieler nicht in Wänden hängen bleiben.

* nextRectangle steht für die Rectangle (Körper) Ihres Spielers, bewegt durch die Geschwindigkeit/Kraft (welche Logik auch immer für Sie funktioniert). Das ist der Körper im nächsten Rahmen. Sie können also sagen, dass Sie in die Zukunft Ihres Spielablaufs schauen müssen, um das beste Ergebnis für eine Kollision zu erhalten (und Spieler innerhalb von Mauern zu meiden).

0

Jedes Objekt, das auf Kollisionen überprüft werden soll, sollte Rectangle enthalten. Auf diese Weise können Sie

bool isHit=obj1.Rect.Intersects(obj2.Rect);