예제 #1
0
void
CMole::UpdatePosition(float _fTimeDelta)
{
	CCircle SelfCircle;
	CWall* pWalls = 0;
	CAcorn* pAcorns = 0;
	CMole* pMoles = 0;
	int iNumWalls = 0;
	int iNumAcorns = 0;
	int iNumMoles = 0;
	bool bCollision = false;


	// Create heading vector
	CFVec2 vHeading(0.0f, -1.0f);
	vHeading.RotateZ(m_fHeading);


	float fMovementVelocity = m_fMovementVelocity + (DIFFICULTY_MOVEMENT_VELOCITY_INCR * m_iDifficultyLevel);


	CFVec2 vNextPosition = m_vPosition;
	vNextPosition += vHeading * (fMovementVelocity * _fTimeDelta);


	SelfCircle.Initialise(vNextPosition, m_fRadius);


	CMMMContext& rMMMContext = CMMMContext::GetInstance();
	rMMMContext.GetWalls(pWalls, iNumWalls);
	rMMMContext.GetAcorns(pAcorns, iNumAcorns);
	rMMMContext.GetMoles(pMoles, iNumMoles);

	

	CCircle EntityCircle;
	SelfCircle.Initialise(vNextPosition, m_fRadius);


	// Check collision against other moles
	for (int i = 0; i < iNumMoles; ++ i)
	{
		if (&pMoles[i] != this)
		{
			EntityCircle.Initialise(pMoles[i].GetPosition(), pMoles[i].GetRadius());


			if (SelfCircle.Overlaps(EntityCircle))
			{
				bCollision = true;
				break;
			}
			else
			{
				// Do nothing
			}
		}
	}


	if (!bCollision)
	{
		// Check collision against walls
		for (int i = 0; i < iNumWalls; ++ i)
		{
			if (SelfCircle.OverlapsLineSegment(pWalls[i].GetEnd0(), pWalls[i].GetEnd1()))
			{
				bCollision = true;


				break;
			}
		}
	}


	if (!bCollision)
	{
		m_vPosition = vNextPosition;
	}
}
예제 #2
0
/**
 *	@param Circle A circle to evaluate to see if it intersects the wall.
 *	@return true if the circle intersects the wall.
 */
bool CWall::Intersects( const CCircle& Circle ) const
{
	return Circle.OverlapsLineSegment( m_vEnd[0], m_vEnd[1] );
}