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);
}
}