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; } }
/** * @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] ); }