Jakie kroki wymagałyby zbudowania zniszczalnego krajobrazu 2D, tak jak w Worms? Idealnie, jakie są sposoby na usprawnienie tego procesu?
Jakie kroki wymagałyby zbudowania zniszczalnego krajobrazu 2D, tak jak w Worms? Idealnie, jakie są sposoby na usprawnienie tego procesu?
Odpowiedzi:
Nie wiem, jak dokładnie zaimplementowano krajobraz w robakach, ale jestem prawie pewien, że użyli bitmapy do tego krajobrazu (przynajmniej w starszych grach z tej serii).
Bardzo podstawowym podejściem byłby obraz bitmapowy (czarno-biały), w którym czarne piksele reprezentują powietrze, a białe piksele reprezentują ziemię . Zniszczenia krajobrazu można łatwo dokonać za pomocą operacji pikseli. Więc jeśli rakieta uderzy w ziemię, pomaluj czarny okrąg radius = blastRadius
w punkcie uderzenia.
Następnie możesz renderować swój świat (lub tylko jego część) za pomocą tej mapy bitowej. Aby uzyskać lepszą wydajność, sugeruję zaimplementowanie go w taki sposób, abyś mógł zaktualizować / renderować tylko część „świata”. Na przykład. jeśli niektóre części krajobrazu zostaną zniszczone przez rakietę, po prostu zrenderuj dotknięte obszary, a nie cały świat.
Zamiast obrazu czarno-białego jako „mapy kolizji”, można również użyć 24-bitowego obrazu, w którym używasz dwóch kanałów do przechowywania normalnej powierzchni (x, y) na piksel i jednego kanału do przechowywania rzeczywistej „kolizji- mapa". Posiadanie pod ręką normalnej powierzchni znacznie pomoże ci obliczyć odbijające się granaty lub ustalić, czy postać może poruszać się w danym kierunku.
Jedna możliwość z góry mojej głowy:
Użyj reprezentacji ścieżki grafiki wektorowej do przechowywania konturu zniszczalnej „ziemi”. Gdy dojdzie do zdarzenia zniszczenia (np. Granat wybuchnie), obszar wybuchu, reprezentowany jako okrąg, zostanie usunięty z drogi lądowej za pomocą operacji odejmowania wartości logicznej. Powstała ścieżka reprezentuje nową „ziemię” do wykrywania kolizji z ziemią, a także ewentualnie maskę do rysowania ziemi.
Napisałem dowód koncepcji, który wykorzystywał konstruktywną geometrię bryłową do radzenia sobie z niszczycielskim terenem. Użyłem GLU Tessellator do wykonywania operacji boolowskich. Dokumentacji wyjaśnia w jaki sposób wyszukiwania dla „CSG Zastosowania Winding Rules” .
Podałem wyjście trójkąta tesselatora jako statyczne wielokąty do Box2D. PoC działało całkiem dobrze. Byłem w stanie dowolnie odejmować i dodawać teren w czasie rzeczywistym, a teren nadal zachowywał się poprawnie w Box2D. Jedyny prawdziwy czkawka polegała na tym, że teselator GLU może wytwarzać zdegenerowane trójkąty, których Box2D nie lubi, więc musiałem je odfiltrować ręcznie.
Następnym krokiem w PoC (do którego nigdy nie dotarłem) było użycie algorytmu SCC z biblioteki grafów doładowania, aby wykryć, kiedy kawałek terenu został odcięty (odciąć szczyt góry). Odcięty teren byłby nadal do zniszczenia, ale teraz jest reprezentowany przez dynamiczne (niestatyczne) ciało Box2D z trójkątami przymocowanymi jako kształty. Miałem opracowany projekt, ale straciłem zainteresowanie, gdy zacząłem kopać w dokumentacji doładowania. I „plan” , aby ponownie ideę kiedy dokonać spękana ziemia / Worms grę kiedyś.
Wszystkie powyższe odpowiedzi mówią o implementacji najprostszego przypadku, jak w przypadku robaków. Oznacza to, że obszar uderzenia zostaje zniszczony, a wszystko inne pozostaje nietknięte. Czy zastanawiałeś się, że twój krajobraz może ostatecznie zostać podzielony na dwie części? Powiedzmy, że jest góra, a gracze przecinają jej dno za pomocą wyrzutni rakiet. Czy góra nie powinna spaść? Naturalnie krajobraz byłby trochę elastyczny. W czasach Worms (przynajmniej tak, jak je pamiętam, nie grałem w Worms przez, jak przez wiele lat) komputery nie były wystarczająco silne, aby zrobić to dobrze. Ale teraz są.
Oczywiście zależy to całkowicie od ambicji twojego projektu. Ale jeśli chcesz, aby było naprawdę niesamowite, może powinieneś wypróbować Box2D jako silnik fizyki. Możesz z tym wiele zrobić.
Jak powiedział bummzack, mapy bitowe. Chociaż możesz użyć 1-bitowych folii lub jeśli nie masz takiej obsługi, użyj okropnego różowego koloru, którego nie będziesz używać w grze.
Punkt uderzenia można obliczyć po prostu sprawdzając kolor piksela. a gdy nastąpi zderzenie, zmień kolor (lub usuń) bitmapy.
Jeśli chodzi o promień wybuchu, moim pierwszym przystankiem byłby algorytm koła Bresenhama , bardzo szybki i skuteczny. Chociaż najpierw zrobiłbym staranne usunięcie z czymś w rodzaju kwadratu i umieściłem koło wokół niego, aby uzyskać krawędzie.