#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(); m_pStates[RUNNING] = std::make_shared(); m_pStates[RUNNING_ANGRY] = std::make_shared(); m_pStates[DEAD] = std::make_shared(); m_pStates[IN_BUBBLE] = std::make_shared(); } 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(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) { }