Implementowanie zniszczalnego krajobrazu 2D (takiego jak Worms)


76

Jakie kroki wymagałyby zbudowania zniszczalnego krajobrazu 2D, tak jak w Worms? Idealnie, jakie są sposoby na usprawnienie tego procesu?


7
Doskonałe pytanie. Robaki mają dwa wyzwania: możliwość zniszczenia, a także ruch pod dziwnymi kątami.
ashes999

myślę, że zadawano to tutaj wiele razy
Wisznu

2
Vish, powiązane linki nie sugerują tego.
Kaczka komunistyczna

3
Możesz sprawdzić, jak to się robi w Hedgewars - jest to klon Wormsa typu open source.
GvS,

Nie wystarczy na odpowiedź, ale możesz również sprawdzić Clonk . Jest to starsza gra 2D autorstwa niemieckiego programisty, która ma także zniszczalny krajobraz, aż do określonych pikseli. Nie jest już w fazie rozwoju, ale kod źródłowy jest dostępny pod linkiem powyżej. Istnieje również następca open source OpenClonk, ale z filmów wydaje się, że odszedł od destrukcji doskonałej w pikselach i obrócił się w kierunku typowym dla Terrarii z rodzajami bloków, które można zniszczyć.
Christian

Odpowiedzi:


47

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 = blastRadiusw 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.


3
Przechowywanie dodatkowych informacji to mapa kolizji to piękny pomysł.
deft_code

6

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.


2
Myślę, że tak właśnie robi Hedgewars. @ Bill, możesz na to rzucić okiem, ponieważ jest open source.
Gastón

2
@ Gastón Wszystkie mapy w Hedgewars są obrazami (PNG). Wątpię, czy są konwertowane na grafikę wektorową. Ponadto: używanie grafiki wektorowej (splajny, bezier itp.) Jest znacznie bardziej obciążające procesor w przypadku takich rzeczy, jak wykrywanie kolizji lub odejmowanie kształtów. Spojrzenie na źródło jest jednak dobrym pomysłem (chociaż styl kodowania jest raczej zły :))
bummzack

4
Geometria obliczeniowa taka jak ta może się bardzo skomplikować, bardzo szybko!
Adam Harte,

Googling „zniszczalny teren box2d” daje teraz kilka możliwych do uruchomienia demonstracji wektorowych.
Ciro Santilli 14 改造 中心 法轮功 六四 事件

6

Użyj konstrukcyjnej bryły geometrycznej

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ś.


5

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ć.


3
W robakach można było kopać dziurę w krajobrazie za pomocą pochodni. Nie byłoby tak zabawnie, gdyby ten tunel zawalił się na twoim biednym robaku z pochodnią. Możliwe było również, że fragmenty krajobrazu „unosiły się” w powietrzu. Twoja propozycja brzmi jak fajny pomysł, ale nie jak gra Worms.
bummzack

O to właśnie chodziło, myślałem o odmianach tej gry. Ponadto niektóre części krajobrazu mogą być niezniszczalne i / lub trwale zawieszone w powietrzu, co pozwoliłoby na tworzenie „pływających” bloków. Ponadto niektórzy mogliby przykładać do nich stałą siłę, ciągnąc je w górę lub na boki, jak w przypadku kulek powietrza w World of Goo.
Septagram

To zabawne, bo tak naprawdę zastanawiałem się nad stworzeniem takiej gry, byłoby fajną odmianą mechaniki Wormsa. Idea sztywnych brył bitmapowych byłaby z pewnością interesującym tematem sama w sobie, choć złożoność jest trochę ponad moją głową.
William Casarin

Cóż, w tym przypadku sztywne bryły bitmapy byłyby nie do przejścia, zamiast tego stworzyłbym krajobraz jako trójkątną siatkę wierzchołków, elastycznie połączonych. Czy grałeś w World of Goo? Jeśli nie, zobacz zrzuty ekranu: vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/screenshots/world-of-goo_1_big.jpg . Nie, nie, nie, nie, jeśli nie grałeś, absolutnie musisz :) Teraz wyobraź sobie, że zamiast lepkich kulek każdy trójkąt wyświetla część tekstury krajobrazu i są one znacznie mniejsze. Bawić się wokół ze stałymi a krajobraz będzie albo bardzo trudne, albo miękkie jak galareta
septagram

2
spójrz na silnik fizyczny . Cały silnik opiera się na idei, że wszystko jest kratką odkształcalną / ulegającą zniszczeniu (jak wieża maź).
deft_code

3

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.