Ejemplo n.º 1
0
	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;
	}
Ejemplo n.º 2
0
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 );
	}

}