BubbleBobbleRemake / BubbleBobble / ZenChanComponent.cpp
ZenChanComponent.cpp
Raw
#include "ZenChanComponent.h"
#include "GameObject.h"
#include "AnimatedTextureComponent.h"
#include "LevelComponent.h"
#include "ColliderComponent.h"
#include "RigidbodyComponent.h"
#include "ServiceLocator.h"
#include "GameEvents.h"
#include "ZenChanStates.h"

dae::ZenChanComponent::ZenChanComponent(float startX, float startY, EnemyFacingDirection facingDirection)
	: m_StartX{ startX }
	, m_StartY{ startY }
	, m_Direction{ facingDirection }
	, m_StartDirection{ facingDirection }
{
	m_pStates[FROZEN] = std::make_shared<ZenChanFrozenState>();
	m_pStates[RUNNING] = std::make_shared<ZenChanRunningState>();
	m_pStates[RUNNING_ANGRY] = std::make_shared<ZenChanRunningAngryState>();
	m_pStates[DEAD] = std::make_shared<ZenChanDeadState>();
	m_pStates[IN_BUBBLE] = std::make_shared<ZenChanInBubbleState>();
}

dae::ZenChanComponent::~ZenChanComponent()
{
	
}

void dae::ZenChanComponent::RegisterLevel(LevelComponent* pLevelComponent)
{
	m_pLevelComponent = pLevelComponent;
}

void dae::ZenChanComponent::Initialize()
{
	m_pSoundSystem = &ServiceLocator::GetSoundSystem();

	GameObject* pGameObject = GetGameObject();
	pGameObject->SetPosition(m_StartX, m_StartY);

	m_pAnimTexComp = pGameObject->AddComponent(new AnimatedTextureComponent("zenchan.png", 32, 32, 16, 2));
	pGameObject->AddComponent(new ColliderComponent(32, 32, false));
	m_pRigidBodyComponent = pGameObject->AddComponent(new RigidbodyComponent());

	m_pAnimTexComp->SetFlipped(bool(m_Direction));

	ChangeState(FROZEN);
}

void dae::ZenChanComponent::Reset()
{
	m_RunTimer = 0.f;
	m_JumpTimer = 0.f;
	GetGameObject()->SetPosition(m_StartX, m_StartY);

	m_Direction = m_StartDirection;
	m_pAnimTexComp->SetFlipped(bool(m_Direction));

	ChangeState(RUNNING);
	ChangeState(FROZEN);
}

void dae::ZenChanComponent::ChangeDirection(float dirX, float)
{
	if (dirX > 0)
	{
		m_Direction = EnemyFacingDirection::RIGHT;
	}
	else if (dirX < 0)
	{
		m_Direction = EnemyFacingDirection::LEFT;
	}
	m_pAnimTexComp->SetFlipped(bool(m_Direction));
}

void dae::ZenChanComponent::Update(float deltaTime)
{
	reinterpret_cast<IZenChanState*>(m_pCurrentState.get())->Update(this, deltaTime);
}

void dae::ZenChanComponent::HandleMovement(float deltaTime)
{
	if (m_CurrentYSpeed < 0)
	{
		m_IsGrounded = m_pRigidBodyComponent->Move(m_CurrentXSpeed * deltaTime, m_CurrentYSpeed * deltaTime, m_pLevelComponent->GetBorderColliders());
	}
	else
	{
		m_IsGrounded = m_pRigidBodyComponent->Move(m_CurrentXSpeed * deltaTime, m_CurrentYSpeed * deltaTime, m_pLevelComponent->GetNearbyLevelTileColliders());
	}

	auto pos = GetGameObject()->GetWorldPosition();
	if (pos.y > 448.f)
	{
		GetGameObject()->SetPosition(pos.x, 0 - 32.f);
	}

	if (m_CurrentXSpeed < 0)
	{
		m_CurrentXSpeed += m_MoveSpeed;
		if (m_CurrentXSpeed > 0) m_CurrentXSpeed = 0;
	}
	else if (m_CurrentXSpeed > 0)
	{
		m_CurrentXSpeed -= m_MoveSpeed;
		if (m_CurrentXSpeed < 0) m_CurrentXSpeed = 0;
	}

	if (!m_IsGrounded)
	{
		m_CurrentYSpeed += m_AirDecelerationSpeed * deltaTime;
		if (m_CurrentYSpeed > m_MaxFallSpeed) m_CurrentYSpeed = m_MaxFallSpeed;
	}
}

void dae::ZenChanComponent::Die()
{
	m_pSoundSystem->Play(5, 0.5f);
	NotifyObservers(EnemyEvents::KILLED);
	ChangeState(DEAD);
}

void dae::ZenChanComponent::EnterBubble()
{
	ChangeState(IN_BUBBLE);
}

void dae::ZenChanComponent::ExitBubble(float posX, float posY)
{
	GetGameObject()->SetPosition(posX, posY);
	GetGameObject()->SetActive(true);
	ChangeState(RUNNING_ANGRY);
}

void dae::ZenChanComponent::FixedUpdate(float)
{

}