BubbleBobbleRemake / BubbleBobble / ZenChanStates.cpp
ZenChanStates.cpp
Raw
#include "ZenChanComponent.h"
#include "ZenChanStates.h"
#include "AnimatedTextureComponent.h"
#include "ISoundSystem.h"
#include "GameObject.h"
#include "ColliderComponent.h"
#include "LevelComponent.h"
#include "PickupComponent.h"

namespace dae
{
	//*********************
	//ZenChan FROZEN STATE
	//*********************

	void ZenChanFrozenState::Enter(ZenChanComponent* )
	{
		m_FreezeTimer = m_FreezeDuration;
	}
	void ZenChanFrozenState::Update(ZenChanComponent* pZenChanComp, float deltaTime)
	{
		if (m_FreezeTimer > 0)
		{
			m_FreezeTimer -= deltaTime;
			return;
		}

		pZenChanComp->ChangeState(RUNNING);
	}
	void ZenChanFrozenState::Exit(ZenChanComponent*)
	{
	}
	void ZenChanFrozenState::Move(ZenChanComponent* , float , float )
	{
	}

	//*********************
	//ZenChan RUNNING STATE
	//*********************

	void ZenChanRunningState::Enter(ZenChanComponent* pZenChanComp)
	{
		pZenChanComp->GetAnimComp()->SetSpritesPerSecond(16);
		pZenChanComp->GetAnimComp()->Play(0, 3);
	}
	void ZenChanRunningState::Update(ZenChanComponent* pZenChanComp, float deltaTime)
	{
		pZenChanComp->SetJumpTimer(pZenChanComp->GetJumpTimer() + deltaTime);
		if (pZenChanComp->GetJumpTimer() >= pZenChanComp->GetJumpDuration())
		{
			Move(pZenChanComp, 0, 1.f);
			pZenChanComp->SetJumpTimer(0);
		}

		pZenChanComp->SetRunTimer(pZenChanComp->GetRunTimer() + deltaTime);
		if (pZenChanComp->GetRunTimer() >= pZenChanComp->GetRunDuration())
		{
			if (pZenChanComp->GetDirection() == EnemyFacingDirection::LEFT)
			{
				pZenChanComp->SetDirection(EnemyFacingDirection::RIGHT);
			}
			else
			{
				pZenChanComp->SetDirection(EnemyFacingDirection::LEFT);
			}
			pZenChanComp->SetRunTimer(0);
		}

		if (pZenChanComp->GetDirection() == EnemyFacingDirection::LEFT)
		{
			Move(pZenChanComp, -1.f, 0);
		}
		else
		{
			Move(pZenChanComp, 1.f, 0);
		}

		pZenChanComp->HandleMovement(deltaTime);
	}
	void ZenChanRunningState::Exit(ZenChanComponent*)
	{
	}
	void ZenChanRunningState::Move(ZenChanComponent* pZenChanComp, float dirX, float dirY)
	{
		// flip sprite?
		pZenChanComp->ChangeDirection(dirX, dirY);

		// set current x movement speed
		if (fabs(dirX) > FLT_EPSILON)
			pZenChanComp->SetCurrentXSpeed(dirX * pZenChanComp->GetMoveSpeed());

		// set current y movement speed
		if (fabs(dirY) > FLT_EPSILON)
			pZenChanComp->SetCurrentYSpeed(-dirY * pZenChanComp->GetJumpSpeed());
	}

	//***************************
	//ZenChan RUNNING ANGRY STATE
	//***************************

