как сделать карту в xna 4 с матрицей из текстового файла

Я пытаюсь сделать карту, читая текстовый файл построчно (потому что я не могу найти, как это сделать слово за словом). Итак, я делаю map00.txt, который выглядит как «33000000111» (каждое число — это одна строка, первые 2 строки — это количество столбцов и строк, поэтому матрица, в которую я загружаю ее, выглядит как 000 000 111). Теперь я должен нарисовать 3 плитки внизу (1 = нарисовать плитку). Я делаю это, рисуя плитку в ее положении в матрице * высота окна (ширина) / число строк (столбцов) матрицы. ПРОБЛЕМА: я не могу получить правильные параметры для текущей ширины и высоты окна.

Код для загрузки тайлов:

    public int[,] LoadMatrix(string path) 
    {
        StreamReader sr = new StreamReader(path);
        int[,] a = new int[int.Parse(sr.ReadLine().ToString()), 
                           int.Parse(sr.ReadLine().ToString())];

        for(int i = 0; i < a.GetLength(0); i++)
            for (int j = 0; j < a.GetLength(1); j++)
            { a[i, j] =int.Parse(sr.ReadLine().ToString()); }

        sr.Close();
        return a;
    }

Код для рисования тайлов:

    public void DrawTiles(SpriteBatch sp, GraphicsDeviceManager gdm)
    {
        for(int i = 0; i < matrix.GetLength(0); i++)
            for(int j = 0; j < matrix.GetLength(1); j++)
            {
                if (i == 1)
                {
                    sp.Draw(tile, 
                            new Rectangle(j * (gdm.PreferredBackBufferWidth / 3),//matrix.GetLength(1),
                                          i * (gdm.PreferredBackBufferWidth / 3),//matrix.GetLength(0),
                                          gdm.PreferredBackBufferWidth / matrix.GetLength(1),
                                          gdm.PreferredBackBufferHeight / matrix.GetLength(0)),
                            Color.White);
                }
            }
    }

но в результате они рисуются примерно на 40 пикселей выше нижней части экрана!

и я пробовал с GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height(Width), но получаю тот же результат. И когда я помещаю рассчитанные числа, которые должны (теоретически) быть шириной/столбцами и высотой/строками, я получаю то, что хочу. Поэтому любые предложения будут ОЧЕНЬ оценены, потому что я давно застрял в этом в Google и Stack Overflow.


person Monset    schedule 12.02.2013    source источник
comment
Разве вы не хотите указать gdm.PreferredBackBufferHeight / 3 в качестве координаты y прямоугольника (вместо ... Width).   -  person Nico Schertler    schedule 13.02.2013
comment
Почему у вас есть if (i==1) ?   -  person jgallant    schedule 13.02.2013


Ответы (1)


Вот переработанная версия вашего кода Draw, которая должна работать:

public void DrawTiles(SpriteBatch sp, GraphicsDeviceManager gdm)
{ 
    //You would typically pre-compute these in a load function
    int tileWidth = gdm.PreferredBackBufferWidth / matrix.GetLength(0);
    int tileHeight = gdm.PreferredBackBufferWidth / matrix.GetLength(1);

    //Loop through all tiles
    for(int i = 0; i < matrix.GetLength(0); i++)
    {
        for(int j = 0; j < matrix.GetLength(1); j++)
        {
            //If tile value is not 0
            if (matrix[i,j] != 0)
            {
                 sp.Draw(tile, new Rectangle(i * tileWidth, j * tileHeight, tileWidth, tileHeight), Color.White);
            }
        }
  }
}
person jgallant    schedule 13.02.2013