Szukam funkcji do generowania losowej mapy opartej na kafelkach, gdy zmieniają się wizualne granice mapy (przechodząc przez mapę). Chcę, aby mapa była nieskończenie duża i miała strukturę przypominającą labirynt.
Jeśli jednak świat jest nieskończony, powrót do miejsca, w którym był już gracz, podnosi problem. Gra musi pamiętać, jak naprawdę wszystko tam wyglądało.
Pomyślałem więc: „Jak Minecraft rozwiązuje ten problem?” i pomyślałem sobie, że muszą używać jakiejś funkcji liczby losowej z ziarnem, która może zarówno iść do przodu, jak i do tyłu, i w ten sposób odtwarzać stare kafelki dokładnie tak, jak były, ale w nowych przypadkach.
Co o tym myślisz?
tiles
random
minecraft-modding
tilemap
Mathias Lykkegaard Lorenzen
źródło
źródło
Odpowiedzi:
Zauważyłeś różnicę między generatorem liczb losowych a funkcją szumu . Generator liczb losowych wyrzuca inny numer za każdym razem, gdy go wywołujesz. Funkcja szumu pobiera pewne argumenty - powiedzmy mapę xiy - i wyrzuca liczby o losowych właściwościach statystycznych , ale za każdym razem o tej samej wartości dla tych samych argumentów , tj. Jest to właściwa funkcja matematyczna.
Oba są bardzo ściśle powiązane. Funkcja hałas może symulować generator liczb losowych, przekazując w innej wartości za każdym razem - na przykład
noise(1)
,noise(2)
i tak dalej. A generator liczb losowych, zrzucony do gigantycznej tabeli, może działać jako funkcja szumu. W obu przypadkach używasz niewłaściwego narzędzia do pracy.Minecraft w szczególnych zastosowań Perlin hałasu , rodzaj hałasu, który jest tani, aby obliczyć i posiada pożądaną właściwość bycia ciągły w tak wielu wymiarach, jak trzeba - jeśli wykres
f(x)
abyf(x + 1)
, tam nie będzie żadnych nagłych skoków. Dzięki temu jest bardzo przydatny w wielu rzeczach, takich jak modulacja tekstury, chmury i gazy objętościowe oraz generowanie terenu.Jeśli szukasz implementacji, z którą chcesz zacząć grać, ulepszony generator hałasu Perlina Kena Perlina jest jedną z najprostszych implementacji.
źródło
Sposób, w jaki Minecraft kontroluje generowanie, polega na utworzeniu poziomu zalążka, który jest wykorzystywany do generowania wszystkich liczb losowych w grze. Jeśli porcja nie istnieje na dysku, gdy zostanie o to poproszona, zostanie wygenerowana za pomocą funkcji generowania Notch opartej na ziarnie poziomu; jest on następnie zapisywany na dysku na później.
Wygląda na to, że chcesz osiągnąć podobne zachowanie, więc jest to bezpieczna droga.
źródło
Jak wskazał Joe, szukasz funkcji skrótu. Ogólnie, funkcje losowe są po prostu funkcjami mieszającymi zaszczepionymi ostatnią zwracaną liczbą. Więc jeśli
Random()
zwróconeHash(seed)=1234
, drugie połączenieRandom()
wróciHash(1234)
, przy tak dalej.Jeśli szukasz prostej funkcji mieszającej dla liczb pseudolosowych, sprawdź MurMurHash . Zaimplementowałem go w C # i mogę go gdzieś opublikować, jeśli jesteś zainteresowany. Bardziej szczegółowe informacje na temat szumu Perlina, który korzysta z takiej funkcji skrótu, można znaleźć tutaj , a jej implementacja w języku C # znajduje się tutaj .
Wszystkie te informacje pochodzą z pytania, które zadałem rok temu tutaj na Stack Overflow. To, czego szukasz, nazywa się generowaniem treści proceduralnych, więc jeśli potrzebujesz więcej informacji, poszukaj ich. Szczęśliwy generowanie terenu!
źródło