Mattowy Temat założony przez niniejszego użytkownika |
[SDL2.0] Kolizja obiektów - kulka-kulka oraz kulka-ściana » 2014-09-23 23:05:32 Witam! Mam problem z algorytmem kolizyjnym. Na ekranie tworzą mi się 3. obiekty. Dwie kulki i prostokąt. Poruszam się kulką, a moimi przeszkodami są pozostałe elementy. Problem polega na tym, ze moja kulka maksymalnie może dojechać do pozycji x-owej pierwszej napotkanej przeszkody. Nie przekroczy jej przy żadnej współrzędnej y. Circle - struktura o obiektach x,y oraz r. Oto moje algorytmy kolizji double distanceSquared( int x1, int y1, int x2, int y2 ) { int deltaX = x2 - x1; int deltaY = y2 - y1; return deltaX * deltaX + deltaY * deltaY; }
bool checkCollision( Circle & a, Circle & b ) { int totalRadiusSquared = a.r + b.r; if( sqrt( distanceSquared( a.x, a.y, b.x, b.y ) ) <( totalRadiusSquared ) ) { return true; } return false; }
bool checkCollision( Circle & a, SDL_Rect & b ) { int x1, x2; int y1, y2; x1 = b.x; x2 = b.x + b.w; y1 = b.y; y2 = b.y + b.h; if(( a.x + a.r > x1 ) &&( a.x - a.r < x2 ) &&( a.y + a.r > y1 ) &&( a.y - a.r < y2 ) ) return true; else return false; }
Wykorzystywane są do tej metody: void Dot::move( SDL_Rect & square, Circle & circle, bool( * checkCollisionCC )( Circle &, Circle & ), bool( * checkCollisionCR )( Circle &, SDL_Rect & ) ) { mPosX += mVelX; shiftColliders(); if(( mPosX - mCollider.r < 0 ) ||(( mPosX - mCollider.r + DOT_WIDTH ) > SCREEN_WIDTH ) || checkCollisionCR( mCollider, square ) || checkCollisionCC( mCollider, circle ) ) { mPosX -= mVelX; shiftColliders(); } mPosY += mVelY; shiftColliders(); if(( mPosY - mCollider.r < 0 ) ||(( mPosY - mCollider.r + DOT_HEIGHT ) > SCREEN_HEIGHT ) || checkCollisionCR( mCollider, square ) || checkCollisionCC( mCollider, circle ) ) { mPosY -= mVelY; shiftColliders(); } }
W powyższej metodzie używam wskaźnika na funkcje. Algorytmy kolizji implementuję w mainie, metody w osobnych plikach. W głównej pętli programu wykorzystuję to tak: wall - obiekt prostokąta otherDot.getCollider - tutaj zostanie zwrócony mi obiekt koło o strukturze x, y i r(promień) dot.move( wall, otherDot.getCollider(), & checkCollision, & checkCollision );
|
|
maly |
» 2014-09-24 09:37:09 To bool checkCollision( Circle & a, SDL_Rect & b ) jest tylko sprawdzanie kolizji między prostokątami. Podejrzewam że nikt tu niepomoże bez odsyłania w Googla więc wrzucę to co ja używam do sprawdzenia kolizji między okręgiem a prostokątem: bool intersects( float cx, float cy, float radius, float left, float top, float right, float bottom ) { float closestX =( cx < left ? left:( cx > right ? right: cx ) ); float closestY =( cy < top ? top:( cy > bottom ? bottom: cy ) ); float dx = closestX - cx; float dy = closestY - cy; return( dx * dx + dy * dy ) <= radius * radius; } |
|
Mattowy Temat założony przez niniejszego użytkownika |
up » 2014-09-24 16:39:41 To jest to samo, co ja napisałem, tylko innym kodem. |
|
maly |
» 2014-09-24 16:59:43 To jest zupełnie coś innego niż Ty napisałeś, ale z tym innym kodem masz całkowitą rację, to jest napisane innym kodem:) |
|
pekfos |
» 2014-09-24 18:13:46 if( sqrt( distanceSquared( a.x, a.y, b.x, b.y ) ) <( totalRadiusSquared ) )
|
Porównujesz pierwiastek z kwadratem. |
|
« 1 » |