2009-04-20 43 views
1

我有一個問題,我不知道如何處理解決方案。 我需要爲我的XNA應用程序創建2D地圖編輯器,並添加一定數量的圖塊。 說一個地圖將是50x100的瓷磚。XNA如何存儲和繪製2D地圖?

我不確定什麼數據結構用於地圖,瓷磚以及如何將它存儲在硬盤上供以後加載。

我現在的想法是這樣的。我將地圖存儲在文本文件中,像這樣:

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

其中0 =草,1 =河ETCC地面地形,和0 =無,1 =牆對象類型。

然後,我將有一個可以讀取該文件或者從頭開始創建一個新的一個遊戲組件地圖類:

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..) 

     } 

我的瓷磚類可能不會是一個遊戲組件。 我仍然不確定如何處理來自玩家的子彈與地圖對象之間的碰撞檢測。是否應該由Map類或某種超級Manager類來處理?

歡迎任何提示。 謝謝!

回答

0

謝謝,但我決定(ground_type,object_type)對。 所以一個輸入文件等

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

與像映射: GROUND = {0:草,1:道路} OBJECTS = {0:無,1:板條箱} ,寬度= 2和高度= 2的地圖將產品如下:

grass+crate | grass 
grass  | road+crate 

當然,我必須知道地圖的寬度/高度,以便理解文件。我也可以把它放在輸入文件中。

1

爲什麼不直接將其存儲爲:

Height 
Width 
GroundType * (Height * Width) 

給予類似

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

它既是更簡單,更緊湊。 :)至於遊戲存儲,2D陣列對此非常適用,除非您有其他特定需求。一個典型的碰撞檢測技術是由一個物理子系統完成的一個廣泛的階段,例如邊界球體或軸對齊的邊界框,然後有可能碰撞的對象對來計算是否實際上存在碰撞。

你的瓷磚類應該不應該是一個組件,除非你有一個非常有說服力的理由。

編輯:忘記了那裏的對象類型,但它也很容易集成它。