2012-03-14 103 views
1

我正在C#和XNA中進行文明遊戲。我用一個二維整數數組,填充一個循環來生成拼貼,我做了大量的研究,並且一直無法找到像地形那樣生成地球的方法。任何人都可以解釋如何做到這一點,或至少給我可以做到這一點的代碼,但我更喜歡和解釋?謝謝。使用perlin噪聲在C#中生成地形

+1

有[這裏]看看(http://freespace.virgin.net/hugo.elias/models/m_perlin.htm)。詳細解釋,僞代碼和示例圖像。 – 2012-03-14 09:29:59

回答

8

我使用類似這樣的算法來製作我的地形。基本上它會產生一些隨機數,並使用正弦波來產生山丘,當它們結合時會產生一個很好的丘陵景觀。請注意,如果您只需要3次以上的傳球,就可以添加循環和數組值。

private void GenerateTerrain() 
    { 
     terrainContour = new int[Width*Height]; 

     //Make Random Numbers 
     double rand1 = randomizer.NextDouble() + 1; 
     double rand2 = randomizer.NextDouble() + 2; 
     double rand3 = randomizer.NextDouble() + 3; 

     //Variables, Play with these for unique results! 
     float peakheight = 20 
     float flatness = 50 
     int offset = 30; 


     //Generate basic terrain sine 
     for (int x = 0; x < Width; x++) 
     { 

      double height = peakheight/rand1 * Math.Sin((float)x/flatness * rand1 + rand1); 
      height += peakheight/rand2 * Math.Sin((float)x/flatness * rand2 + rand2); 
      height += peakheight/rand3 * Math.Sin((float)x/flatness * rand3 + rand3); 

      height += offset; 

      terrainContour[x] = (int)height; 
     } 
    } 

然後填充高度圖只是循環的值,並檢查它是否高於閾值或不。

for (int x = 0; x < Width; x++) 
{ 
    for (int y = 0; y < Height; y++) 
    { 

     if (y > terrainContour[x]) 
      tiles[x, y] = Solid Tile 
     else 
      tiles[x, y] = Blank Tile 
    } 
} 

的Theres更多,你可以添加到它,我已經添加了更多的隨機性和1縮進一些磚向上或向下更好的地形。而增加更多的正弦波將使其更加逼真。

嘗試使用2D Perlin Noise算法,並選擇一定的高度來製作洞穴和更高級的地形,因爲這是我現在所做的,但這裏的代碼是一個好的開始。

+0

如果此功能正常並且您使用它,請點擊「檢查」按鈕將其接受爲答案。 – Cyral 2012-07-08 22:39:47

+0

只需展開,您還可以添加多個Perlin噪音通道,以便將洞穴挖入地形中,或者添加一些礦石或珍品來查找,或者僅僅更改瓷磚類型/材質。 – tallen11 2012-07-10 21:02:26

+0

是的,這很容易與二維perlin噪聲算法 – Cyral 2012-07-10 21:56:39