aaadam |
» 2013-07-14 11:12:14 kolego zobacz poniżej post tam umiesciłem pixel colision tylko ja chcę dodać do obracanych obrazków |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-14 14:22:40 Znalazłem coś podobnego, co bardziej rozumiem. bool colision( PMASK * mask, ALLEGRO_BITMAP * sprite ) { int x, y; unsigned char r, g, b; al_lock_bitmap( sprite, ALLEGRO_LOCK_READONLY, al_get_bitmap_format( sprite ) ); for( x = 0; x < al_get_bitmap_width( sprite ); x++ ) { for( y = 0; 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 ) { set_pmask_pixel( mask, x, y, 0 ); return true; } else { set_pmask_pixel( mask, x, y, 1 ); return false; } } } al_unlock_bitmap( sprite ); }
No nie rozumiem do końca. |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-14 16:49:18 A więc po moich metodach prób i błędów doszedłem do takiego kodu: 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 = al_get_bitmap_width( sprite ); x <= pozycja_x + al_get_bitmap_width( sprite ); x++ ) { for( y = al_get_bitmap_height( sprite ); 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 ); }
Tylko jest jeden błąd, kiedy ustawie wykrywanie czarnego koloru, czyli 0, 0, 0, a nawet nie ma go w obrębie bitmapy zawsze pokazuje wartość true, a jeżeli dam jakikolwiek inny kolor, nie wykrywa mi go. A chodzi mi tutaj o biały czyli 255, 255, 255. /edit Trochę kombinowałem, ale nadal efekt jest zły. Bo jakiej wartości RGB nie wpiszę, zawsze wyskakuje wartość true. bool colision( ALLEGRO_BITMAP * sprite, int pozycja_x, int pozycja_y ) { int x, y; bool czy_wykryto; unsigned char r, g, b; al_lock_bitmap( sprite, ALLEGRO_LOCK_READONLY, al_get_bitmap_format( sprite ) ); for( x = al_get_bitmap_width( sprite ); x <= pozycja_x + al_get_bitmap_width( sprite ); x++ ) { for( y = al_get_bitmap_height( sprite ); 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; } } if( czy_wykryto ) break; } return czy_wykryto; al_unlock_bitmap( sprite ); }
|
|
pekfos |
» 2013-07-15 11:20:33 return czy_wykryto; al_unlock_bitmap( sprite );
|
Zastanów się, co to robi. |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-15 11:21:50 return zwraca mi wartość zmiennej typu bool czy_wykryto. A al_unlock_bitmap(sprite); odblokowuje sprita. |
|
pekfos |
» 2013-07-15 11:23:02 A al_unlock_bitmap(sprite); odblokowuje sprita. |
No właśnie nie. al_unlock_bitmap() nie zostanie nawet wywołane. |
|
Forczek Temat założony przez niniejszego użytkownika |
» 2013-07-15 11:25:08 Zmiana kolejności doprowadziła do ślimaczego tempa w grze, a problem nadal nie zniknął. Nadal pokazuje wartość true. |
|
pekfos |
» 2013-07-15 11:30:16 Problem jest z x i y. Pętle są źle napisane i pobierasz piksele gdzieś za sprajtem. |
|
1 2 « 3 » 4 5 6 |