Example #1
0
SSC2::SSC2(int numX, int numY, SoccerTeam2* team):m_pTeam(team)
{
    m_pBestSupportingSpot = NULL;
    const Region* PlayingField = team->Pitch()->PlayingArea();

    //calculate the positions of each sweet spot, create them and
    //store them in m_Spots
    double HeightOfSSRegion = PlayingField->Height() * 0.8;
    double WidthOfSSRegion  = PlayingField->Width() * 0.9;
    double SliceX = WidthOfSSRegion / numX ;
    double SliceY = HeightOfSSRegion / numY;

    double left  = PlayingField->Left() + (PlayingField->Width()-WidthOfSSRegion)/2.0 + SliceX/2.0;
    double right = PlayingField->Right() - (PlayingField->Width()-WidthOfSSRegion)/2.0 - SliceX/2.0;
    double top   = PlayingField->Top() + (PlayingField->Height()-HeightOfSSRegion)/2.0 + SliceY/2.0;

    for (int x=0; x<(numX/2)-1; ++x)
    {
        for (int y=0; y<numY; ++y)
        {
            if (m_pTeam->Color() == SoccerTeam::blue)
            {
                m_Spots.push_back(SupportSpot(Vector2D(left+x*SliceX, top+y*SliceY), 0.0));
            }

            else
            {
                m_Spots.push_back(SupportSpot(Vector2D(right-x*SliceX, top+y*SliceY), 0.0));
            }
        }
    }

    //create the regulator
    m_pRegulator = new Regulator(Prm.SupportSpotUpdateFreq);
}
void SupportSpotCalculator::onInitialize() 
{
	mCoolingTime = addComponent(new CoolingTimeComponent(Prm.SupportSpotUpdateCoolTime, getName() + "CoolTime"));

	mSpots.clear();

	// Initialize support spots' positions
	float pitch_width = mTeam->getPitch()->getPlayingArea()->getWidth();
	float pitch_height = mTeam->getPitch()->getPlayingArea()->getHeight();
	float scale = 0.7;
	float px = pitch_width * 0.6 * (1 - scale) / 2;
	float py = pitch_height * (1 - scale) / 2;
	float dx = (pitch_width * 0.52 - px * 2) / (Prm.NumSupportSpotX - 1);
	float dy = (pitch_height - py * 2) / (Prm.NumSupportSpotY - 1);

	float left = mTeam->getPitch()->getPlayingArea()->getLeft();
	float right = mTeam->getPitch()->getPlayingArea()->getRight();
	float top = mTeam->getPitch()->getPlayingArea()->getTop();
	Ogre::SceneNode* scene_node = mTeam->getPitch()->getSceneNode();

	for (int i = 0; i < Prm.NumSupportSpotX; ++i)
	{
		for (int j = 0; j < Prm.NumSupportSpotY; ++j)
		{
			if (mTeam->getTeamColor() == Team::BLUE)
			{
				mSpots.push_back(SupportSpot(Ogre::Vector3(left + px + i * dx, 0, top + py + j * dy), 0.f));
				mSpots.back().drawer = std::shared_ptr<CircleDrawer>(new CircleDrawer(
					"Blue" + dt::Utils::toString(i * Prm.NumSupportSpotX + j), scene_node, 0.08f, "PlayerFlagBlue"));
				mSpots.back().drawer->setPos(mSpots.back().position);
			}
			else 
			{
				mSpots.push_back(SupportSpot(Ogre::Vector3(right - px - i * dx, 0, top + py + j * dy), 0.f));
				mSpots.back().drawer = std::shared_ptr<CircleDrawer>(new CircleDrawer(
					"Red" + dt::Utils::toString(i * Prm.NumSupportSpotX + j), scene_node, 0.08f, "PlayerFlagRed"));
				mSpots.back().drawer->setPos(mSpots.back().position);
			}
		}
	}

	mTotalScore = Prm.SpotCanShootScore + Prm.SpotPassSafeScore + Prm.SpotClosenessToSupportingPlayerScore + 
		Prm.SpotAheadOfAttackerScore + Prm.SpotDistFromCtrlPlayerScore;
}
SupportSpotCalculator::SupportSpotCalculator(int numX, int numY, Team* team)
	:bestSupportSpot(NULL),
	team(team),
	frameCounter(0),
	noOfFramesBeforeUpdate(100)
{
	const PitchRegion* PlayingField = team->match->pitch->PitchArea();

	//calculate the positions of each sweet spot, create them and 
	//store them in m_Spots
	double HeightOfSSRegion = PlayingField->rect.h * 1;
	double WidthOfSSRegion  = PlayingField->rect.w * 0.5;
	double SliceX = WidthOfSSRegion / numX ;
	double SliceY = HeightOfSSRegion / numY;

	double left  = PlayingField->rect.x + (PlayingField->rect.w-WidthOfSSRegion)/2.0 + SliceX/2.0;
	double right = (PlayingField->rect.x + PlayingField->rect.w) - (PlayingField->rect.w-WidthOfSSRegion)/2.0 - SliceX/2.0;
	double top   = PlayingField->rect.y + (PlayingField->rect.h-HeightOfSSRegion)/2.0 + SliceY/2.0;
	double bottom = (PlayingField->rect.y + PlayingField->rect.h) - (PlayingField->rect.h - HeightOfSSRegion) / 2.0 - SliceY/2.0;

	for (int y=0; y< (numY / 2) -1; ++y)
	{
		for (int x=0; x< numX; ++x)
		{
			if (team->Home())
			{
				spots.push_back(SupportSpot(b2Vec2(left + x * SliceX, top + y * SliceY), 0.0));
			}

			else
			{
				spots.push_back(SupportSpot(b2Vec2(left + x * SliceX, bottom - y * SliceY), 0.0));
			}
		}
	}

	color = b2Color(1, 0, 0);
}