Losowe generowanie map

63

Rozpoczynam / rozpocząłem grę RPG 2D tilemap w Javie i chcę zaimplementować generowanie losowych map. Mam listę różnych kafelków (brud / piasek / kamień / trawa / żwir itp.) Wraz z kafelkami wody i kafelkami ścieżek, mam problem z tym, że nie mam pojęcia, od czego zacząć losowe generowanie mapy.

Musiałby mieć sekcje terenu (tak jak jego część to piasek, część brudu itp.). Podobnie jak w Minecraft, gdzie masz różne biomy i płynnie się ze sobą przekształcają. Na koniec musiałbym również dodać do tego losowe ścieżki, a także iść w różnych kierunkach na całej mapie.

Nie proszę nikogo, aby napisał mi cały kod lub cokolwiek innego, po prostu pionieruj mnie we właściwym kierunku, proszę.

tl; dr - Wygeneruj mapę kafelków z biomami, ścieżkami i upewnij się, że biomy płynnie się ze sobą łączą.

Tom O
źródło

Odpowiedzi:

68

Wśród wielu innych powiązanych pytań na stronie znajduje się często powiązany artykuł na temat generowania map: Poligonalna generacja map dla gier można uzyskać kilka dobrych strategii z tego artykułu, ale tak naprawdę nie można go używać w obecnej postaci.

Nie jest to samouczek, ale artykuł o tym, jak generowane są mapy świata fortecy krasnoludów. Zasadniczo generujesz wiele warstw hałasu, dla wysokości, wilgotności, temperatury i zasolenia. Wtedy użyłbyś czegoś takiego:

wprowadź opis zdjęcia tutaj

Albo to

wprowadź opis zdjęcia tutaj

do generowania biomów na podstawie wytworzonych wcześniej warstw hałasu. Zazwyczaj daje to dość płynne przejście między biomami, a przejścia są logiczne. Modyfikuję również mapy wilgotności i temperatury na podstawie wysokości. To naturalnie generuje „linię drewna” i produkuje skaliste góry z ośnieżonymi czapkami.

Używam tej strategii w mojej grze, która bardzo szybko tworzy takie mapy:

wprowadź opis zdjęcia tutaj

Dodatkowo możesz zobaczyć, jak przewijam kilka kolejnych map na początku tego filmu .

A oto kilka innych rzeczy na początek:

Jak mogę stworzyć losowy „świat” w silniku kafelkowym?

Jak mogę zidentyfikować regiony obiektów w świecie generowanym proceduralnie?

Jak utworzyć stały hałas z kafelków podczas generowania mapy?

MichaelHouse
źródło
Chociaż ten link do generowania map wielokątów dla gier jest bardzo fajnym artykułem, nie sądzę, aby dobrze pasował do tego pytania, ponieważ a) nie jest siatką mapowania ib) nie ma biomów - tekstura terenu jest na podstawie wysokości.
Tapio
@Tapio Masz rację, zaktualizowałem więcej informacji.
MichaelHouse
@ Byte56 Dziękuję, wszystko to daje mi punkt wyjścia! :)
Tom O
@ Byte56 Zauważyłem, że wspomniałeś moje pytanie sprzed kilku lat, więc zaktualizowałem je o działający kod!
Nick Badal
1
BTW projekt generowania mapy wielokątów został stworzony dla gry, która miała mapę kafelków, która nie wyświetlała wysokości. Wysokości i wielokąty służą do generowania biomów, ale w rzeczywistości nie są pokazywane w grze.
amitp
29

Podczas gdy inne odpowiedzi tutaj są naprawdę dobre do generowania rodzajów statycznych krajobrazów, które byłyby odpowiednie dla tej konkretnej potrzeby. Istnieją inne metody, które mogą znaleźć osoby, które napotkają to pytanie, jeśli chcą tworzyć krajobrazy, które zmieniają się w czasie lub wydają się bardziej realistyczne, można zastosować tę technikę.

W przeciwieństwie do innych odpowiedzi zaczynasz od zupełnie pustej mapy. Zacznij od tego, co uważasz za poziom morza. Użyj Perlin Noise, aby dodać bardzo niewielką zmienność, jeśli masz 256 możliwych wzniesień, nie zmieniaj więcej niż 3-5 w obu kierunkach. To buduje pierwsze kilka miliardów lat twojego krajobrazu bez konieczności przeprowadzania symulacji przez tak długi czas.

Płyty tektoniczne

Podziel mapę wzdłuż prostych lub zakrzywionych linii, aby utworzyć płyty, im bardziej szczegółowy kształt płytek, tym ciekawszy będzie Twój krajobraz. Trzymaj je duże. Daj każdej płycie kierunek, prędkość. W określonym przedziale czasowym przesuwaj płytki po mapie krok po kroku, przeciągając wszystkie płytki nad nimi.

