| 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 |