XNA как хранить и рисовать 2d карту? - PullRequest
1 голос
/ 20 апреля 2009

У меня проблема, и я не уверен, как подойти к решению. Мне нужно создать редактор 2D-карт для моего приложения XNA с определенным количеством плиток. Скажем, карта будет размером 50x100.

Я не уверен, какую структуру данных использовать для карты, тайлов и как сохранить ее на жестком диске для последующей загрузки.

То, о чем я сейчас думаю, это следующее. Я буду хранить карту в текстовом файле примерно так:

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

где 0 = трава, 1 = река и т. Д. Для рельефа местности, и 0 = ничего, 1 = стена для типов объектов.

Тогда у меня будет класс Game Component Map, который сможет прочитать этот файл или создать новый с нуля:

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

      }

Мой класс Tile, вероятно, НЕ будет игровым компонентом. Я все еще не совсем уверен, как обращаться с обнаружением столкновений, например, между пулей, исходящей от игрока с объектом карты. Должно ли это обрабатываться классом Map или каким-либо супер-классом менеджера?

Любые намеки приветствуются. Спасибо!

Ответы [ 2 ]

1 голос
/ 20 апреля 2009

Почему бы просто не сохранить его как:

Height 
Width
GroundType * (Height * Width)

Что-то вроде

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

Это и проще, и компактнее. :) Что касается хранения в игре, 2D-массив идеально подходит для этого, если у вас нет других особых потребностей. Типичный метод обнаружения столкновений состоит в том, чтобы иметь широкую фазу, выполняемую подсистемой физики, например, с ограничивающими сферами или ограничивающими осями ограничивающими прямоугольниками, а затем иметь пары потенциально сталкивающихся объектов для вычисления, если в действительности произошло столкновение. 1007 *

Ваш класс плиток, вероятно, не должен быть компонентом, если у вас нет веских причин.

Редактировать: Забыл тип объекта там, но было бы легко интегрировать его.

0 голосов
/ 20 апреля 2009

Спасибо, но я определился с парами (ground_type, object_type). Таким образом, входной файл, как

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

с отображениями типа: ЗЕМЛЯ = {0: трава, 1: дорога} ОБЪЕКТЫ = {0: нет, 1: ящик} и ширина = 2 и высота = 2 карты приведут к следующему:

grass+crate  |   grass 
grass        |   road+crate

Конечно, мне нужно знать ширину / высоту карты, чтобы разобраться в файле. Я мог бы также поместить это во входной файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...