2015-02-04 3 views
0

Я делаю 2-мерную игру с прокруткой и пытаюсь использовать 2-мерный или так называемый набор тайлов. Мой друг дал мне код, который он использовал для своих игр, но его код поддерживает только 1 измерение.XNA tilemap tileset

public void DrawMap(Texture2D tilesheet, SpriteBatch spriteBatch) 
    { 
     for (int x = 0; x < map.GetLength(1); x++) 
     { 
      for (int y = 0; y < map.GetLength(0); y++) 
      { 
       spriteBatch.Draw(tilesheet, new Vector2((x * 64) , (y * 64)), new Rectangle(map[y, x] * 64, 0, 64, 64), Color.White); 
      } 
     } 
    } 

это где появляется проблема, потому что это групповой проект, и мы получаем графики из графического дизайнера и у нас слишком много плитки (64x64 размера), чтобы вписаться в один ряд текстуры, которая поддерживается для XNA (4096 пикселей, я думаю). Я почти не понимаю код, который мне дал мой друг, и, вероятно, это проблема. Если кто-нибудь знает, как сделать метод draw, поддерживающий 2 измерения, так что я могу использовать плитки, это размеры (вместо 512x512) вместо 64x4992 (к которым относится мой текущий набор плиток).

public Level() 
    { 
     map = new int[14, 50] 
     {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,18,19,20,21,22,23,24,17,18,19,20,21,22,23,24,2}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,27,28,29,30,31,32,25,26,27,28,29,30,31,32,2}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,34,35,36,37,38,39,40,33,34,35,36,37,38,39,40,2}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,42,43,44,45,46,47,48,41,42,43,44,45,46,47,48,2}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,5,0,0,0,0,49,50,51,52,53,54,55,56,49,50,51,52,53,54,55,56,2}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57,58,59,60,61,62,63,64,57,58,59,60,61,62,63,64,2}, 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,11,0,0,0,0,0,0,0,0,0,65,66,67,68,69,70,71,72,65,66,67,68,69,70,71,72,2}, 
     {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,6,7,2,12,13,3,3,3,3,3,3,3,3,3,73,74,75,76,77,78,79,80,73,74,75,76,77,78,79,80,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,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,2}}; 
     overlay = new int[14, 50]; 
     background = new int[14,50]; 
    } 
    public void DrawMap(Texture2D tilesheet, SpriteBatch spriteBatch) 
    { 
     for (int x = 0; x < map.GetLength(1); x++) 
     { 
      for (int y = 0; y < map.GetLength(0); y++) 
      { 
       //http://imgur.com/1r9VUUN 
       spriteBatch.Draw(tilesheet, new Vector2((x * 64), (y * 64)), new Rectangle((map[x, y] % 8) * 64, (map[x, y]/8) * 64, 64, 64), Color.White); 
      } 
     } 
    } 

Так им редактирование мои карты в плиточные и я понял, что плиточные рассчитывает 1-2-3-4-5, не 0-1-2-3-4-5. Поэтому, если вы посмотрите на мой набор фишек (прокомментировал ссылку imgur методом draw-draw), вы увидите, что у меня есть пробел перед первой плиткой, но это означает, что каждая плитка имеет свое значение position + 1 в xna, что может быть, поэтому im проблемы его рисования, потому что плитка im, пытающаяся рисовать, не существует в тайнике.

+0

Сначала мой плохой выключатель х и порядок у, использование карты [у, x] вместо map [x, y], чтобы избежать исключения OutOfRangeException, во-вторых, я не вижу ссылки на изображение !! – Usama

+0

http://imgur.com/1r9VUUN здесь вы идете! –

ответ

2

Поскольку я не знаю точно, как ваша плитка Карта выглядит как я просто дать шаг за шагом объяснил пример:

Первый Пусть говорят, мы имеем следующее Tile Map Sheet

enter image description here

эта карта 8x3 и позволяет предположить, что каждая плитка 64X64 px, чтобы обратиться к одной из этих плит, вы могли бы использовать ее координату (x, y) в MapSheet (например, последняя плитка имеет координату (7,2) -0 на основе индекса), или более умно вы можете просто ссылаться на него как на один номер путем подсчета с первой плитки (например, предыдущая плиткой (7,2) представляют собой плитку 23)

enter image description here

вторых определить вашу карту Matrix

map = new int[,] 
{        
    {8,8,1,8,8,1}, 
    {1,8,0,8,8,8}, 
    {1,8,8,8,8,8}, 
    {1,7,8,8,8,8}, 
    {1,8,0,23,4,4}, 
    {1,8,8,1,8,8} 
}; 

каждый элемент в указанном выше Матрица является координатой плитки в TileMap,

Третий чертежная часть,

public void DrawMap(Texture2D tilesheet, SpriteBatch spriteBatch) 
{ 
    for (int x = 0; x < map.GetLength(1); x++) 
    { 
     for (int y = 0; y < map.GetLength(0); y++) 
     { 
      spriteBatch.Draw(tilesheet, new Vector2((x * 64) , (y * 64)), new Rectangle((map[x,y]%8) * 64, (map[x,y]/8)*64, 64, 64), Color.White); 
     } 
    } 
} 

в приведенном выше коде new Rectangle((map[x,y]%8) * 64, (map[x,y]/8)*64, 64, 64), представляют то, что называется Source Rectangle, что Rect используется, чтобы найти соответствующую плитку Rectangle в TileMap

+0

Итак, я просто попробовал код, который вы мне предоставили, на моем наборе 8x10, но когда я попытался его вычеркнуть, оставил меня с белым экраном и сказал, что «IndexOutOfRangeException был необработанным» - индекс был за пределами матрицы (я думаю это то, что он переводит). Поэтому я зависал над переменной x и переменной y, чтобы проверить их значения, и я получил x = 14, y = 0. Не совсем уверен, в чем проблема, может быть, мой набор плиток или что-то с кодом:/ –

+0

Итак, я создал новую матрицу (5x5), чтобы попробовать простой набор из 8x2, где верхние 8 плиток белые, а нижние зеленые, мне удалось нарисовать их в выбранном порядке. Я продолжу экспериментировать, потому что, если размер матрицы имеет значение, у нас есть проблема, потому что мы хотим, чтобы наши карты составляли около 10 000 пикселей, если не больше ... –

+0

Каков размер вашей матрицы? – Usama