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
[Allegro 5] Kolizje per pixel
» 2013-07-08 17:50:11
Siemka, potrzebuje stworzyć kolizje do gry, najlepsza chyba będzie kolizja pixel per pixel. Trochę o niej czytałem w internecie, ale nie mam pomysłu jak to zrobić. Jestem w tej kwestii zielony.
P-87269
kubawal
» 2013-07-08 18:37:32
Przeczytaj to i przerzuć sobie na Al5 :)
http://lazyfoo.net​/SDL_tutorials/lesson18/
P-87270
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-08 18:46:12
Po angielsku i  nie wiele rozumiem. Ale mniej więcej już mi jaśniej, tylko nadal nie wiem jak to zrobić. Bo mam sobie patyczaka i on, ma iść przez świat, no i ten świat to załóżmy czarne linie i na to nałożone tło. No i nie mam pojęcia jak zrobić, aby postać nie zapadała się w dół, nie szła za daleko w lewo/prawo, ani gdy bd skakać, żeby nie skakała za wysoko.
P-87271
kubawal
» 2013-07-08 18:56:33
Chodzi chyba o tą funkcję, wystarczy zmienić te SDL_Rect na odpowiedniki w Allegro (nie znam się na Allegro5):
C/C++
bool check_collision( std::vector < SDL_Rect > & A, std::vector < SDL_Rect > & B )
{
    //The sides of the rectangles
    int leftA, leftB;
    int rightA, rightB;
    int topA, topB;
    int bottomA, bottomB;
   
    //Go through the A boxes
    for( int Abox = 0; Abox < A.size(); Abox++ )
    {
        //Calculate the sides of rect A
        leftA = A[ Abox ].x;
        rightA = A[ Abox ].x + A[ Abox ].w;
        topA = A[ Abox ].y;
        bottomA = A[ Abox ].y + A[ Abox ].h;
       
        //Go through the B boxes   
        for( int Bbox = 0; Bbox < B.size(); Bbox++ )
        {
            //Calculate the sides of rect B
            leftB = B[ Bbox ].x;
            rightB = B[ Bbox ].x + B[ Bbox ].w;
            topB = B[ Bbox ].y;
            bottomB = B[ Bbox ].y + B[ Bbox ].h;
           
            //If no sides from A are outside of B
            if((( bottomA <= topB ) ||( topA >= bottomB ) ||( rightA <= leftB ) ||( leftA >= rightB ) ) == false )
            {
                //A collision is detected
                return true;
            }
        }
    }
   
    //If neither set of collision boxes touched
    return false;
}
P-87272
MrPoxipol
» 2013-07-08 19:13:51
Frazy, które należy wpisać w wyszukiwarkę google:
http://wiki.allegro.cc​/index.php​?title=Pixel_Perfect_Collision
P-87274
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-08 20:34:49
Znalazłem taki oto kod:
C/C++
ALLEGRO_DISPLAY * display = al_create_display( 800, 600 );
ALLEGRO_BITMAP * bmp = al_get_backbuffer( display ); // tego nie ogarniam
ALLEGRO_LOCKED_REGION * lock = al_lock_bitmap( bmp, ALLEGRO_PIXEL_FORMAT_ANY, ALLEGRO_LOCK_READWRITE ); // tego to w ogóle nic
int r, g, b;
ALLEGRO_COLOR color = al_get_pixel( bmp, x, y );
al_unmap_rgb( color,( unsigned char * ) & r,( unsigned char * ) & g,( unsigned char * ) & b ); //tego tez
al_unlock_bitmap( bmp ); // no i tu mam problem
if( r == 255 && g == 255 && b == 255 )
{
    //
}
Po części go rozumiem, ale nie w całości. Zaznaczyłem, czego nie wiem. Mógłby mi ktoś to objaśnić? Bo nie znalazłem w temacie wyjaśnienia do tego, a na razie nie mogę nic znaleźć.
P-87277
SeaMonster131
» 2013-07-08 22:39:31
@up: To zobacz w dokumentacji.
P-87286
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-09 10:45:57
Znalazłem wszystko w dokumentacji, ale nadal nie rozumiem. Bo po angielsku, nawet z tłumaczem cienko idzie :/

edit: jednak trochę się wysiliłem i wiem już mniej więcej co od czego jest. Ale mam problem, bo nie ogarniam, jak zrobić, aby mój ludzik podczas kolizji nie zapadał się w dół i gdy np. jest wzniesienie, on szedł pod tą górkę. A gdy przeszkoda to, żeby musiał przeskoczyć :/
P-87297
« 1 » 2 3 4 5 6
  Strona 1 z 6 Następna strona