Generowanie map 2D

Rozwijam silnik płytek 2D i w tej chwili pracuję nad algorytmami generowania map.

Próbowałem tych podstawowych, zwykle związanych z prostym generowaniem heightmap jak

  • hill generation
  • szum Perlina
  • diamentowy kwadrat

Ale zawsze mam ten sam problem: tego rodzaju algorytmy wydają się odpowiednie, gdy mamy do czynienia z mapami dachów, które również mają komponent wysokości, ale to nie jest mój przypadek.

W zasadzie mam sprity jak trawa, morze, pustynia i tak dalej, ale nie powinny być umieszczone wewnątrz mapy zgodnie z wygenerowaną wysokością, ale coś w stylu

    Wszystko zaczyna się od oceanu]}
  • wyspy są umieszczone na środku mapy (tutaj algorytmy, które próbowałem, zawiodły głównie)
  • pustynie są generowane (powinny być jak losowe miejsca wokół)
  • łańcuchy gór i wzgórz są zrodzone (powinny być jak węże)

Jakiego podejścia powinienem spróbować?

I solved the subcomponent problemy (jak pustynie, wzgórza i góry) poprzez opracowanie wyspecjalizowanych algorytmów, aby zrobić to, co potrzebne (na przykład góra zaczyna się od punktu, a następnie podążać w kierunku z szansą na skręcenie), ale nie jestem z generacji podstawowych wysp (które mogą być konfigurowalny być tylko pangea lub wiele stopni wielkości).

Żeby dać wam praktyczny pomysł to czego szukam to coś w rodzaju algorytmu cywilizacyjnego:

alt text

Author: Jack, 2011-01-16

2 answers

[generacja wzgórza, perlin, kwadrat diamentowy] ... tego rodzaju algorytmy wydają się odpowiednie, gdy mamy do czynienia z mapami dachów, które również mają komponent wysokości, ale to nie jest mój przypadek.

Ale to twoja sprawa. Góry są wyższe niż równiny, a równiny są wyższe niż woda.
                        ___/
                    ___/ ___ Mountain cutoff
                ___/
         ______/
    ____/ ___ Water cutoff
__/

Możesz kwantyfikować swoje dane tak, że jeśli znajdują się między jednym zestawem poziomów, są liczone jako jeden typ płytki, podczas gdy gdy znajduje się w innym zakresie, jest to inny typ płytki. Będziesz wyrzuć trochę szczegółów, ale nadal otrzymasz kontury, które pasują do rodzaju hałasu, który generujesz.

Prawdopodobnie będzie to wymagało sporej ilości poprawek i będzie wymagało samodzielnego generowania innych funkcji terenu (oprócz gór impassible), ale będziesz musiał wiele poprawić za pomocą dowolnego rozwiązania do generowania treści.

 14
Author: Merlyn Morgan-Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-16 03:34:41

Użyłem podejścia, które inni określali jako używanie "mrówek" do tworzenia losowego terenu. Opis zastosowanego podejścia:

Najpierw wygenerowałem tilemap przy użyciu dwuwymiarowej tablicy prostokątnej (x,y) wyspecjalizowanej klasy płytek. Klasa tile przechowuje informacje związane z tile, takie jak punkt rysowania i typ terenu.

Potem stworzyłem specjalną klasę "ant", którą można traktować jako niewidzialną istotę, która wykonuje" kroki " wokół tilemap. Za każdym razem mrówka przesuwa się na nowy kafelek, zmienia się Typ terenu. Mrówka może poruszać się w 8 kierunkach i zmienia kierunek, za każdym razem, gdy przesuwa jedną płytkę. Kierunek, który obiera po każdym kroku, jest losowy.

Rodzę albo stałą lub losową ilość mrówek z ustaloną lub losową ilością życia. Żywotność to ilość płytek, na które może przejść / przejść przed usunięciem.

Aby móc kontrolować, jaki rodzaj terenu jest najbardziej powszechny, tworzę tablicę "terrain type". To tablica zawiera listę typów terenu(w zasadzie tylko int). Aby uzyskać jednakową równowagę między wszystkimi typami terenu, do tablicy typów terenu dodajesz tylko jeden z każdego typu terenu. Jeśli chcesz, aby określony typ terenu był bardziej powszechny, możesz dodać kolejne wpisy do tablicy, z tym konkretnym typem terenu.

Następnie, gdy ant musi określić, jaki teren należy zmienić, wykonujesz wyszukiwanie w tablicy typu terrain, używając losowej liczby całkowitej jako indeksu tablicy.

It takes a trochę poprawiłem parametry (ilość mrówek, żywotność mrówek, tablica typów terenu), ale jak na razie osiągam naprawdę dobre tereny.

Może być jeszcze bardziej rozbudowany poprzez użycie bardziej wyrafinowanych typów klas ant, które na przykład przechodzą w wyspecjalizowane wzorce itp. Aby stworzyć wiarygodne Wyspy na Oceanie, prawdopodobnie chciałbyś zmodyfikować zachowanie mrówek, aby miały pewne ograniczenia dotyczące sposobu poruszania się (aby nie dostać losowo długich "kolców" lądu, bardzo rozproszonych małe wyspy itp.).

Poniżej znajduje się przykładowa Mapa lasu, generowana proceduralnie przez małą aplikację, którą zrobiłem przy użyciu podejścia ant. Mam nadzieję, że to może ustawić cię na swojej drodze!

Możesz uzyskać źródło aplikacji (VB.NET) at Github

Generowana proceduralnie Mapa płytki 2D fragmentu lasu

 16
Author: Morten Kirsbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-19 22:54:05