2016-05-13 30 views
0

Ich habe meine Kachelkarte und meinen Player mit Bewegung erstellt.Tilemap Index außerhalb der Grenzen Kollision

Ich versuche jetzt, die Kollision zu schaffen, und ich fühle mich auf dem richtigen Weg.

Hier ist, wie ich die Karte erstellt habe.

List<Texture2D> tileTextures = new List<Texture2D>(); 
    int tileWidth = 60; 
    int tileHeight = 60; 

    public int[,] Map = new int[,] 
     { 
      {2,2,2,2,2,2,2,2,2,2}, 
      {2,2,2,2,1,2,2,2,2,2}, 
      {2,2,2,2,2,2,2,2,2,2}, 
      {2,2,2,2,2,2,2,2,2,2}, 
     }; 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     int tileMapWidth = Map.GetLength(1); 
     int tileMapHeight = Map.GetLength(0); 

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

       spriteBatch.Draw(
        texture, 
        source = new Rectangle(x *myTile.Width, 
         y * myTile.Height, 
         tileWidth, 
         tileHeight), 
        Color.White); 
      } 
     } 
    } 

Ich bin Überprüfung des 2D-Array coords mit dieser Bedingung und zu überprüfen, ob eine bestimmte Kachel ist, wo ich dann meine vorherige Position gesetzt, wenn es wahr ist.

Ich teste gerade auf 1 Kachel ATM.

public void Update(GameTime gameTime) 
    { 
     prevPosition = position; 
     input(gameTime); 

     if(tiles.Map[(int)playerPosition.X/60,(int)playerPosition.Y/60] == 1) 
     { 
      position = prevPosition; 
     } 
    } 

aber meine Spieler Position hält aus den Indexgrenzen des 2D-Arrays gehen und ich glaube, ich brauche es zu verkleinern, so dass es diese stoppt, ich habe versucht, durch die Breite der die Spiel coords Dividieren Fliesen aber das hat nicht funktioniert.

Wenn mir jemand mit der richtigen Skalierung helfen kann, wäre ich sehr dankbar.

+0

Haben Sie überprüft, welche Werte Sie bekommen, wenn Sie dies versuchen? Auch deine Karte ist nicht 60x60, es ist 4x10, was ein Problem verursachen könnte, wenn du versuchst, deinen Player dort zu positionieren. –

+0

Nein, ich habe nicht überprüft, dass ich neu bin und nicht sicher bin, wie ich das überprüfen soll. Ich habe auch versucht, durch 10 und 4 zu teilen, und ich bekomme das gleiche Problem. Irgendwelche Ideen? – Spoingen

+0

googeln und lernen, wie man den Debugger für Visual Studio und das unmittelbare Fenster verwendet. Eine Menge Entwicklungssoftware versucht herauszufinden, warum etwas etwas Unerwartetes getan hat. –

Antwort

1

Dies passiert, wenn die Position Ihres Players wie -x, y oder x, -y oder vielleicht -x, -y ist. Yor Ansatz könnte besser sein, wenn Sie ein fuction wie diese

public bool CollidesWithWall(int x, int y) 
{ 
    if(x < 0 || x > *matrix width* - 1) return false; 
    if(y < 0 || y > *matrix height* -1) return false; 
    if (Map[x,y] == 1) return true; 
    return false; 
} 

und nutzen machen würde es INSEAD der Linie tiles.Map[(int)playerPosition.X/60,(int)playerPosition.Y/60]

Oder, wenn Sie die Art der Fliese zurücks

public int CollidesWithWall(int x, int y) 
{ 
    if(x < 0 || x > *matrix width* - 1) return -1; 
    if(y < 0 || y > *matrix height* -1) return -1; 
    return Map[x,y]; 
} 

Wenn du es so machst, wirst du wissen, ob du auf einen Gesundheitstrank gestoßen bist (einfach seine ID auf 3 setzen) oder eine Wand (mit ID 1 oder so, das liegt ganz bei dir) und wenn es 0 ist, es ist leerer Platz (oder vielleicht -1). Beachten Sie, dass der "-1" -Teil insgesamt Ihnen überlassen ist. Schreiben Sie einfach eine Liste von IDs, die Sie haben und welche Artikel sie präsentieren.

Andere Vorschläge
Versuchen if(tiles.Map[(int)(playerPosition.X/60f),(int)(playerPosition.Y/60f)] == 1)

+0

Danke für die Antwort, was meinst du mit Matrixbreite und -höhe? Bezieht sich das auf die Kartenbreite und -höhe? Sorry, ich bin neu in diesem Bereich. – Spoingen

+0

das sind Dimensionen von yout 'public int [,] Map', in Ihrem Fall: 10x4. Wenn Sie 'int [,]' erstellen, haben Sie eine Matrix aus ganzen Zahlen oder ganzen Zahlen erstellt. Und so etwas wie 'strig [,]' ist eine Matrix von Streichern. – Monset

+0

Auch mit dieser Funktion, die schön und sauber für Kollision ist und ich mag es wirklich. Ich bin immer noch mit dem Problem der Array-Grenzen verlassen. Ich muss die Position der Spielerkoordinaten irgendwie verkleinern, so dass sie innerhalb der Array-Grenzen bleiben. selbst wenn ich ein 50,50-Array hätte, würde ich innerhalb weniger Bewegungen aus dem Array aussteigen. – Spoingen