Moja gra ma wiele różnych rodzajów dobrych facetów i wiele różnych rodzajów złych facetów. Wszystkie będą strzelały do siebie, ale nie chcę, aby przypadkowe obrażenia wystąpiły w obu liniach. Więc źli nie powinni być w stanie trafić / zranić innych złych, a dobrzy nie powinni być w stanie trafić / zranić innych dobrych.
Sposób, w jaki myślę o rozwiązaniu jest to przez co czyni go tak, że Unit
instancja (to jest javascript, btw), posiada alignment
właściwości, które mogą być good
albo bad
. I pozwolę na kolizję tylko wtedy, gdy
class Attack
boolean didAttackCollideWithTarget(target)
return attack.source.alignment != target.alignment and collisionDetected(attack.source, target)
Oczywiście jest to pseudo-kod.
Ale zadaję to pytanie, ponieważ mam wrażenie, że może istnieć o wiele bardziej elegancki sposób zaprojektowania tego, oprócz dodania jeszcze jednej właściwości do mojej Unit
klasy.
Odpowiedzi:
Filtrowanie kolizji
Bardziej niezawodną sytuacją, która można skalować na wiele warstw, jest użycie filtrowania, co nie jest tym samym, co grupowanie.
Działa to najlepiej, dając każdemu obiektowi 2 maski bitowe .
I wywołać kolizję tylko wtedy, gdy poniższe warunki są prawdziwe.
Najłatwiej jest ustawić domyślną maskę na 0xFFFF, co powoduje kolizję ze wszystkim. Domyślną kategorią jest 0x0001. obiekty zderzą się z kategoriami w masce pozostałych, czy nastąpi kolizja.
Innym sposobem, aby o tym myśleć, jest to, że każdy obiekt ma typ i listę wszystkich typów, z którymi może się kolidować. Tylko wtedy, gdy dwa obiekty zderzają się ze sobą, występuje kolizja. Możesz mieć takie samo zachowanie, mając listę wyliczeń zamiast maski, ale maskę o rząd wielkości szybciej.
Scenariusz, który opisujesz
W tej sytuacji lubię wykorzystywać wyliczenia.
Powiedzmy, że mamy.
Kula zastrzelona przez dobrego faceta
Dobrzy ludzie
Źli chłopcy
Co powoduje, że poniżej, gdy Kula trafiona przez dobrego faceta trafi innego dobrego faceta.
Ale trafi w złych facetów.
źródło
Miałem ten sam problem w moim bieżącym projekcie (w Javie). Po kilku próbach rozwiązuje się go, tworząc cztery listy. To rozwiązanie jest tworzone w Javie i dla gry 2D, ale powinno również działać w podobny sposób w JavaScript
pseudo kod
pseudo-kod, taki sam dla klas Bullets
To może nie być najlepsze lub najszybsze rozwiązanie, ale pomoże ci w tej chwili. Przykro mi, że nie mogę dać ci rozwiązania w JavaScript, ale mam nadzieję, że mógłbym ci pomóc
Nawiasem mówiąc, mój angielski nie jest najlepszy, ale mam nadzieję, że posłuchasz mojego wyjaśnienia
źródło