Autor Wątek: Pixel Perfect Collision  (Przeczytany 6335 razy)

Offline Rabbcio

  • Użytkownik

# Październik 12, 2009, 23:49:31
Właśnie siedze nad tym linkiem dwa dni prawie Xd
if(testPixel(x, y, bitmap1) && testPixel(x, y, bitmap2);
Nie wiem jak to zamienić Xd

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

# Październik 12, 2009, 23:54:18
Właśnie siedze nad tym linkiem dwa dni prawie Xd
if(testPixel(x, y, bitmap1) && testPixel(x, y, bitmap2);
Nie wiem jak to zamienić Xd
if (getpixel(bitmap1, x, y) && getpixel(bitmap2, x, y))

ALE TRUDNE!

Offline Rabbcio

  • Użytkownik

# Październik 12, 2009, 23:58:24
Tak myślałem Xd
Ale czy to znaczy, że te bitmap1 i 2 to Bufor?
A jak nie to bitmapy które mają kolidować?


Offline Oti

  • Użytkownik

# Październik 13, 2009, 00:02:32
Ja tak się zastanawiam.. Po co robic kolizje per pixel? Nauczysz się robic już te kolizje per pixel, potem przejdziesz na jakiegoś DXa lub OGLa i ta wiedza Ci się nie przyda. A zwłaszcza, że jest to chyba dośc niewygodny sposób detekcji kolizji, proponuję robic kolizje typu Prostokąt-Prostokąt, na początek powinno wystarczyc. :)

Offline Rabbcio

  • Użytkownik

# Październik 13, 2009, 00:06:08
Ale właśnie robię grę w allegro i tam jest nezbędna taka kolizja.
I niby zrobiłem tą klizje...ale strasznie mi się tnie...
Wie może ktoś czemu?

Offline Avaj

  • Użytkownik

# Październik 13, 2009, 00:07:29
Ja tak się zastanawiam.. Po co robic kolizje per pixel? Nauczysz się robic już te kolizje per pixel, potem przejdziesz na jakiegoś DXa lub OGLa i ta wiedza Ci się nie przyda. A zwłaszcza, że jest to chyba dośc niewygodny sposób detekcji kolizji, proponuję robic kolizje typu Prostokąt-Prostokąt, na początek powinno wystarczyc. :)
W grach 2D kolizja perpixel się bardzo przydaje, a zawsze można zrobić optymalizację, że najpierw testujesz prostokąty a potem perpixel i koszt takiej kolizji jest minimalny ;)

Offline Rabbcio

  • Użytkownik

# Październik 13, 2009, 00:12:04
A mógłbym o wytłumacznie tego prosić?
I jakie jeszcze są kalizje?

Offline ShadowDancer

  • Redaktor

# Październik 13, 2009, 00:16:03
Są prostokątne i okrągłe. Ile ty masz lat? Zadajesz takie podstawowe pytania. Najpierw "ubierasz" każdy kolidujący obiekt w prostokąt i jeśli prostokąty się stykają to sprawdzasz per pixel.

Offline Rabbcio

  • Użytkownik

# Październik 13, 2009, 00:21:00
Hmmm... Dziwne, że nie pomyślałem o tym...
I jak coś to mam 15 lat Xd

Offline Oti

  • Użytkownik

# Październik 13, 2009, 00:24:58
Hmmm... Dziwne, że nie pomyślałem o tym...
I jak coś to mam 15 lat Xd
Aha Xd
Najpierw "ubierasz" każdy kolidujący obiekt w prostokąt i jeśli prostokąty się stykają to sprawdzasz per pixel.
Myślałem, że on pytał o inne rodzaje kolizji Xd A ty mu wytłumaczyłeś jak to zoptymalizowac Xd

Offline Rabbcio

  • Użytkownik

# Październik 13, 2009, 00:38:06
Pytałem o inne typy kolizji...
Ale teraz próbuje ten jego pomysł zrealizować z getpixel.

Offline Rabbcio

  • Użytkownik

# Październik 13, 2009, 00:52:51
Próbowałem i mi nie wyszło :P

Offline Avaj

  • Użytkownik

# Październik 13, 2009, 08:03:49
Próbowałem i mi nie wyszło :P

Jak nie wyszło to olej, nie przeciążaj się.

Offline Rabbcio

  • Użytkownik

# Październik 13, 2009, 08:56:02
Chwilowo zostawię, ale jutro pewnie do tego wrócę...

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Październik 13, 2009, 14:07:21
O ile dobrze kojarzę to miałem gdzieś to zaimplementowane w XNA :P

Ogólnie rzecz biorąc polega to z grubsza na sprawdzeniu grupy pixeli które na siebie nachodzą pod względem kanału ALPHA.
Tzn. jeśli dany obszar wspólny dwóch obrazków nie jest przeźroczysty występuje kolizja.

Brak kolizji (Czerowny - obszar wspólny, Zielony obszar całego obrazka nie wspólnego):


Kolizja (Punkt na niebiesko - pixel kolidujący):


W telegraficznym skrócie :)
1. Najpierw sprawdzaj czy dwa dane obiekty są blisko siebie (znaczy się zachodzą na siebie).
2. Potem tworzysz pętle z zakresu zachodzenia się obrazków i sprawdzasz czy dany pixel jest rysowany. (Tutaj najlepiej skorzystać z funkcji abs przy liczeniu zakresu)
3. Jeśli oba są widoczne znaczy się jest kolizja. Jeśli tylko jeden z nich lub wcale nie mamy kolizji.
« Ostatnia zmiana: Październik 13, 2009, 14:10:03 wysłana przez Lavi »