boolean CollisionTree::ManageCollision(CCollider * i_A, CCollider * i_B) { boolean _Result = false; // If the bounds collide : test on the real box/forms if (CBoxCollider * _A = dynamic_cast<CBoxCollider *>(i_A)) { if (CBoxCollider * _B = dynamic_cast<CBoxCollider *>(i_B)) _Result = BoxVsBox(*_A, *_B); else if (CCircleCollider * _B = dynamic_cast<CCircleCollider *>(i_B)) _Result = BoxVsCircle(*_A, *_B); } else if (CCircleCollider * _A = dynamic_cast<CCircleCollider *>(i_A)) { if (CBoxCollider * _B = dynamic_cast<CBoxCollider *>(i_B)) _Result = BoxVsCircle(*_B, *_A); else if (CCircleCollider * _B = dynamic_cast<CCircleCollider *>(i_B)) _Result = CircleVsCircle(*_A, *_B); } if (_Result) { SManifold _Manifold(*i_A, *i_B, sf::Vector2f(i_A->GetPosition() - i_B->GetPosition())); SendMessage(_Manifold); } // No collision test return _Result; }
void Phx::Check( Shape * A , Shape * B ) { Collision * c ; // Tworzymy strukturê danych o kolizji if( A->type == circle && B->type == circle ) // Sprawdzamy typy obiektów { Circle * circleA = static_cast<Circle*>(A); Circle * circleB = static_cast<Circle*>(B); if( A->global == false ) circleA->calc_glob(); if( B->global == false ) circleB->calc_glob(); c = CircleVsCircle(circleA , circleB); if( c != NULL ) Collisions.push_back(c); // Jeœli tak to zapisujemy t¹ kolizjê return; // Koñczymy funkcjê } if( A->type == polygon && B->type == polygon ) { Poly * polygonA = static_cast<Poly*>(A); // Rzutuje wskaŸniki Poly * polygonB = static_cast<Poly*>(B); if( A->global == false ) polygonA->calc_glob(); if( B->global == false ) polygonB->calc_glob(); c = PolygonVsPolygon(polygonA,polygonB); if( c != NULL ) Collisions.push_back(c); return; } if( A->type == polygon && B->type == circle ) { Poly * polygonA = static_cast<Poly*>(A); // Rzutuje wskaŸniki Circle * circleB = static_cast<Circle*>(B); if( A->global == false ) polygonA->calc_glob(); if( B->global == false ) circleB->calc_glob(); c = PolygonVsCircle(polygonA,circleB); if( c != NULL ) Collisions.push_back(c); return; } if( A->type == circle && B->type == polygon ) { Poly * polygonB = static_cast<Poly*>(B); // Rzutuje wskaŸniki Circle * circleA = static_cast<Circle*>(A); if( A->global == false ) circleA->calc_glob(); if( B->global == false ) polygonB->calc_glob(); c = PolygonVsCircle(polygonB,circleA); if( c != NULL ) Collisions.push_back(c); return; } if( A->type == complex ) { Complex * com = static_cast<Complex*>(A); if(com-> global == false ) com->calc_glob(); for(int i=0;i<com->size;i++) { Check( com->childs[i].sh , B ); } } if( B->type == complex ) { Complex * com = static_cast<Complex*>(B); if(com-> global == false ) com->calc_glob(); for(int i=0;i<com->size;i++) Check( com->childs[i].sh , A ); } }