Generowanie terenu dla platformówki 2D opartej na kafelkach

15

Obecnie pracuję nad opartą na kafelkach platformówką 2D podobną do Terrarii, chociaż mam trudności z generowaniem terenu. Mam pewne podstawy, chociaż nie są one przydatne.

Wypróbowałem kilka różnych technik, takich jak hałas Perlina, i czytałem o innych, takich jak przesunięcie punktu środkowego, chociaż nie jestem pewien, która z nich byłaby najlepsza, ani kombinacja różnych technik generowania różnych obszarów. (Takich jak przesunięcie punktu środkowego dla ogólnego kształtu terenu i hałas Perlina dla jaskiń).

Znalazłem doskonałe wyjaśnienie, w jaki sposób mogę podzielić go za pomocą Accidental Noise Library , chociaż jest on w C ++, i nie znam wystarczającej ilości C ++, aby skompilować go do biblioteki DLL, której mogę używać z C #. Próbowałem skopiować to w C #, chociaż nie wiem, jak mogę połączyć dwa efekty razem (gradient dla ogólnej podstawy, a następnie fraktal dla szczegółów).

Obecnie używam Fractal Plazmy, a wyniki są bardzo zróżnicowane. Na przykład może generować teren, na którym prawie nie ma powierzchni, lub może generować teren, na którym w ogóle nie ma powierzchni.

Przykład lepszej mapy byłby jednak lepszy z kilkoma ulepszeniami. (Czarny jest jednolity, biały to powietrze):

Dobra mapa

I przykład strasznej mapy. (Czarny jest jednolity, biały to powietrze):

Okropna mapa

Zasadniczo pytam o to, jaki byłby lepszy sposób generowania terenu lub zmuszania go do upewnienia się, że jest odpowiednia ilość powierzchni, z czasem generowania tak szybko, jak to możliwe. Lub, alternatywnie, w jaki sposób byłbym w stanie osiągnąć taki sam wynik jak Accidental Noise Library, ale w C #.

Wszelkie przykłady byłyby bardzo mile widziane.

Zacieniowane wymiary
źródło
Cześć, zastanawiałem się, jak to zrobiliście. Próbuję zrozumieć, w jaki sposób generować takie światy, i podobają mi się wyniki, które osiągasz. Jakiego algorytmu używasz, ponieważ nie wygląda jak szum perlin 2D i zdecydowanie nie jest to szum 1D.
G3tinmybelly,

Odpowiedzi:

8

Spróbowałbym trzymać się szumu Perlina, ale dodając do niego ciężar na podstawie wysokości, aby zapewnić pewną średnią gęstość na pewnych wysokościach. Cytując część wpisu Notcha na temat generowania terenu w Minecraft :

Więc zmieniłem system na podobny system oparty na szumie 3D Perlin. Zamiast próbkowania „wysokości ziemi” potraktowałem wartość hałasu jako „gęstość”, w której wszystko niższe niż 0 byłoby powietrzem, a wszystko wyższe lub równe 0 byłoby ziemią. Aby upewnić się, że dolna warstwa jest solidna, a górna nie, po prostu dodam wysokość (przesunięcie o poziom wody) do próbkowanego wyniku.

Zasadniczo bierzesz mały kawałek terenu Minecraft. Generuj więc szum Perlina 2D, ale zważ go tak, aby wszystko powyżej pewnego punktu mogło być powietrzem, a wszystko poniżej pewnego punktu prawdopodobnie ziemią.

Zapewni to dobry teren, z kilkoma nawisami i ciekawymi funkcjami, a także niektórymi jaskiniami i pływającymi wyspami. (Jeśli nie chcesz pływających wysp, możesz je przetestować i usunąć je ręcznie.) Ta metoda nie da ci takich rzeczy jak tunele, więc będziesz potrzebować metody dodawania ich po wygenerowaniu terenu, na przykład losowy spacer .

dlras2
źródło
Nie jestem do końca pewien, czy wykorzystuję Perlin Noise do jego pełnego potencjału. Po zrobieniu dokładnie tego, co opisano, po prostu zrobiono wiele jaskiń, z dużą ilością pływających wysp. Brak rzeczywistych definicji typu terenu. Używając gradientu do ważenia wyników, otrzymuję ten wynik .
Cieniowane wymiary,
@Cieniowane wymiary - Twoje parametry hałasu Perlin wymagają dostosowania. Masz bardzo zmienny hałas, gdy chcesz, aby uzyskać znacznie gładszy, szerszy wzór. Sprawdź freespace.virgin.net/hugo.elias/models/m_perlin.htm i spróbuj trochę zepsuć swoje parametry. Spróbuj mniejszej trwałości i mniej oktaw. (Warunki te mogą się różnić, więc przeczytaj ten artykuł.)
dlras2,
OK, dzięki za link. Dowiedziałem się również, że waga nie działała zgodnie z przeznaczeniem po zmianie kilku parametrów.
Cieniowane wymiary
Okej, trochę zmodyfikowałem parametry i mam coś, co jest całkiem akceptowalne, przynajmniej na razie. Na potrzeby tego testu usunąłem również generujące jaskinie, ponieważ najpierw chciałem zrobić rzeczywisty teren. To jest wynik końcowy . Wystarczy dodać kontrole, aby usunąć te pływające wyspy. Dzięki jeszcze raz.
Cieniowane wymiary
@Cieniowane wymiary - Fajnie! Dużo czasu, dobre tereny pochodzą z samych poprawek parametrów i nakładającego się hałasu. Zajmie trochę czasu, zanim dostaniesz coś, z czego jesteś bardzo zadowolony, ale zawsze możesz użyć tego, co masz teraz i wrócić, aby dodać ostatnie poprawki. Powodzenia!
dlras2,