2012-02-27 4 views
0
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); 
      } 
     } 
    } 

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

ответ

3

Я считаю, что вы ищете только случайным образом плитки один раз, а затем сделать что случайные последовательности каждый раз. Помните, что Draw в XNA запускает каждый «кадр», который, как правило, более одного раза в секунду!

Скопируйте свои текущие петли в новую область: загрузка вашей карты. Также добавьте 2D-структуру данных (массив или что-то еще), чтобы сохранить результаты генерации вашей плитки. Я называю свой массив 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); 
     } 
    } 
+0

Спасибо! Я не знал, что нарисовал пробег каждый кадр, но я подумал, что это была проблема, когда я видел, как он мерцал. Я просто не был уверен, как справиться с получением случайного, но я получил его сейчас. Одна проблема, хотя я получаю индекс за пределами массива tileNums. Я создаю массив как этот int [,] tileNums = new int [0,3]; правильно? – Corey

+0

Нет, это размеры каждого измерения. Эта структура должна быть того же размера, что и ваша карта, поэтому я бы сделал 'new int [map.GetLength (1), map.GetLength (0)];' (так как я сделал это 'x, y', конечно, вы могли бы делать 'y, x' и отменить их) –

+0

Ahhh! Хорошо, что теперь имеет смысл, я думаю об этом: p. Спасибо, что помогли мне – Corey