Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro 5] Kolizje per pixel

Ostatnio zmodyfikowano 2013-07-15 13:48
Autor Wiadomość
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
P-87830
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-14 14:22:40
Znalazłem coś podobnego, co bardziej rozumiem.
C/C++
bool colision( PMASK * mask, ALLEGRO_BITMAP * sprite ) // Tutaj wywala mi błąd przy PSMASK * mask
{
    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 ); // nie rozumiem tego
                return true;
            }
            else
            {
                set_pmask_pixel( mask, x, y, 1 ); // tego tez
                return false;
            }
        }
    }
    al_unlock_bitmap( sprite );
}
No nie rozumiem do końca.
P-87846
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:
C/C++
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.

C/C++
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 );
}
P-87850
pekfos
» 2013-07-15 11:20:33
C/C++
return czy_wykryto;
al_unlock_bitmap( sprite );
Zastanów się, co to robi.
P-87887
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.
P-87888
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.
P-87889
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.
P-87891
pekfos
» 2013-07-15 11:30:16
Problem jest z x i y. Pętle są źle napisane i pobierasz piksele gdzieś za sprajtem.
P-87892
1 2 « 3 » 4 5 6
Poprzednia strona Strona 3 z 6 Następna strona