Forczek Temat założony przez niniejszego użytkownika |
[Allegro 5] Pixel per pixel. Problem z kolizją. » 2013-07-24 18:35:39 Siemka, wcześniej miałem podobny temat, ale musiałem wprowadzić jedno ulepszenie. Wcześniej pobierałem pixele z całego obszaru bitmapy. Ale doszedłem do wniosku, że muszę pobierać tylko tam gdzie jest narysowana postać. Oto kod: int colision( ALLEGRO_BITMAP * sprite, ALLEGRO_BITMAP * postac, int pozycja_x, int pozycja_y, int numer_koloru ) { int x, y; bool czy_wykrylo = false; unsigned char r, g, b; al_lock_bitmap( sprite, ALLEGRO_LOCK_READONLY, al_get_bitmap_format( sprite ) ); al_lock_bitmap( postac, ALLEGRO_LOCK_READONLY, al_get_bitmap_format( postac ) ); for( x = pozycja_x; x < pozycja_x + al_get_bitmap_width( postac ); x++ ) { for( y = pozycja_y; y < pozycja_y + al_get_bitmap_height( postac ); y++ ) { al_unmap_rgb( al_get_pixel( postac, x, y ), & r, & g, & b ); if( !( r == 255 && g == 0 && b == 255 ) ) { al_unmap_rgb( al_get_pixel( sprite, x, y ), & r, & g, & b ); if( numer_koloru == 1 && r == 0 && g == 0 && b == 0 ) { czy_wykrylo = true; } if( numer_koloru == 2 && r == 255 && g == 0 && b == 0 ) { czy_wykrylo = true; } } } if( czy_wykrylo ) break; } if( czy_wykrylo ) { czy_wykrylo = false; return true; } else { return false; } }
Sprite to bitmapa na której zaznaczyłem kolizje, a postać, to moja postać. Tło zrobiłem różowe, tak jak trzeba było robić w allegro 4, czyli 255,0,255. Ale kolizja działa po staremu. Czyli koliduje, ale całą powierzchnią bitmapy. |
|
pekfos |
» 2013-07-24 18:50:56 Podajesz złe x i y dla pierwszego al_get_pixel(). |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-24 18:53:38 Przeanalizowałem kod jeszcze raz, pod względem x i y i nie zauważyłem tego błędu. |
|
pekfos |
» 2013-07-24 18:56:30 Podajesz za duże x/y i odczytujesz piksele poza sprajtem.. |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-24 19:00:38 Na początku nadaje im wartość jaką ma moja postać. X i y za każdym obiegiem pętli są zwiększane, aż osiągnął końcową liczbe w prawym dolnym rogu sprita. A tym spritem jest mój ludzik. |
|
pekfos |
» 2013-07-24 19:05:24 Tym sprajtem nie jest twój ludzik, tylko mapa kolizji i nie osiąga prawego dolnego rogu mapy, tylko prawego dolnego rogu sprajta ludzika gdyby był w tym miejscu wyświetlony. Jeśli ludzik nie jest wyświetlony pod (0, 0), (a nie można zakładać, że jest) nie możesz podawać dla obu al_get_pixel() tych samych wartości x i y. |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-24 19:06:54 Słusznie, a więc jakie wartości podać dla pierwszych? |
|
pekfos |
» 2013-07-24 19:12:06 Domyśl się. Masz zacząć od 0 i skończyć na al_get_bitmap_width(), etc. Od razu widać, co trzeba odjąć.. |
|
« 1 » 2 3 |