Exemple #1
0
void Tower::Update(float deltaTime)
{
	ElapsedTime += deltaTime;
	
	if (!Targets.empty())
	{
		CurrTarget = Targets[0];
		LookAtTarget(CurrTarget->Transform.Position.ToVec2());

		if (Distance(CurrTarget->Transform.Position.ToVec2()) <= Range)
		{
			if (ElapsedTime >= FireTimer)
			{
				ElapsedTime = 0;
				EventData e(SHOOT_BULLET, static_cast<void *>(&Owner));
				EventManager::PostEvent(e);
				Log("Firing bullet");
			}
		}
		else
		{
			RemoveTarget(CurrTarget);
		}

	}
}
	//! called during the update of the entity
	void KamikazeAttacker::Update()
	{
		if(m_fHitPoints < 0.0f || !GSETTINGS)
		{
			return;
		}

		auto settings = DYNAMIC_CAST(m_Settings, KamikazeAttackerSettings);
		switch (m_eState)
		{
		case KamikazeAttacker::S_Moving:
			{		
				Vector3 vToHQ = m_TargetHQ->GetAbsolutePosition() - GetAbsolutePosition();
				bool reachedHQ = false;
				if ((int)m_CurrentTarget > (int)m_Path.size() - 3)
				{
					float fDistToHQSq = vToHQ.GetLengthSquared();
					reachedHQ = fDistToHQSq < settings->m_fHQKamikazeRange*settings->m_fHQKamikazeRange;
				}
				if (reachedHQ)
				{
					m_fDecelTimer = 0.0f;
					m_eState = S_PreparingAttack;
					m_bTargetReached = true;
					break;
				}

				if (!m_bTargetReached)
					MoveToTarget();
				else
					SteerToTarget();

				LookAtTarget();
			}
			break;

		case S_PreparingAttack:
			{
				if (m_TargetHQ->GetHitPoints() < 0.0f)
				{
					if (auto nextTarget = WAVEMGR->GetNextHQ())
					{
						m_TargetHQ = nextTarget;
						m_eState = S_Moving;
					}
					else
						m_eState = S_Idle;
				}
				else
				{
					m_vSpeed = Math::Damp(m_vSpeed, Vector3::Zero, g_fDeltaTime, settings->m_fDecelDuration);
					m_fDecelTimer += g_fDeltaTime;
					if (m_fDecelTimer > settings->m_fDecelDuration)
					{
						m_eState = S_AttackingHQ;
						break;
					}

					Translate(m_vSpeed * g_fDeltaTime);

					auto vToHQ = (m_TargetHQ->GetAbsolutePosition() - GetAbsolutePosition()).Normalized();
					m_vLookAt = Math::Damp(m_vLookAt, vToHQ, g_fDeltaTime, 0.1f).Normalized();
					LookAt(m_vLookAt);
				}
			}
			break;

		case KamikazeAttacker::S_AttackingHQ:
			{
				Vector3 vToHQ = (m_TargetHQ->GetAbsolutePosition() - GetAbsolutePosition()).Normalized();
				Vector3 vAcceleration = vToHQ*settings->m_fKamikazeMaxAccel*g_fDeltaTime;
				m_vSpeed += vAcceleration;
				m_vSpeed.Limit(settings->m_fKamikazeMaxSpeed);
				Translate(m_vSpeed * g_fDeltaTime);
			}
			break;		
		}

		super::Update();
	}	
	//! called during the update of the entity
	void ShootingAttacker::Update()
	{
		if(m_fHitPoints < 0.0f)
			return;

		switch (m_eState)
		{
		case shoot::ShootingAttacker::S_Moving:
			{
				bool reachedHQ = false;
				if ((int)m_CurrentTarget > (int)m_Path.size() - 3)
				{
					float fDistToHQSq = (m_TargetHQ->GetAbsolutePosition() - GetAbsolutePosition()).GetLengthSquared();
					reachedHQ = fDistToHQSq < m_AttackerSettings->m_fHQRange*m_AttackerSettings->m_fHQRange;
				}				
				if (reachedHQ)
				{
					m_ShootTarget = m_TargetHQ;
					m_eState = S_AttackingHQ;
					m_bTargetReached = true;

					auto hoverAnim = static_cast<Visitor*>(GetMeshEntity()->GetComponent("HoverAnim"));
					hoverAnim->Visit(GetMeshEntity());
					break;
				}

				if (!m_bTargetReached)
					MoveToTarget();
				else
				{
					// this is the second target, just steer to it
					SteerToTarget();
				}
				
				LookAtTarget();
			}
			break;

		case shoot::ShootingAttacker::S_AttackingHQ:
			{
				if (m_TargetHQ->GetHitPoints() < 0.0f)
				{
					if (auto nextTarget = WAVEMGR->GetNextHQ())
					{
						m_TargetHQ = nextTarget;
						m_eState = S_Moving;
					}
					else
						m_eState = S_Idle;
				}
				else
				{
					SteerToTarget();
					AimAndShoot();
				}
			}
			break;
		}

		super::Update();
	}