Chcę losowo wygenerować mapę dla gry 2D sidecroller przy użyciu następującego zestawu klocków:
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:
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.
Czy zastanawiałeś się nad użyciem funkcji szumów 1D Perlin lub simpleks? Istnieje wiele zalet, w tym:
Nieskończony (w zakresie precyzji zmiennoprzecinkowej), teren nie powtarzający się
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
Granice są automatycznie dopasowywane, ponieważ zarówno Perlin, jak i simpleks są ciągłe.
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.
(Obraz początkowy zapożyczony z wyżej wymienionego artykułu).
W tym przykładzie czerwona linia reprezentuje funkcję częściową zdefiniowaną jako
... 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.
Oraz widok z góry na dół:
źródło