Czy istnieje dobrze znany sposób (lub być może fragment kodu wielokrotnego użytku) do wykrywania kolizji w pikselach w XNA?
Zakładam, że użyłoby to również wielokątów (pól / trójkątów / kół) do pierwszego przejścia, szybkiego testu na kolizje, a jeśli test ten wskazywałby na kolizję, wówczas szukałby kolizji na piksel.
Może to być skomplikowane, ponieważ musimy uwzględnić skalę, rotację i przejrzystość.
OSTRZEŻENIE: Jeśli używasz przykładowego kodu z linku z poniższej odpowiedzi, pamiętaj, że skalowanie macierzy zostało skomentowane z uzasadnionego powodu. Nie musisz odkomentować, aby skalowanie działało.
xna
2d
collision-detection
ashes999
źródło
źródło
Odpowiedzi:
Widzę, że otagowałeś pytanie jako 2d, więc zacznę i zrzucę mój kod:
Edycja : Chociaż ten kod jest prawie oczywisty, nie czułem się dobrze z powodu braku komentarzy, więc dodałem trochę;) Pozbyłem się również operacji bitowych, ponieważ robiło to w zasadzie to, co robi właściwość Color.A w bardziej skomplikowany sposób ;)
źródło
Bounds
?CollidesWith(Sprite other, bool calcPerPixel = true);
:)W App Hub znajduje się bardzo stara próbka, która prowadzi Cię przez wykrywanie kolizji 2D od prostych ramek ograniczających do testowania pikseli na obróconych i skalowanych duszkach. Został w pełni zaktualizowany do wersji 4.0. Cała seria jest warta przeczytania, jeśli jesteś nowy w temacie.
http://xbox.create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel_transformed
Zauważyłem też, że Riemer Grootjans jest interesujący w swojej strzelance 2D. http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php
(Zajęło mu to trochę czasu, aby się do niego dostać ... http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Coll_Detection_Overview.php ... ale możesz śledzić, aby zobaczyć problem, który rozwiązuje)
Ale ostrzegam cię, że próbka Riemers nie jest XNA 4.0 i być może będziesz musiał trochę popracować, aby ją uruchomić. Nie jest to jednak praca trudna ani tajemnicza.
źródło
Polecam utworzenie czarno-białej mapy kolizji. Zaprogramuj go tak, aby czarne piksele były punktami kolizji. Nadaj postaci również mapę kolizji; Podczas przetwarzania map użyj algorytmu, który zamieni duże kwadraty czarnych pikseli w prostokąty kolizyjne. Zapisz dane prostokąta w tablicy. Możesz użyć funkcji Przecięcia prostokąta, aby wyszukać kolizje. Możesz także przekształcić mapę kolizji za pomocą tekstury.
Jest to bardzo podobne do korzystania z macierzy kolizji, ale jest bardziej zaawansowane i można ją przekształcić! rozważ zbudowanie narzędzia do generowania mapy kolizji, jeśli go potrzebujesz. Jeśli sprawisz, że zadziała, udostępnij kod innym osobom!
źródło