2012-02-27 85 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

我相信你正在尋找只隨機生成的瓦片一次然後繪製每次由隨機序列。請記住,XNA中的Draw運行每個「幀」,這通常每秒鐘超過一次!

將當前循環複製到新區域:加載地圖。還要添加一個2D數據結構(數組或其他)來存儲您的tile生成結果。我打電話給我的示例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 2012-02-27 07:19:17

+0

不,那些是每個維度的大小。這個結構應該和你的地圖大小完全一樣,所以我會做'new int [map.GetLength(1),map.GetLength(0)];'(因爲我做了'x,y',當然你可以做'y,x'並將它們反轉) – 2012-02-27 07:23:59

+0

啊!好吧,現在我想到它是非常有意義的:p。非常感謝幫助我 – Corey 2012-02-27 07:28:50