	void ZenChanRunningAngryState::Enter(ZenChanComponent* pZenChanComp)
	{
		pZenChanComp->GetAnimComp()->SetSpritesPerSecond(16);
		pZenChanComp->GetAnimComp()->Play(4, 7);
	}
	void ZenChanRunningAngryState::Update(ZenChanComponent* pZenChanComp, float deltaTime)
	{
		pZenChanComp->SetJumpTimer(pZenChanComp->GetJumpTimer() + deltaTime);
		if (pZenChanComp->GetJumpTimer() >= pZenChanComp->GetJumpDuration())
		{
			Move(pZenChanComp, 0, 1.f);
			pZenChanComp->SetJumpTimer(0);
		}

		pZenChanComp->SetRunTimer(pZenChanComp->GetRunTimer() + deltaTime);
		if (pZenChanComp->GetRunTimer() >= pZenChanComp->GetRunDuration())
		{
			if (pZenChanComp->GetDirection() == EnemyFacingDirection::LEFT)
			{
				pZenChanComp->SetDirection(EnemyFacingDirection::RIGHT);
			}
			else
			{
				pZenChanComp->SetDirection(EnemyFacingDirection::LEFT);
			}
			pZenChanComp->SetRunTimer(0);
		}

		if (pZenChanComp->GetDirection() == EnemyFacingDirection::LEFT)
		{
			Move(pZenChanComp, -1.f, 0);
		}
		else
		{
			Move(pZenChanComp, 1.f, 0);
		}

		pZenChanComp->HandleMovement(deltaTime);
	}
	void ZenChanRunningAngryState::Exit(ZenChanComponent*)
	{
	}
	void ZenChanRunningAngryState::Move(ZenChanComponent* pZenChanComp, float dirX, float dirY)
	{
		// flip sprite?
		pZenChanComp->ChangeDirection(dirX, dirY);

		// set current x movement speed
		if (fabs(dirX) > FLT_EPSILON)
			pZenChanComp->SetCurrentXSpeed(dirX * pZenChanComp->GetMoveSpeed() * 1.5f);

		// set current y movement speed
		if (fabs(dirY) > FLT_EPSILON)
			pZenChanComp->SetCurrentYSpeed(-dirY * pZenChanComp->GetJumpSpeed());
	}

	//******************
	//ZenChan DEAD STATE
	//******************

	void ZenChanDeadState::Enter(ZenChanComponent* pZenChanComp)
	{
		pZenChanComp->SetCurrentYSpeed(-pZenChanComp->GetJumpSpeed() / 2);

		pZenChanComp->GetGameObject()->GetComponent<ColliderComponent>()->SetIgnoreFlag(true);

		pZenChanComp->GetAnimComp()->SetSpritesPerSecond(6);
		pZenChanComp->GetAnimComp()->Play(12, 15);
	}
	void ZenChanDeadState::Update(ZenChanComponent* pZenChanComp, float deltaTime)
	{
		pZenChanComp->HandleMovement(deltaTime);

		if (pZenChanComp->m_IsGrounded)
		{
			m_FruitTimer += deltaTime;
			if (m_FruitTimer >= m_FruitDuration)
			{
				pZenChanComp->GetGameObject()->SetActive(false);

				GameObject* pWatermelon = new GameObject();
				pWatermelon->SetParent(pZenChanComp->GetGameObject()->GetRootGameObject());
				pWatermelon->AddComponent(new PickupComponent(PickupId::WATERMELON, pZenChanComp->GetGameObject()->GetWorldPosition().x, pZenChanComp->GetGameObject()->GetWorldPosition().y, pZenChanComp->m_pLevelComponent->GetPlayersColliders()));
			}
		}
	}
	void ZenChanDeadState::Exit(ZenChanComponent* pZenChanComp)
	{
		pZenChanComp->GetGameObject()->GetComponent<ColliderComponent>()->SetIgnoreFlag(false);
		pZenChanComp->GetGameObject()->SetActive(true);
	}
	void ZenChanDeadState::Move(ZenChanComponent* , float , float )
	{

	}

	//*************************
	//ZenChan IN BUBBLE STATE
	//*************************

	void ZenChanInBubbleState::Enter(ZenChanComponent* pZenChanComp)
	{
		pZenChanComp->GetGameObject()->SetActive(false);
	}
	void ZenChanInBubbleState::Update(ZenChanComponent*, float)
	{

	}
	void ZenChanInBubbleState::Exit(ZenChanComponent* pZenChanComp)
	{
		pZenChanComp->GetGameObject()->SetActive(true);
	}
	void ZenChanInBubbleState::Move(ZenChanComponent*, float, float)
	{
		
	}
}