Prawidłowy sposób „losowego” generowania płynnego terenu

9

Tworzę prostą grę RTS z góry na dół. Planuję na nim „losowo” generować mapy w locie, kiedy zajdzie taka potrzeba. Planuję, żeby wszystko działało w „karnetach”:

  1. Wypełnij teren całą trawą
  2. Wróć i dodaj losowe strumienie żwiru
  3. Zaokrąglij żwir
  4. Narysuj Krajobraz górski na drugiej warstwie
  5. Zaokrąglaj góry
  6. itd itd.

Teraz spójrz na to zdjęcie poniżej:

wprowadź opis zdjęcia tutaj

Ręcznie stworzyłem to za pomocą mojego edytora map, ale planuję, że będzie to wynik po, mam nadzieję, przejściu / kroku 3.

Jak powinienem decydować, kiedy i gdzie powinienem umieścić żwir, aby miał on co najmniej nieregularny kształt i wystarczająco sporadyczny, aby wyglądał naturalnie?

Dzięki, jeśli możesz! Wszelka pomoc jest mile widziana!

Na marginesie:

Każde przejście w zasadzie polega na iteracji przez wszystkie moje kafelki (mapa jest podzielona na kafelki 40x40) podobnie do tego:

for (int x = 0; x <= GRIDMAX - 1; x++) {
    for (int y = 0; y <= GRIDMAX - 1; y++) {
        //Terrain(x, y, 0) = SomethingHere;
    }
}
Freesnöw
źródło

Odpowiedzi:

5

Możesz grać z Perlin Noise ( zobacz moją implementację StackOverflow ), aby wygenerować mapę wysokości. Z mapy wysokości można mapować określone zakresy wysokości na różne kafelki. Coś jak:

  • Top 20% śniegu
  • Kolejne 20% żwir
  • Następne 40% trawa
  • Ostatnie 20% wody

Będziesz musiał grać z wartościami generatora hałasu Perlin, aby uzyskać teren, który można wygenerować i ładnie wyglądać.

Nick Banks
źródło
5

Jak powiedzieli inni, hałas perlinowy powinien być dobrym źródłem danych przy podejmowaniu decyzji, gdzie należy umieścić różne rodzaje kafelków. Chciałbym uzupełnić ten pomysł i połączyć dwa dodatkowe zasoby, które powinny być pomocne w trzecim kroku na liście kontrolnej - zaokrąglaniu rogów .

Jest to proces nazywany automatycznym kafelkami i nie jest wcale taki trudny do wdrożenia. Można to zrobić na wiele różnych sposobów, ale większość z nich polega na obliczeniu informacji o sąsiedztwie dla każdego kafelka, aby zdecydować, która grafika powinna zostać narysowana w tym miejscu.

Bardzo eleganckim sposobem rozwiązania tego problemu jest przypisanie unikalnej wartości flagi do każdego sąsiedniego kierunku kafelka i ułożenie arkusza spriteheset w taki sposób, aby wartość uzyskana przez dodanie wszystkich sąsiadujących flag kafelka odpowiadała prawidłowej pozycji kafelek w arkuszu sprite. Przeczytaj ten artykuł, aby uzyskać bardzo jasny opis techniki.

A oto kolejny zasób, który opisuje inną odmianę techniki.

David Gouveia
źródło
Hej, żeby Cię poinformować, twoja odpowiedź była niezwykle pomocna, jeśli chodzi o zaokrąglanie rogów. Dzięki tona :) To właściwie wszystko teraz działa (nawet zaokrąglanie rogów)!
Freesnöw,
4

Zasadniczo możesz używać generowania szumów Perlina do generowania map. Próbowałbyś wygenerować mapę wysokości i przypisać bloki żwiru do części mapy, które mają powyżej określonej wysokości.

Oto doskonały punkt informacyjny na temat wdrażania takiego systemu i różnych rodzajów terenu, który można wygenerować.

Przykłady zawierają o wiele więcej kroków, niż byś potrzebował, ale koncepcja jest taka sama.

Więcej na temat genów świata typu Minecraft

http://www.gamedev.net/blog/33/entry-2227887-more-on-minecraft-type-world-gen/

wprowadź opis zdjęcia tutaj

David Young
źródło