
Untitled
By: a guest on Oct 28th, 2009 | syntax:
C++ | size: 1.79 KB | hits: 89 | expires: Never
bool FieldPlayer::isClosestTeamMemberToSupportingOpponent()const
{
if(this->Team()->Opponents()->SupportingPlayer() == 0)
return false;
else
return this == Team()->ClosestPlayerToSupportingOpponent();
}
//------------------ ClosestPlayerToSupportingOpponent ------------------------
//
// Nicolas Bertoa
//
// returns the closest FIELD player, in the Wait, ReturnToHomeRegion or
// MarkSupportingOpponent state, to the supporting opponent.
//
//-----------------------------------------------------------------------------
FieldPlayer* SoccerTeam::ClosestPlayerToSupportingOpponent()
{
// Get the supporting opponent player position
PlayerBase* supportingOpp = Opponents()->SupportingPlayer();
assert(supportingOpp != 0);
Vector2D supportingOppPosition = supportingOpp->Pos();
// Get the closest player
double minDistance = MaxDouble;
FieldPlayer* closestPlayer = 0;
std::vector<PlayerBase*>::const_iterator it = m_Players.begin();
for (it; it != m_Players.end(); ++it)
{
if ( (*it)->Role() != PlayerBase::goal_keeper )
{
//cast to a field player
FieldPlayer* plyr = static_cast<FieldPlayer*>(*it);
if (plyr->GetFSM()->isInState(*Wait::Instance()) ||
plyr->GetFSM()->isInState(*ReturnToHomeRegion::Instance()) ||
plyr->GetFSM()->isInState(*MarkSupportingOpponent::Instance()))
{
// get the distance between this player and the supporting
// opponent player.
double tempDistance = Vec2DDistance(supportingOppPosition, plyr->Pos());
// Update the min distance and the player.
if (tempDistance < minDistance)
{
minDistance = tempDistance;
closestPlayer = plyr;
}
}
}
}
return closestPlayer;
}