C # XNA Случайный движок тайлов - PullRequest
0 голосов
/ 27 февраля 2012
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 Ответ

3 голосов
/ 27 февраля 2012

Я полагаю, что вы хотите только случайным образом сгенерировать плитки один раз и затем нарисовать ЭТ случайную последовательность каждый раз .Помните, что 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);
        }
    }
...