W mojej grze opartej na hałasie Perlin natknąłem się na pewne problemy. Spójrz na załączony zrzut ekranu poniżej.
Białe obszary, które widzisz, to ściany, a czarne obszary można chodzić pieszo. Trójkąt pośrodku to gracz.
Zaimplementowałem fizykę w tej grze, rysując ją na fakturze (białe lub czarne piksele), a następnie pobierając ją z procesora.
Jednak teraz mam inny problem. Chcę, aby jednostki (lub creepy, jakkolwiek je nazwiesz) stale pojawiały się na krawędzi ekranu. Chodzi o to, że w końcowej grze będzie „mgła wojny”, która i tak nie pozwoli graczowi zobaczyć tego tak daleko.
Uznałem, że mogę po prostu zeskanować piksele na krawędzi ekranu i sprawdzić, czy ich tekstura fizyki jest czarna, a następnie odradzać tam losowo rzeczy. Jeśli jednak spojrzysz na zrzut ekranu po raz drugi, w lewym górnym rogu znajduje się przykład, w którym nie chciałbym, aby stwory się pojawiały (ponieważ nie byłyby w stanie dotrzeć do gracza z tego miejsca) .
Czy w jakiś sposób GPU może ustalić te miejsca odrodzenia dla mnie, czy w inny sposób? Pomyślałem o stworzeniu wektorów między proponowanym punktem na brzegu ekranu a odtwarzaczem, a następnie podążaniu za nim co 10 wokseli i sprawdzeniu, czy ściana nie zderzy się, zanim pojawi się tam jednostka.
Jednak wyżej zaproponowane rozwiązanie może być zbyt obciążające procesor.
Wszelkie sugestie w tej sprawie?
Uwaga 1 W przypadku jednostek odradzających się, nie chcę używać żadnego rodzaju odnajdywania ścieżek, aby uniknąć kolizji na ścianie, gdy jednostki te biegną w kierunku gracza. Dlatego jednostki muszą się pojawiać na krawędzi ekranu, w miejscu, w którym chodzenie w linii prostej w kierunku gracza nie koliduje z żadnymi ścianami.
źródło
Odpowiedzi:
Istnieje bardzo przydatny algorytm do tego zadania, znacznie bardziej wydajny niż algorytm powodziowy w tej sytuacji (jego złożoność to czas działania jest proporcjonalny do wielkości granicy, a nie zalany obszar): jest to algorytm marszowych kwadratów. Pomysł jest prosty: rozpocznij lokalizację gracza (punkt środkowy ekranu), wybierz kierunek i idź, aż znajdziesz ścianę. Kiedy zderzasz się ze ścianą, uruchamiasz algorytm: wybierasz orientację (w górę lub w dół) i zaczynasz maszerować nad granicą tego obszaru, podświetlając piksele. To daje ci wewnętrzną granicę dla dozwolonego obszaru. Następnie po prostu sprawdzasz, czy punkty kandydujące do jednostek spawnujących leżą na tej granicy.
Jest to zasada, którą należy przestrzegać podczas uruchamiania granicy:
http://en.wikipedia.org/wiki/File:Marchsquares.png (meh Nie mogę jeszcze publikować zdjęć)
Opis Wikipedii (choć ma dużo większą złożoność, ponieważ jest używany z innymi aplikacjami):
http://en.wikipedia.org/wiki/Marching_squares
źródło
Zrób wypełnienie powodziowe z pozycji gracza; każdy „zalany” obszar jest wówczas ważnym obszarem zabaw, a wszystkie pozostałe są ścianami.
EDYCJA: Jeśli chodzi o dodatkowy wymóg „osiągalny w linii prostej”, należy pamiętać, że w dyskretnej przestrzeni musisz to zdefiniować nieco dalej. Na przykład wszystkie powyższe ścieżki mogą być prawidłową „linią prostą” w takim środowisku i widziałem je wszystkie w grze w pewnym momencie:
W szczególności większość z nich nie jest przemienna - co oznacza, że fakt, że można dotrzeć do B z linii A w „linii prostej”, nie oznacza, że można również dotrzeć do A z linii B; żadna z nich niekoniecznie musi być prawdziwa.
Ponadto pojawia się pytanie, w jaki sposób poradzisz sobie z ruchem po przekątnej, jeśli jeden lub oba punkty „boczne” blokują.
źródło
Co powiesz na pozwolenie spawnu? Nie widzę w tym żadnego konkretnego problemu.
źródło
jeśli ważne jest, aby zaznaczyć graczowi tylko punkty z prawidłową linią prostą, możesz użyć następującego algorytmu (kod c ++), zużywa on więcej niż normalne wypełnienie. mogą występować drobne błędy (będę zadowolony, jeśli ktoś je poprawi), ponieważ sam nie testowałem kodu, ale wpadniesz na pomysł.
źródło
Możesz wypełnić mapę kolorami reprezentującymi obszary wypukłe ... w ten sposób możesz spawnować swoją jednostkę, jeśli leży w tym samym obszarze. Lub możesz łatwiej wyszukiwać dostępne obszary.
To są dane statyczne, więc możesz je wstępnie skalibrować.
musiałeś wypełnić punkt znajdujący obraz, w którym następuje zmiana z konwekcyjnego na wypukły, wizualnie wydaje się łatwy do znalezienia, masz dwie sytuacje:
źródło
Oto coś, czego faktycznie użyłem w mojej własnej grze (świat generowany przez hałas 2D, prawie dokładnie tak jak twój) - Promienie. Zacznij od gracza, określ orientację (losowo, jeśli chcesz) i idź wzdłuż tej linii, aż coś trafisz (krawędź ekranu LUB asteroida). Jeśli uderzysz w krawędź ekranu (a nie asteroidę / białą kroplę), to wiesz, że od krawędzi ekranu do gracza jest prosta, otwarta linia. Następnie spawnuj potwora w miejscu, w którym trafiłeś. Jeśli trafisz asteroidę, ponownie wykonaj test.
źródło
Innym rozwiązaniem (bez GPU), którego można użyć, jest wyszukiwanie ścieżek. Przed narysowaniem mapy znajdź ścieżkę z każdego potencjalnego punktu odradzania na każdej krawędzi mapy i sprawdź, czy jest ścieżka do centrum. * Wyszukiwanie ścieżek jest całkiem OK pod względem kosztów / wydajności, ale możesz to zrobić przed rozpoczęciem gry, jeśli to problem.
Każdy punkt odradzania, który nie ma ścieżki, może zostać umieszczony na liście wykluczeń; lub odwrotnie (dowolny punkt ze ścieżką można umieścić na liście włączającej).
źródło