BubbleBobbleRemake / BubbleBobble / PlayerStates.h
PlayerStates.h
Raw
#pragma once
#include "IState.h"
//class PlayerComponent;

namespace dae
{
    enum PlayerStateId : unsigned
    {
        FROZEN,
        IN_BUBBLE,
        IDLE,
        RUNNING,
        JUMPING,
        FALLING,
        SHOOT_BUBBLE,
        DEAD
    };

    class IPlayerState : public IState<PlayerComponent>
    {
    public:
        virtual void Move(PlayerComponent* pPlayerComp, float dirX, float dirY) = 0;
        virtual void ShootBubble(PlayerComponent* pPlayerComp) = 0;
    };

    class PlayerFrozenState final : public IPlayerState
    {
    public:
        void Enter(PlayerComponent* pPlayerComp) override;
        void Update(PlayerComponent* pPlayerComp, float deltaTime) override;
        void Exit(PlayerComponent* pPlayerComp) override;

        void Move(PlayerComponent* pPlayerComp, float dirX, float dirY) override;
        void ShootBubble(PlayerComponent* pPlayerComp) override;
    
    private:
        float m_FreezeTimer{ 0 };
        float m_FreezeDuration{ 2.5f };
    };

    class PlayerIdleState final : public IPlayerState
    {
    public:
        void Enter(PlayerComponent* pPlayerComp) override;
        void Update(PlayerComponent* pPlayerComp, float deltaTime) override;
        void Exit(PlayerComponent* pPlayerComp) override;

        void Move(PlayerComponent* pPlayerComp, float dirX, float dirY) override;
        void ShootBubble(PlayerComponent* pPlayerComp) override;
    };

    class PlayerRunningState final : public IPlayerState
    {
    public:
        void Enter(PlayerComponent* pPlayerComp) override;
        void Update(PlayerComponent* pPlayerComp, float deltaTime) override;
        void Exit(PlayerComponent* pPlayerComp) override;

        void Move(PlayerComponent* pPlayerComp, float dirX, float dirY) override;
        void ShootBubble(PlayerComponent* pPlayerComp) override;
    };

    class PlayerJumpingState final : public IPlayerState
    {
    public:
        void Enter(PlayerComponent* pPlayerComp) override;
        void Update(PlayerComponent* pPlayerComp, float deltaTime) override;
        void Exit(PlayerComponent* pPlayerComp) override;

        void Move(PlayerComponent* pPlayerComp, float dirX, float dirY) override;
        void ShootBubble(PlayerComponent* pPlayerComp) override;
    };

    class PlayerFallingState final : public IPlayerState
    {
    public:
        void Enter(PlayerComponent* pPlayerComp) override;
        void Update(PlayerComponent* pPlayerComp, float deltaTime) override;
        void Exit(PlayerComponent* pPlayerComp) override;

        void Move(PlayerComponent* pPlayerComp, float dirX, float dirY) override;
        void ShootBubble(PlayerComponent* pPlayerComp) override;
    };

    class PlayerInBubbleState final : public IPlayerState
    {
    public:
        void Enter(PlayerComponent* pPlayerComp) override;
        void Update(PlayerComponent* pPlayerComp, float deltaTime) override;
        void Exit(PlayerComponent* pPlayerComp) override;

        void Move(PlayerComponent* pPlayerComp, float dirX, float dirY) override;
        void ShootBubble(PlayerComponent* pPlayerComp) override;
    };

    class PlayerShootingBubbleState final : public IPlayerState
    {
    public:
        void Enter(PlayerComponent* pPlayerComp) override;
        void Update(PlayerComponent* pPlayerComp, float deltaTime) override;
        void Exit(PlayerComponent* pPlayerComp) override;

        void Move(PlayerComponent* pPlayerComp, float dirX, float dirY) override;
        void ShootBubble(PlayerComponent* pPlayerComp) override;
    };

    class PlayerDeadState final : public IPlayerState
    {
    public:
        void Enter(PlayerComponent* pPlayerComp) override;
        void Update(PlayerComponent* pPlayerComp, float deltaTime) override;
        void Exit(PlayerComponent* pPlayerComp) override;

        void Move(PlayerComponent* pPlayerComp, float dirX, float dirY) override;
        void ShootBubble(PlayerComponent* pPlayerComp) override;

    private:
        float m_DeathTimer{ 0 };
        float m_DeathDuration{ 2.75f / 2.f };

        bool m_DidTryRespawning{ false };
    };
}