2012-03-14 3 views
1

저는 C# 및 XNA의 문명 게임을하고 있습니다. 타일을 생성하기 위해 루프로 채워진 2 차원 정수 배열을 사용합니다. 톤 연구를 수행했으며 지형과 같은 지구를 생성하는 방법을 찾을 수 없었습니다. 누구든지이 작업을 수행하는 방법을 설명하거나 내가 할 수있는 코드를 적어도 제공 할 수 있습니까? 고맙습니다.Perlin 노이즈를 사용하여 C#으로 지형 생성

+1

보십시오 [여기] (http://freespace.virgin.net/hugo.elias/models/m_perlin.htm). 자세한 설명, 의사 코드 및 예제 이미지. –

답변

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

+0

확장하기 만하면 여러 개의 Perlin 노이즈 패스를 추가하여 동굴을 동굴로 끌거나 일부 광석이나 보물을 추가하거나 타일 유형/재료를 변경하기 만하면됩니다. – tallen11

+0

2d perlin 노이즈 알고리즘으로 쉽게 이해할 수 있습니다. – Cyral