[Allegro 5] kolizja per pixel
Ostatnio zmodyfikowano 2013-10-22 14:45
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: 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 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 ) ) { Wybuch.push_back( wybuch( itP->getX(), itP->getY(), 0 ) ); itP->insertY( - 100 ); 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++; } } }
|
|
DejaVu |
» 2013-10-22 14:45:22 Kolizja nie zachodzi bo zapewne pociski omijają przeciwnika w wyniku tunnelingu. Więcej informacji o tunnelingu:
Algorytm natomiast zaczyna Ci mulić, ponieważ Twój algorytm ma pesymistyczną złożoność:
O(pociskow*bossow*boss_width*boss_height*fps). |
|
« 1 » |