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

[Allegro 5] kolizja per pixel

Ostatnio zmodyfikowano 2013-10-22 14:45
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
[Allegro 5] kolizja per pixel
» 2013-10-19 14:27:21
Witam mam problem  z kolizją per pixel ogólnie funkcja kolizji dobrze mi działa oto funkcja:

C/C++
int top, bottom, leftt, roghtt;
bool kolizja2( ALLEGRO_BITMAP * map1, ALLEGRO_BITMAP * map2
, float x, float y, float ex, float ey, int width, int height )
{
    if( x + width < ex || x > ex + width || y + height < ey || y > ey + height )
    {
        return false;
    }
    else
    {
       
        top = max( y, ey );
        bottom = min( y + height, ey + height );
        leftt = max( x, ex );
        rightt = min( x + width, ex + width );
        for( int i = top; i < bottom; i++ )
        {
            for( int j = leftt; j < rightt; j++ )
            {
                al_lock_bitmap( map1, al_get_bitmap_format( map1 ), ALLEGRO_LOCK_READONLY );
                al_lock_bitmap( map2, al_get_bitmap_format( map2 ), ALLEGRO_LOCK_READONLY );
                ALLEGRO_COLOR color = al_get_pixel( map1, j - x, i - y );
                ALLEGRO_COLOR color2 = al_get_pixel( map2, j - ex, i - ey );
                if( color.a != 0 && color2.a != 0 )
                {
                   
                    return true;
                }
            }
        }
    }
    return false;
}

funkcja działa mi dla obrazków o rozmiarze 30 pixeli niestety gdy chcę zrobić kolizję na obrazkach o rozmiarach 200 pixeli z czego boss zajmuje prawie cały obrazek a pociski z tych 200 pixeli maja zaledwie kilka.Ogólnie dochodzi do kolizji i mniej więcej wszystko działa ale gdy pociski przelatują blisko lewej strony bosa to kolizja nie zachodzi, dodam tez że gdy strzelam po lewej stronie bosa w dalszej odległości gra trochę zaczyna zamulać
   

to moja część kodu która odpowiada za tą kolizję itR to wektor bosa , itP wektor pocisków
co najdziwniejsze jeżeli zmieniam na obrazku pocisku jego pozycję bo zajmuje kilka pixeli na 200x200 to kolizja zachodzi ineczej a nie powinno tak być. Proszę o pomoc, funkcja kolizji wzięta z http://www.codingmadeeasy.ca/ allegro tutorial 5

C/C++
for( itP = Pociski.begin(); itP != Pociski.end(); itP++ )
{
    itR = Rboss.begin();
    while( itR != Rboss.end() && Rboss.size() > 0 )
    {
       
        if( kolizja2( boss1png, pocisk3, itR->getX(), itR->getY(), itP->getX(), itP->getY(), 200, 200 ) ) //kolijza robakow 1b z pociskiem
        {
           
            Wybuch.push_back( wybuch( itP->getX(), itP->getY(), 0 ) );
            itP->insertY( - 100 ); //zamiast itP=Pociski.erase(itP) bo mam jeszcze funkcje ktora odpowiada za usuwanie obiektów itP których współrzędna jest poniżej 10
            //al_play_sample(robakDead,1.0,0.0f,1.0,ALLEGRO_PLAYMODE_ONCE,0);
            itR->addHp( - player.getDamage() );
            if( itR->gethp() < 1 )
            {
               
                Wybuch.push_back( wybuch( itR->getX(), itR->getY(), 0 ) );
                bonus += 1;
                itR = Rboss.erase( itR );
                player.addPunkty( 10 );
                player.addCpunkty( player.getPunkty() );
            }
           
        }
        else
        {
            itR++;
        }
    }
   
}
P-94007
DejaVu
» 2013-10-22 14:45:22
Kolizja nie zachodzi bo zapewne pociski omijają przeciwnika w wyniku tunnelingu. Więcej informacji o tunnelingu:
Frazy, które należy wpisać w wyszukiwarkę google:
Algorytm natomiast zaczyna Ci mulić, ponieważ Twój algorytm ma pesymistyczną złożoność:

O(pociskow*bossow*boss_width*boss_height*fps).
P-94295
« 1 »
  Strona 1 z 1