Kiedy dwie płyty się skrzyżują, dokonaj wyboru, który przejdzie, a który pod, wybór może być losowy. Płytki na płytkach oznaczonych poniżej są natychmiast zmniejszane o 5 kroków. Gdy tabliczka zostanie wyznaczona powyżej lub poniżej, wszystkie przyszłe interakcje z płytkami będą podlegały następującym zasadom:

  • Gdy wyznaczona płytka przecina nieoznaczoną płytę, nieoznaczona płytka staje się typem przeciwnym. (Tak więc płyty UD stają się niższe podczas przekraczania.)
  • Tam, gdzie ponad płytą znajduje się nad płytą spodnią, wszystkie te płytki przesuwają się w górę o 0-1 stopni wysokości, a płytki podążają ścieżką ponad płytą.
  • Tam, gdzie ponad płytą przecina się ponad płytą, wszystkie te płytki przesuwają się o 1-2 kroki w górę, a płytki w obszarze krzyżowania nie dryfują.
  • W przypadku, gdy płyta dolna przecina płytę dolną, wszelkie płytki w obszarze o wysokości większej niż znak 66% dla obu płyt w obszarze krzyżowania przesuwają się w górę o 1-3 kroki (tak jakby przez aktywność wulkaniczną spowodowało to powstanie wysp przez wystarczająco długi czas ) i płytki w tym obszarze przestają dryfować.

Wszystkie płyty, które przechodzą powoli o 20% ich bieżącej prędkości na każdym kroku. Aby zwiększyć realizm, dodaj losową zmianę od -10% do 10% w każdym kroku.

Po wykonaniu żądanej liczby kroków. Prawdopodobnie 5-10 to dużo. Wszelkie płytki, w których nie ma rezydentów, należy upuścić na najniższy istniejący poziom.

Duży czy mały?

Tej mapy można używać w takiej postaci, w jakiej jest, lub ją rozszerzać, aby utworzyć znacznie większą mapę, dzieląc ją na kawałki kafelków (komórek) 4X4 i rozszerzając te sekcje na podstawie ich indywidualnych wysokości. Traktuj rzędną każdej komórki jako punkt i utwórz gładką gradację na większej mapie między tymi punktami. Tak więc, jeśli większa mapa to 40 x 40 zamiast 4 x 4, a punkt (0,0) to 10, a punkt (0,1) to 1, płytki na większej mapie między nimi wynoszą 10,9,8,7,6 , 5,4,3,2,1 wysokości. Ponadto można dodać hałas Perlina, aby wygładzić zbocza. Ogólnie rzecz biorąc, technika skalowania jest podobna do algorytmu Diamond Square .

woda

Symulacja rzek i jezior, oceanów i zbiorników wodnych. Wolę używać automatów komórkowych .

Wysokości stają się liczbami zmiennoprzecinkowymi lub rozszerzonymi zakresami int, aby umożliwić dokładniejsze śledzenie. Komórki wodne mają wartości nasycenia, powiedzmy w zakresie 1-256. Mapy powinny zaczynać się równomiernie. Będziesz musiał grać z liczbami dla poszczególnych rozmiarów map, jednak ogólnie będziesz przestrzegać zasad mniej więcej takich:

  • Jeśli sąsiednia komórka jest bardziej nasycona, zwiększ nasycenie i zyskaj wysokość.
  • Jeśli sąsiednia komórka jest mniej nasycona, zmniejsz nasycenie i strac wysokość.

Dokonaj tego sprawdzenia dla każdej sąsiedniej komórki. Przeprowadź wystarczającą liczbę kroków. Jeśli chcesz, możesz dodać temperaturę do tej symulacji, zmieniając ilość utraconego / uzyskanego nasycenia o tę temperaturę. Możesz go również zmienić na podstawie wysokości. Powinny się tworzyć naturalne jeziora i rzeki. Niektórzy wpadną do oceanu. (Ocean prawdopodobnie nie wypełni się żadną miarą, ale i tak oznaczycie wszystko pod poziomem morza, aby na końcu było wypełnione wodą.)

Możesz zachować dane dotyczące temperatury i nasycenia, aby używać ich, podobnie jak w innych odpowiedziach, do tworzenia biomów. Powinny być DUŻO bardziej dokładne i interesujące. Z zaśnieżonymi biomami na biegunach i gorącymi pośrodku (jeśli używasz gładkiej stopniowanej listy temperatur).

Możesz także symulować wiatr, a zatem zmiany temperatury na podstawie wysokości. Jeśli chcesz, możesz przesuwać się między uruchomieniem symulacji temperatury i symulacji wody. Jednak nie zbudowałem niczego przy użyciu zmian temperatury, więc nie będę komentować, jak to zrobić.

Ewoluujące krajobrazy

Jeśli utrzymasz symulacje dla ziemi, wody i ciepła i znacznie zmniejszysz ich skutki, a także powstrzymasz ruchy płyt, możesz nadal zmieniać wszystkie te parametry w czasie. Nie uruchamiałbym obliczeń bardzo często, ale można uzyskać mapę świata, która reaguje na zmiany w ten sposób.

Wniosek

Chociaż tego rodzaju techniki są znacznie bardziej zaangażowane, dają o wiele bardziej realistyczne i ewoluujące efekty. Weź to za co jest warte?

DampeS8N
źródło
15

Możesz użyć Perlin Noise do generowania terenu, oto jak działają biomy w Minecraft. Jak widać, wykorzystuje on mapę cieplną w połączeniu z mapą deszczu do tworzenia biomów.

Biomy z Minecraft

tversteeg
źródło