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