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
» 2013-07-24 19:19:46
Coś dzwoni, ale nie w tym kościele co trzeba. No bo
for( x = pozycja_x; x < pozycja_x + al_get_bitmap_width( postac ); x++ )
 Załóżmy, że postać znajduje się na pozycji 20x30 pixeli. No to nadaje wartość dla x 20 i powiększam ją, aż dojdzie do 20 + szerokość bitmapy czyli w moim przypadku 70. Tak samo dzieje się z wysokością.
P-88692
pekfos
» 2013-07-24 19:25:03
Załóżmy, że postać znajduje się na pozycji 20x30 pixeli. No to nadaje wartość dla x 20
No.. i co masz odjąć, by z 20 zrobić 0..?
P-88693
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-24 19:32:46
Ale po co robić to 0?
P-88694
pekfos
» 2013-07-24 19:35:58
Bo mapa i ludzik to dwa różne sprajty? Na mapie później rysujesz ludzika pod (x, y), więc zaczynasz pobierać piksele z mapy od (x, y). Sam ludzik zaczyna się od (0, 0), więc zaczynasz pobierać piksele z ludzika od...
P-88695
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-24 19:40:25
od zera ^^

/edit już chyba wszystko zrozumiałem :) zaraz spróbuje to wszystko poprawić i napiszę efekty
/edit znowu a więc wielkie dzięki bo udało mi się wcielić to w życie. Oto mój 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 = 0; x < al_get_bitmap_width( postac ); x++ )
    {
        for( y = 0; 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 + pozycja_x, y + pozycja_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;
       
    }
    //  al_unlock_bitmap( sprite );
    if( czy_wykrylo )
    {
        czy_wykrylo = false;
        return true;
    }
    else
    {
        return false;
    }
}
Ale przy
al_convert_mask_to_alpha( ludek, al_map_rgb( 255, 0, 255 ) );
 kolizja działa po staremu, dopiero jak wyrzuciłem i zmieniłem kod zaczęło działać poprawnie, a tło muszę wywalić bo no niestety Chuck Noris na różowym tle nie wygląda zbyt przekonująco :/

/edit można jakoś sprawdzić czy kolor jest przezroczysty, czy nie?

/edit mam pewien pomysł, ale mam pytanie, czy mogę jakoś włączać i wyłączać maskowanie?
P-88696
Gabes
» 2013-07-25 23:05:53
Stwórz czarno białą bitmapę mapę bitową Chucka Norrisa i to z nią sprawdzaj kolizje, albo
al_unmap_rgba
 sprawdzaj czwarty parametr alfa czy zero.
P-88802
Forczek
Temat założony przez niniejszego użytkownika
» 2013-07-26 10:43:22
Ten drugi sposób mnie zaciekawił. Tylko wyjaśniłbyś mi jaśniej jak to zrobić?
P-88819
pekfos
» 2013-07-26 14:58:22
Użyj al_unmap_rgba() i sprawdzaj, wartość kanału alfa? Nie wiem czy wiesz, ale założenie tematu na forum nie zwalnia cię z myślenia i samodzielnego szukania..
https://www.allegro.cc/manual​/5/al_unmap_rgba
P-88834
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona