2009-04-20 9 views
1

Ich habe ein Problem und bin mir nicht sicher, wie ich die Lösung angehen soll. Ich muss einen 2D-Map-Editor für meine XNA-App mit einer bestimmten Anzahl von Kacheln erstellen. Sagen Sie eine Karte wird 50x100 Fliesen sein.XNA wie man eine 2D-Karte speichert und zeichnet?

Ich bin mir nicht sicher, welche Datenstruktur für die Karte, Kacheln und wie man sie auf der Festplatte zum späteren Laden speichert.

Was ich jetzt denke, ist dies. Ich werde wie so die Karte in einer Textdatei speichern:

//x, y, ground_type, object_type 
0, 0, 1, 0 
0, 1, 2, 1 

0 = Gras, 1 = Fluss etcc für Boden Gelände und 0 = Nichts, 1 = Wand zum Objekttyp.

Dann werde ich ein Spiel Component Map Klasse, die die Datei oder erstellen Sie eine neue von Grund auf neu lesen:

class Map : DrawableGameComponent { 
     //These are things like grass, whater, sand... 
     Tile ground_tiles[,]; 
     //These are things like walls that can be destroyed 
     Tile object_tiles[,]; 

     public Map(Game game, String filepath){ 
      for line in open(filepath){ 
       //Set the x,y tile to a new tile 
       ground_tiles[line[0], line[1]] = new Tile(line[3]) 
       object_tiles[line[0], line[1]] = new Tile(line[4]) 
      } 
     } 

     public Map(Game game, int width, int heigth){ 
     //constructor 
     init_map() 
     } 
     private void init_map(){ 
      //initialize all the ground_tiles 
      //to "grass" 
      for i,j width, heigth{ 
       ground_tiles[i,j] = new Tile(TILE.GRASS) 
      } 


     public override Draw(game_time){ 
      for tile in tiles: 
       sprite_batch.draw(tile.texture, tile.x, tile.y etc..) 

     } 

My Tile-Klasse wird wahrscheinlich kein Spiel Komponente sein. Ich bin mir immer noch nicht ganz sicher, wie ich die Kollisionserkennung zum Beispiel zwischen einem vom Spieler mit dem Kartenobjekt stammenden Geschoss behandeln soll. Sollte das von der Map-Klasse oder einer Super-Manager-Klasse gehandhabt werden?

Alle Hinweise sind willkommen. Danke!

Antwort

0

Danke, aber ich entschied mich für (ground_type, object_type) Paare. So eine Eingabedatei wie

0, 1 
0, 0, 
0, 0, 
1, 1 

mit Zuordnungen wie: GROUND = {0: Gras, 1: Straße} OBJEKTE = {0: kein, 1: Kiste} und die Breite = 2 und height = 2 von Karte wird Produkt folgende:

grass+crate | grass 
grass  | road+crate 

Zugegeben, ich habe die Breite/Höhe der Karte, um zu wissen, Sinn der Datei zu machen. Ich könnte das auch in die Eingabedatei schreiben.

1

Warum lagern Sie es nicht nur wie:

Height 
Width 
GroundType * (Height * Width) 

etwas geben wie

4 
4 
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

Es ist einfacher und kompakter. :) Was das Speichern im Spiel angeht, ist ein 2D-Array dafür ideal, es sei denn, du hast andere spezifische Bedürfnisse. Ein typisches Kollisionsdetektionsverfahren besteht darin, eine breite Phase durch ein physikalisches Subsystem auszuführen, beispielsweise mit Begrenzungskugeln oder mit Achsen ausgerichteten Begrenzungsboxen, und dann die Paare möglicherweise kollidierender Objekte zu berechnen, wenn tatsächlich eine Kollision stattgefunden hat.

Ihre Fliesenklasse sollte wahrscheinlich keine Komponente sein, es sei denn, Sie haben einen sehr zwingenden Grund.

Bearbeiten: Vergessen Sie den Objekttyp dort oben, aber es wäre auch einfach, es zu integrieren.

Verwandte Themen