C# XNA Случайный движок тайлов

public void Draw(SpriteBatch theSpriteBatch)
    {
        Random rand = new Random();
        for(int y = 0; y < map.GetLength(0); y++) {
            for(int x = 0; x < map.GetLength(1); x++) {
                theSpriteBatch.Draw(tile[rand.Next(0,3)], new Rectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight), 
                    Color.White);
            }
        }
    }

Когда я делаю это, он просто мерцает плитки и постоянно перерисовывает их. Что я делаю, чтобы получить случайный эффект с помощью рисования только один раз? Есть ли способ, которым я мог бы щелкнуть мышью по этим плиткам и изменить их? Кроме того, есть ли способ сделать одну плитку более распространенной, чем другие?

1 ответ

Решение

Я полагаю, что вы хотите только случайным образом генерировать тайлы один раз, а затем каждый раз рисовать ТАКУЮ случайную последовательность. Помните, Draw в XNA запускается каждый "фрейм", что обычно бывает чаще, чем раз в секунду!

Скопируйте ваши текущие циклы в новую область: ваша загрузка карты. Также добавьте двухмерную структуру данных (массив или что-то еще) для хранения результатов генерации вашего тайла. Я называю мой образец 2D целочисленного массива tileNums, Теперь оставьте циклы такими, какие они есть, но измените внутренние параметры, чтобы сохранить результаты вместо рисования:

    Random rand = new Random();
    for(int y = 0; y < map.GetLength(0); y++) {
        for(int x = 0; x < map.GetLength(1); x++) {
            tileNums[x, y] = rand.Next(0,3);
        }
    }

Теперь просто измените внутренности вашего текущего Draw цикл, чтобы больше не генерировать случайно и вместо этого взять из этих данных:

    //Random object no longer needed
    for(int y = 0; y < map.GetLength(0); y++) {
        for(int x = 0; x < map.GetLength(1); x++) {
            theSpriteBatch.Draw(tile[tileNums[x, y]], new Rectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight), 
                Color.White);
        }
    }
Другие вопросы по тегам