Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Wykrywanie kolizji PixelPerfect a Rotacja

Ostatnio zmodyfikowano 2012-04-22 13:26
Autor Wiadomość
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?
P-54979
DejaVu
» 2012-04-22 12:46:20
A nie da się obrócić najpierw sprajta, a później pobierać z niego piksele?
P-54995
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ć?
P-55001
DejaVu
» 2012-04-22 13:16:25
» SFML 1.6 » SpriteGetPixel - sprawdzałeś to?
P-55002
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ą.
P-55003
DejaVu
» 2012-04-22 13:26:37
» Kurs SFML 1.6, C++Tworzenie i wyświetlanie sprajtów lekcja

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:
C/C++
sf::Vector2f punkt = naszSprajt.TransformToLocal( sf::Vector2f(( float ) sterowanie.GetMouseX(),( float ) sterowanie.GetMouseY() ) );
Da radę na luzie zrobić to co chcesz :P » SFML 1.6 » SpriteTransformToLocal.

/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).
P-55004
« 1 »
  Strona 1 z 1