2012-03-25 7 views
2

Okay, also, ich mache ein kleines Kachel-basiertes Grabspiel, jetzt will ich Kollision machen. Wie würde ich das richtig machen? Ich weiß, wie man überprüft, ob der Spieler mit einer Kachel kollidiert, aber ich weiß nicht, wie man den Spieler tatsächlich stoppt, wenn er gegen eine Wand schlägt.Tile Engine Collision

enter image description here

Dies ist das Spiel, ich habe hier 20x20 Fliesen.

Dies ist der Code, ich bin mit atm:

  foreach (Tile tiles in allTiles) 
     { 
      if (ply.rect.Intersects(tiles.rect)) 
      { 
       if (tiles.ID != -1 && tiles.ID != 1) 
       { 
        if (ply.X > tiles.X) 
        { 
         Console.WriteLine("Right part."); 
         ply.X = tiles.pos.X + 30; 
        } 

        if (ply.X <= tiles.X) 
        { 
         Console.WriteLine("Left part."); 
         ply.X = tiles.pos.X - 30; 
        } 

        if (ply.Y > tiles.Y) 
        { 
         Console.WriteLine("Bottom part."); 
         ply.Y = tiles.pos.Y + 30; 
        } 

        if (ply.Y <= tiles.Y) 
        { 
         Console.WriteLine("Upper part."); 
         ply.Y = tiles.pos.Y - 30; 
        } 
       } 
      } 
     } 
+0

Machen Sie ['Terraria'] (http://terraria.org/)? – Marty

+0

@Marty Wallace: Nun, ich mache eine Art Klon, ja. – Stan

+0

Ah, Awesome^_^ – Marty

Antwort

1

Welche Art von Kollisionserkennung verwenden Sie?

Wenn Sie Rechtecke und die '.interterects'-Methode verwenden, können Sie immer einen Bool deklarieren, um sicherzustellen, dass Ihr Charakter den Boden berührt. Wenn Sie nicht sind, wenden Sie einen Gravitationsvektor an, um ihn auf die nächste Kachel mit einem anderen Rechteck fallen zu lassen. Wenn er sie trifft, wird er aufhören zu fallen.

Wenn Sie ihn von Seite zu Seite blockieren möchten, testen Sie einfach, welche Seite des Rechtecks ​​er berührt und blockieren Sie ihn auf der X-Achse zu bewegen. Wenn z. B. er nach rechts geht und sich mit dem linken Teil eines Rechtecks ​​schneidet, ist der Block "GoingRight" -Bewegung.

if(myCharacterRectangle.Intersects(tileRectangle) 
    { 

     if(myCharacterPosition.X > (tilePosition.X) 
     { 
     //You know the character hits the Right part of the tile. 
     } 

     if(mycharacterPosition.X <= tilePosition.X) 
     { 
     //You know the character hits the Left Part of the tile. 
     } 

    } 

Und das gleiche gilt für die Position.Y, wenn Sie die Top oder Bottom testen möchten.

Wenn Sie Pixel von Pixel Kollisionserkennung mit Matrizen verwenden möchten, kenne ich ein gutes Tutorial here. Die Erkennung gibt 'Vector2 (-1, -1)' zurück, wenn keine Kollision vorliegt. Wenn es eine Eins gibt, gibt die Methode die Koordinaten der Kollisionen zurück, was es noch einfacher macht zu bestimmen, welchen Teil der Fliese Ihr Charakter berührt.

Hoffe, das hilft. Viel Glück mit deinem Spiel.

+0

Ich sah Frage ähnlich wie Ihre. Vielleicht ist das, was Sie brauchen http://www.dreamincode.net/forums/topic/167529-xna-tile-collision-detection/ – phadaphunk

+0

Danke für die Hilfe, ich werde versuchen und diese Arbeit bald machen. – Stan

+0

Ich habe versucht, das linke und rechte Schlagen der Fliese, aber es funktioniert nicht, es sagte immer, dass es die linke Seite traf, egal wo ich war. Die Kollision ist ärgerlich, weil sie so viele Blöcke gleichzeitig trifft. – Stan