Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-15 11:34:31 Przedstawię moje dwa kody, bo obydwa nie działają do końca poprawnie :/ Najpierw zmodyfikowałem ten bool colision( ALLEGRO_BITMAP * sprite, int pozycja_x, int pozycja_y ) { int x, y; bool czy_wykryto = false; unsigned char r, g, b; al_lock_bitmap( sprite, ALLEGRO_LOCK_READONLY, al_get_bitmap_format( sprite ) ); for( x = pozycja_x; x <= pozycja_x + al_get_bitmap_width( sprite ); x++ ) { for( y = pozycja_y; y <= pozycja_y + al_get_bitmap_height( sprite ); y++ ) { al_unmap_rgb( al_get_pixel( sprite, x, y ), & r, & g, & b ); if( r == 0 && g == 0 && b == 0 ) { czy_wykryto = true; break; } else { czy_wykryto = false; } } if( czy_wykryto ) break; } al_unlock_bitmap( sprite ); return czy_wykryto; }
Ale zwalnia mi i to baaardzo przesuwanie bitmapy. No i zawsze pokazuje wartość true bez względu na kolory RGB. A to stary kod, który nie zwalnia niczego, a jedyną wadą jest pobieranie tylko z jednego pixela bool colision( ALLEGRO_BITMAP * sprite, int pozycja_x, int pozycja_y ) { int x, y; unsigned char r, g, b; al_lock_bitmap( sprite, ALLEGRO_LOCK_READONLY, al_get_bitmap_format( sprite ) ); for( x = pozycja_x; x <= pozycja_x + al_get_bitmap_width( sprite ); x++ ) { for( y = pozycja_y; y <= pozycja_y + al_get_bitmap_height( sprite ); y++ ) { al_unmap_rgb( al_get_pixel( sprite, x, y ), & r, & g, & b ); if( r == 255 && g == 255 && b == 255 ) { return true; } else { return false; } } } al_unlock_bitmap( sprite ); }
No i moim pytaniem jest, czy potrzebna jest ta linijka? al_unlock_bitmap( sprite ); |
|
pekfos |
» 2013-07-15 11:56:50 Dalej pętla jest źle, a wszystkich pikseli nie musisz sprawdzać.. a jedyną wadą jest pobieranie tylko z jednego pixela |
To wywal te else.. |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-15 12:04:37 Jak wywalam else to nadal mam błąd i wtedy wartość jest zawsze true. Teraz jeszcze próbuje jakoś to naprawić, ale wszystkie sugestie mile widziane. |
|
pekfos |
» 2013-07-15 12:09:59 Poprawiłeś pętle? Jak wywaliłeś else? |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-15 12:15:41 bool colision( ALLEGRO_BITMAP * sprite, int pozycja_x, int pozycja_y ) { int x, y; bool czy_wykryto = false; unsigned char r, g, b; al_lock_bitmap( sprite, ALLEGRO_LOCK_READONLY, al_get_bitmap_format( sprite ) ); for( x = pozycja_x; x <= pozycja_x + al_get_bitmap_width( sprite ); x++ ) { for( y = pozycja_y; y <= pozycja_y + al_get_bitmap_height( sprite ); y++ ) { al_unmap_rgb( al_get_pixel( sprite, x, y ), & r, & g, & b ); if( r == 255 && g == 255 && b == 255 ) { czy_wykryto = true; } } } return czy_wykryto; al_unlock_bitmap( sprite ); }
|
|
pekfos |
» 2013-07-15 12:24:11 Pętla dalej zła (dalej odczytujesz pixele za sprajtem), dalej sprawdzasz wszystkie pixele i znowu zostawiasz zablokowanego sprajta. Ogólnie gorzej niż było. |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-15 12:27:56 Nie rozumiem, skoro jako x i y oznaczyłem pozycje mojego sprita co koliduje, a potem pętla wykonuje się aż dojdzie do końca. Tylko chyba też jest jeden problem, bo to nie jest kwadrat :/ |
|
pekfos |
» 2013-07-15 12:30:39 al_get_pixel() pobiera pixel z obrazu, a nie z jakiegoś przekształconego, wyświetlonego gdzieś sprajta (co by nie miało sensu, ale ty to zakładasz). |
|
1 2 3 « 4 » 5 6 |