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ść
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
C/C++
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
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 = 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 );
P-87895
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..
P-87903
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.
P-87904
pekfos
» 2013-07-15 12:09:59
Poprawiłeś pętle? Jak wywaliłeś else?
P-87906
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-15 12:15:41
C/C++
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 );
}
P-87909
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.
P-87913
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 :/
P-87914
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).
P-87915
1 2 3 « 4 » 5 6
Poprzednia strona Strona 4 z 6 Następna strona