2009-04-20 14 views
1

J'ai un problème et je ne sais pas comment aborder la solution. Je dois créer un éditeur de carte 2D pour mon application XNA, avec un certain nombre de tuiles. Dites qu'une carte sera de 50x100 tuiles.XNA comment stocker et dessiner une carte 2D?

Je ne sais pas quelle structure de données utiliser pour la carte, les tuiles et comment les stocker sur le disque dur pour un chargement ultérieur.

Ce que je pense maintenant est ceci. Je vais stocker la carte dans un fichier texte comme ceci:

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

où 0 = herbe, 1 = ETCC River pour un terrain au sol, et 0 = Nothing, 1 = mur pour les types d'objets.

Ensuite, je vais avoir une classe Game Component Carte qui peut lire ce fichier ou créer un nouveau à partir de zéro:

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

     } 

Ma classe de tuile ne sera probablement pas un élément de jeu. Je ne sais toujours pas comment gérer la détection de collision par exemple entre une balle provenant du joueur et l'objet carte. Est-ce que cela devrait être géré par la classe Map ou une classe de super manager?

Tous les conseils sont les bienvenus. Merci!

Répondre

0

Merci, mais j'ai décidé des paires (type_type, type_objet). Ainsi, un fichier d'entrée comme

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

avec applications comme: TERRE = {0: herbe, 1: route} OBJETS = {0: none, 1: caisse} et la largeur = 2 et height = 2 la carte sera produit les éléments suivants:

grass+crate | grass 
grass  | road+crate 

d'accord, je dois connaître la largeur/hauteur de la carte afin de donner un sens du fichier. Je pourrais aussi mettre cela dans le fichier d'entrée.

1

Pourquoi ne pas stocker tout comme:

Height 
Width 
GroundType * (Height * Width) 

Donner quelque chose comme

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

Il est à la fois plus facile et plus compact. :) Comme pour le stockage dans le jeu, un tableau 2D est parfait pour cela, sauf si vous avez d'autres besoins spécifiques. Une technique de détection de collision typique consiste à faire effectuer une phase large par un sous-système de physique, avec des sphères de délimitation ou des boîtes de délimitation alignées par axe, puis calculer les paires d'objets pouvant entrer en collision s'il y a effectivement collision.

Votre classe de tuile ne devrait probablement pas être un composant, sauf si vous avez une raison très convaincante.

Editer: J'ai oublié le type d'objet, mais il serait facile de l'intégrer aussi.