示例#1
0
void CBirdsFlock::SetEnabled( bool bEnabled )
{
	if (!m_bc.bSpawnFromPoint)
		CFlock::SetEnabled(bEnabled);
	else
	{
		if (m_bEnabled != bEnabled)
		{
			SetAttractOutput(false);
			m_bEnabled	= bEnabled;
			for (Boids::iterator it = m_boids.begin(); it != m_boids.end(); ++it)
			{
				CBoidBird *pBoid = (CBoidBird *)*it;
				float radius	= 0.5; // Spawn not far from origin
				float z				= /*gEnv->p3DEngine->GetTerrainElevation(m_origin.x,m_origin.y) + */7.f + Boid::Frand()*2.f;	// z = terrain height + [5-9]
				pBoid->m_pos	= m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(), radius*Boid::Frand());
				z = .25f*Boid::Frand() + .25f;	// z-heading = 0.0 - 0.5
				pBoid->m_heading		= ( Vec3(Boid::Frand(),Boid::Frand(),z) ).GetNormalized(); 
				pBoid->m_scale			= m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale;
				pBoid->m_speed				= m_bc.MinSpeed + (Boid::Frand()+1)/2.0f*(m_bc.MaxSpeed - m_bc.MinSpeed);
				pBoid->m_dead				= 0;
				pBoid->m_currentAccel(0,0,0);
				pBoid->SetSpawnFromPt(true);
				pBoid->m_fNoCenterAttract = m_bc.factorAttractToOrigin;
				pBoid->m_fNoKeepHeight		= m_bc.factorKeepHeight;
				pBoid->SetAttracted(false);
			}

			if (!bEnabled && m_bEntityCreated)
				DeleteEntities(false);
		}
	}
}
示例#2
0
int CBirdsFlock::GetNumAliveBirds()
{
	int numAliveBoids = 0;
	for (Boids::iterator it = m_boids.begin(),itEnd = m_boids.end(); it != itEnd; ++it)
	{
		CBoidBird* pBoid = static_cast<CBoidBird*>(*it);
		if(pBoid && !pBoid->IsDead())
			++numAliveBoids;
	}
	return numAliveBoids;

}
示例#3
0
void CBirdsFlock::Update(CCamera *pCamera)
{

	UpdateLandingPoints();

	m_isPlayerNearOrigin = GetEntity()!=NULL && IsPlayerInProximity(GetEntity()->GetPos());

	CFlock::Update(pCamera);

	float dt = gEnv->pTimer->GetFrameTime();

	// set the ai object in the middle of the boids
	UpdateAvgBoidPos(dt);

	if(m_status == Bird::FLYING && !m_bc.noLanding &&
			(gEnv->pTimer->GetFrameStartTime()- m_flightStartTime).GetSeconds() > m_flightDuration)
	{
		if(GetEntity() && !m_isPlayerNearOrigin)
			Land();
	}

	if(m_status == Bird::LANDING)
	{
		float timePassed = (gEnv->pTimer->GetFrameStartTime()- m_flightStartTime).GetSeconds();

		if(timePassed < START_LANDING_TIME+0.5f)
		{
			int n = m_boids.size();
			int numBoidsLandingNow = int(float(n*timePassed)/START_LANDING_TIME);

			if(numBoidsLandingNow >n)
				numBoidsLandingNow = n;

			for(int i = 0; i<numBoidsLandingNow ; ++i)
			{
				CBoidBird *bird = static_cast<CBoidBird *>(m_boids[i]);

				if(bird && !bird->IsDead() && !bird->IsLanding())
					bird->Land();
			}
		}

	}


	if(m_status == Bird::LANDING || m_status == Bird::ON_GROUND)
	{
		if(IsPlayerInProximity(GetAvgBoidPos()))
			TakeOff();
	}

}
示例#4
0
void CBirdsFlock::TakeOff()
{
	for (Boids::iterator it = m_boids.begin(),itEnd = m_boids.end(); it != itEnd; ++it)
	{
		CBoidBird* pBoid = static_cast<CBoidBird*>(*it);
		if(pBoid && !pBoid->IsDead())
			pBoid->TakeOff(m_bc);
	}

	m_flightDuration = GetFlightDuration();
	m_flightStartTime = gEnv->pTimer->GetFrameStartTime();
	m_status = Bird::FLYING;
	m_birdsOnGround = 0;
}
示例#5
0
void CBirdsFlock::CreateBoids(SBoidsCreateContext &ctx)
{
	CFlock::CreateBoids(ctx);
	m_boidDefaultAnimName =  m_bc.GetAnimationName(Bird::ANIM_FLY);

	m_bc.bAutoTakeOff = false;

	for(uint32 i = 0; i < m_RequestedBoidsCount; i++)
	{
		CBoidObject *boid = new CBoidBird(m_bc);

		if(m_bc.bSpawnFromPoint)
		{
			CBoidBird *pBoid = (CBoidBird *)boid;
			float radius	= 0.5; // Spawn not far from origin
			float z				= /*gEnv->p3DEngine->GetTerrainElevation(m_origin.x,m_origin.y)*/ + 7.f + Boid::Frand()*2.f;	// z = terrain height + [5-9]
			pBoid->m_pos	= m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(), radius*Boid::Frand());
			z = .25f*Boid::Frand() + .25f;	// z-heading = 0.0 - 0.5
			pBoid->m_heading		= (Vec3(Boid::Frand(),Boid::Frand(),z)).GetNormalized();
			pBoid->m_scale			= m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale;
			boid->m_speed				= m_bc.MinSpeed + (Boid::Frand()+1)/2.0f*(m_bc.MaxSpeed - m_bc.MinSpeed);
			pBoid->m_dead				= 0;
			pBoid->m_currentAccel(0,0,0);
			pBoid->SetSpawnFromPt(true);
			pBoid->m_fNoCenterAttract = m_bc.factorAttractToOrigin;
			pBoid->m_fNoKeepHeight		= m_bc.factorKeepHeight;
			pBoid->SetAttracted(false);
		}
		else
		{
			float radius = m_bc.fSpawnRadius;
			boid->m_pos = m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(),Boid::Frand()*radius);
			boid->m_heading = (Vec3(Boid::Frand(),Boid::Frand(),0)).GetNormalized();
			boid->m_scale = m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale;
			boid->m_speed = m_bc.MinSpeed + (Boid::Frand()+1)/2.0f*(m_bc.MaxSpeed - m_bc.MinSpeed);
		}

		AddBoid(boid);
	}

	m_lastUpdatePosTimePassed = 1;
	m_avgBoidPos = GetPos();
	//
	m_hasLanded = false;
	TakeOff();

	m_terrainPoints = 0;
}