[SFML] Wykrywanie kolizji PixelPerfect a Rotacja
Ostatnio zmodyfikowano 2012-04-22 13:26
fensz Temat założony przez niniejszego użytkownika |
[SFML] Wykrywanie kolizji PixelPerfect a Rotacja » 2012-04-21 23:36:45 Witajcie,
Mam kolejny SFMLowski problem, mianowicie skuteczność kolizji
Zależy mi na dokładnym pixelowaniu, więc użyłem PP i zachodzi problem.
Mój sprite przy naciśnięciu klawiszy WSAD odpowiednio nabiera rotacje (poprzez SetRotation) aby skręcić oraz zmienić kąt nachylenia teksturki. I jeżeli nachodzi na obiekt pod kątem normalnym, bez rotacji - kolizja działa. ale już przy podejściu od boku z rotacją np 270 stopni, kolizja nie zachodzi.
Moje pytanie jest takie, czy ma ktoś może pomysł jak zmodyfikować standardową klasę kolizji tak, by pobierała piksel także z innego wektora lub obracała się razem z nim? |
|
DejaVu |
» 2012-04-22 12:46:20 A nie da się obrócić najpierw sprajta, a później pobierać z niego piksele? |
|
fensz Temat założony przez niniejszego użytkownika |
» 2012-04-22 13:12:50 Myślałęm o tym, ale nie za bardzo wiem jak się do tego zabrać. Możesz podpowiedzieć? |
|
DejaVu |
» 2012-04-22 13:16:25 |
|
m4tx |
» 2012-04-22 13:20:45 @DejaVu myślę, że się tak nie da. SFML chyba nie obraca "ręcznie" sprite'a - rysuje go normalnie, uprzednio jednak obracając scenę poprzez OpenGL, piksele w spricie się więc chyba nie zmieniają. |
|
DejaVu |
» 2012-04-22 13:26:37 Tworzenie i wyświetlanie sprajtów
Zerknij sobie jak działa kod z powyższej lekcji. Tam jest przykład sprawdzania 'czy myszka jest nad sprajtem' - może to Ciebie na coś naprowadzi... a jak nic z tego nie wypali to zapewne będziesz musiał 'ręcznie' przekształcać współrzędne punktów danych pikseli i sprawdzać czy kolidują (aczkolwiek złożoność takiego algorytmu nie będzie z pewnością mała :P).
/edit:
sf::Vector2f punkt = naszSprajt.TransformToLocal( sf::Vector2f(( float ) sterowanie.GetMouseX(),( float ) sterowanie.GetMouseY() ) );
Da radę na luzie zrobić to co chcesz :P TransformToLocal.
/edit2:
Ale, żeby uzyskać dobrą złożoność obliczeniową algorytmu to będziesz musiał utworzyć sobie dwuwymiarową tablicę (każde pole typu bool z domyślną wartością false). Później dla każdego piksela, który nie jest przeźroczysty robisz TransformToLocal i wypalasz w tej tablicy poprzez ustawienie wartości na 'true'. Jeżeli przy wypalaniu stwierdzisz, że 'ten piksel był już true' to nastąpiła kolizja. Uzyskujesz w ten sposób pesymistyczną złożoność obliczeniową O(s1.w*s1.h + s2.w*s2.h), co powinno w miarę dobrze działać (z naciskiem na 'w miarę' ;p). |
|
« 1 » |