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

[Allegro 5] Pixel per pixel. Problem z kolizją.

Ostatnio zmodyfikowano 2013-07-31 09:03
Autor Wiadomość
Forczek
Temat założony przez niniejszego użytkownika
[Allegro 5] Pixel per pixel. Problem z kolizją.
» 2013-07-24 18:35:39
Siemka, wcześniej miałem podobny temat, ale musiałem wprowadzić jedno ulepszenie. Wcześniej pobierałem pixele z całego obszaru bitmapy. Ale doszedłem do wniosku, że muszę pobierać tylko tam gdzie jest narysowana postać. Oto kod:
C/C++
int colision( ALLEGRO_BITMAP * sprite, ALLEGRO_BITMAP * postac, int pozycja_x, int pozycja_y, int numer_koloru )
{
    int x, y;
    bool czy_wykrylo = false;
    unsigned char r, g, b;
    al_lock_bitmap( sprite, ALLEGRO_LOCK_READONLY, al_get_bitmap_format( sprite ) );
    al_lock_bitmap( postac, ALLEGRO_LOCK_READONLY, al_get_bitmap_format( postac ) );
    for( x = pozycja_x; x < pozycja_x + al_get_bitmap_width( postac ); x++ )
    {
        for( y = pozycja_y; y < pozycja_y + al_get_bitmap_height( postac ); y++ )
        {
            al_unmap_rgb( al_get_pixel( postac, x, y ), & r, & g, & b );
            if( !( r == 255 && g == 0 && b == 255 ) )
            {
                al_unmap_rgb( al_get_pixel( sprite, x, y ), & r, & g, & b );
                if( numer_koloru == 1 && r == 0 && g == 0 && b == 0 )
                {
                    czy_wykrylo = true;
                }
                if( numer_koloru == 2 && r == 255 && g == 0 && b == 0 )
                {
                    czy_wykrylo = true;
                }
            }
        }
        if( czy_wykrylo ) break;
       
    }
    if( czy_wykrylo )
    {
        czy_wykrylo = false;
        return true;
    }
    else
    {
        return false;
    }
}
Sprite to bitmapa na której zaznaczyłem kolizje, a postać, to moja postać. Tło zrobiłem różowe, tak jak trzeba było robić w allegro 4, czyli 255,0,255. Ale kolizja działa po staremu. Czyli koliduje, ale całą powierzchnią bitmapy.
P-88684
pekfos
» 2013-07-24 18:50:56
Podajesz złe x i y dla pierwszego al_get_pixel().
P-88685
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-24 18:53:38
Przeanalizowałem kod jeszcze raz, pod względem x i y i nie zauważyłem tego błędu.
P-88686
pekfos
» 2013-07-24 18:56:30
Podajesz za duże x/y i odczytujesz piksele poza sprajtem..
P-88687
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-24 19:00:38
Na początku nadaje im wartość jaką ma moja postać. X i y za każdym obiegiem pętli są zwiększane, aż osiągnął końcową liczbe w prawym dolnym rogu sprita. A tym spritem jest mój ludzik.
P-88688
pekfos
» 2013-07-24 19:05:24
Tym sprajtem nie jest twój ludzik, tylko mapa kolizji i nie osiąga prawego dolnego rogu mapy, tylko prawego dolnego rogu sprajta ludzika gdyby był w tym miejscu wyświetlony. Jeśli ludzik nie jest wyświetlony pod (0, 0), (a nie można zakładać, że jest) nie możesz podawać dla obu al_get_pixel() tych samych wartości x i y.
P-88689
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-24 19:06:54
Słusznie, a więc jakie wartości podać dla pierwszych?
P-88690
pekfos
» 2013-07-24 19:12:06
Domyśl się. Masz zacząć od 0 i skończyć na al_get_bitmap_width(), etc. Od razu widać, co trzeba odjąć..
P-88691
« 1 » 2 3
  Strona 1 z 3 Następna strona