Jak mogę losowo wygenerować terenowy boczny obszar przewijania oparty na kafelkach 2D?

11

Chcę losowo wygenerować mapę dla gry 2D sidecroller przy użyciu następującego zestawu klocków: wprowadź opis zdjęcia tutaj

Znalazłem kilka świetnych artykułów na temat procesu maskowania bitów, na przykład: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -metod-do-zastosowania-tilemaps /

Podoba mi się pomysł użycia maski bitowej / tilemaski zamiast wykonywania ogromnej instrukcji klauzula if lub switch.

Mam jednak problemy z wizualizacją całego procesu i żaden z tych artykułów nie mówi o losowaniu.

Moje kafelki pasują do siebie na wiele różnych sposobów, a nie tylko jeden sposób, jak wydają się kafelki w przykładach, które podłączyłem.

Na przykład tutaj jest tylko kilka przykładów:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Ponieważ moje płytki pasują do siebie na wiele różnych sposobów, nie sądzę, aby 8-bitowa maska ​​działała. Dlatego myślałem o użyciu większej maski bitowej. Coś jak char [8] lub char 4 .

Gdyby ktoś mógł pokazać pseudokod / przykłady tego, jak wyglądałby ogólny algorytm, byłbym bardzo wdzięczny.

erebel55
źródło

Odpowiedzi:

3

Tak, rozmiar maski zwiększałby się wraz ze wzrostem liczby opcji - Twój główny pomysł wyjaśnia twój własny link http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ .

W zasadzie trzeba wyliczyć X możliwości dla każdej „granicy” między płytkami; w twoim konkretnym przykładzie wygląda na to, że „góra / dół płytki” może być (1) biały (2) przykryty lub (3) na wpół przykryty - co przypadkowo pasuje do „trójkowego” przykładu podanego w artykule.

Ale maski pomogą ci ograniczyć możliwości kafelków do tych, które można narysować, samo w sobie nie jest to metoda, która pokazuje, jak generować rzeczywiste mapy w rozsądny sposób.

Twój konkretny zestaw klocków jest w rzeczywistości dość restrykcyjny - opisuje tylko jedną powierzchnię wznoszącą się / opadającą, aw dowolnym punkcie początkowym „na poziomie całkowitym” masz tylko kilka poprawnych wyborów. Na przykład po kafelku nr 2 możliwe są tylko kafelki nr 1 lub # 8. Możesz po prostu przesuwać się od lewej do prawej, tworząc listę (kilka) kafelków po poprzednim kafelku i losowo wybierając jeden z nich.

Piotr jest
źródło
Myślę, że to jest odpowiedź, której szukam, jednak wciąż jest trochę pochmurno. Czy możesz uzyskać bardziej szczegółowe informacje, w formie tekstu lub pseudokodu, o tym, jak działałaby ostatnia część twojego wyjaśnienia? „Możesz po prostu przesuwać się od lewej do prawej, tworząc listę (kilka) kafelków po poprzednim kafelku i losowo wybierając jeden z nich”.
erebel55
1
Dla każdego rodzaju kafelków należy mieć listę dozwolonych kafelków - jest ich tak mało, że można to szybko zrobić ręcznie. „Wysokość” zmieni się, wypełnij wszystko pod nowym kafelkiem # 10.
Peteris
Ach, więc mówisz, aby użyć tej metody zamiast maskowania bitów?
erebel55
1
Tak, maskowanie bitów jest przydatne, jeśli cała zawartość 2D jest znacząca, ale twoje mapy wydają się być jednopoziomowe, pozioma powierzchnia o różnej wysokości.
Peteris
Ma to sens, że „góry” będą miały różną wysokość i będą się do siebie spotykać. Zasadniczo będzie to ciągła zmiana wysokości gór w miarę przemieszczania się. Coś w rodzaju fali cosinus / sinusoidalnej, która ma losowe wielkości w różnych punktach. Czy podczas generowania mapy powinienem przesuwać się od lewej do prawej lub od góry do dołu?
erebel55
6

Czy zastanawiałeś się nad użyciem funkcji szumów 1D Perlin lub simpleks? Istnieje wiele zalet, w tym:

  1. Nieskończony (w zakresie precyzji zmiennoprzecinkowej), teren nie powtarzający się

  2. Może być generowany w czasie rzeczywistym (nawet w szybkim module cieniującym ) lub z wyprzedzeniem i przechowywany w teksturach, jak w twoim przykładzie

  3. Granice są automatycznie dopasowywane, ponieważ zarówno Perlin, jak i simpleks są ciągłe.

  4. Chociaż sam teren jest pseudolosowy, łatwo jest zastosować funkcję obwiedni lub po prostu zmniejszyć liczbę oktaw w obszarach, w których potrzebujesz płaskich obszarów lub innych konkretnych potrzebnych elementów terenu.

Zobacz ten link, aby uzyskać dość dokładne wyjaśnienie implementacji 1D Perlin.

Koperta jest w zasadzie polem skalarnym lub funkcją, która jest mnożona przez funkcję szumu przed zapisaniem lub wyświetleniem wyniku.

wprowadź opis zdjęcia tutaj

(Obraz początkowy zapożyczony z wyżej wymienionego artykułu).

W tym przykładzie czerwona linia reprezentuje funkcję częściową zdefiniowaną jako

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... które można lepiej zdefiniować za pomocą płynnej funkcji. W tym przypadku po prostu skaluje rzeczy do 0 przed płaskowyżem, a następnie z powrotem do 1 później.

Aktualizacja

Oto przykład trójwymiarowego „terenu” z jednego z moich projektów, z zastosowanym rozproszonym oświetleniem zwierciadlanym, generowanym całkowicie w rurze cieniującej vert + tess + frag. W twojej sytuacji wybrałbym z tego pionowy kawałek, aby uzyskać nachylenie terenu.

wprowadź opis zdjęcia tutaj

Oraz widok z góry na dół:

wprowadź opis zdjęcia tutaj

3Dave
źródło
Czy to technika generowania samych obrazów kafelków?
erebel55
1
@ erebel55 Tak. Możesz użyć funkcji 2D, aby zdecydować, gdzie (na podstawie Twojego przykładu) umieścić różne dzieci roślin na obrazie, a także wygenerować pochyły teren. Użyłem tego w 3D z doskonałymi wynikami.
3Dave
Wygląda na interesującą metodę, ale nie jestem pewien, czy chcę zejść tą drogą, ponieważ mam już utworzone zdjęcia.
erebel55
@ erebel55 tak, nie ma powodu, aby podrzucać istniejące rzeczy, jeśli to działa dla Ciebie.
3Dave
No cóż, jeszcze nie działało przypadkowe pokolenie, ale mam nadzieję, że tak zrobię;) Głosowałem za tą metodą, ponieważ była interesująca i może wykorzystam ją w przyszłości. Dziękuję
erebel55