BubbleBobbleRemake / BubbleBobble / ZenChanComponent.h
ZenChanComponent.h
Raw
#pragma once
#include "Component.h"
#include "IStateController.h"

class ISoundSystem;

namespace dae
{
	enum class EnemyFacingDirection : unsigned
	{
		LEFT,
		RIGHT
	};
	
	class AnimatedTextureComponent;
	class RigidbodyComponent;
	class LevelComponent;
	class ZenChanComponent : public Component, public IStateController<ZenChanComponent>
	{
	public:
		ZenChanComponent(float startX, float startY, EnemyFacingDirection facingDirection);
		~ZenChanComponent();

		void Initialize() override;

		void Update(float deltaTime) override;
		void FixedUpdate(float deltaTime) override;
		void Render() const override {};

		void EnterBubble();
		void ExitBubble(float posX, float posY);

		void ChangeDirection(float dirX, float);
		EnemyFacingDirection GetDirection() const { return m_Direction; }
		void SetDirection(EnemyFacingDirection direction) { m_Direction = direction; }

		AnimatedTextureComponent* GetAnimComp()	{ return m_pAnimTexComp; }

		void SetCurrentXSpeed(float xSpeed)	{ m_CurrentXSpeed = xSpeed;	}
		float GetCurrentXSpeed() { return m_CurrentXSpeed;}

		void SetCurrentYSpeed(float ySpeed)	{ m_CurrentYSpeed = ySpeed;	}
		float GetCurrentYSpeed() { return m_CurrentYSpeed; }

		float GetMoveSpeed() { return m_MoveSpeed; }
		float GetJumpSpeed() { return m_JumpSpeed; }

		void SetJumpTimer(float value) { m_JumpTimer = value; }
		float GetJumpTimer() { return m_JumpTimer; }
		float GetJumpDuration() { return m_JumpDuration; }

		void SetRunTimer(float value) { m_RunTimer = value; }
		float GetRunTimer() { return m_RunTimer; }
		float GetRunDuration() { return m_RunDuration; }

		void HandleMovement(float deltaTime);

		void RegisterLevel(LevelComponent* pLevelComponent);
		void Reset();
		
		void Die();

		friend class ZenChanFrozenState;
		friend class ZenChanRunningState;
		friend class ZenChanRunningAngryState;
		friend class ZenChanDeadState;
		friend class ZenChanInBubbleState;

	private:
		AnimatedTextureComponent* m_pAnimTexComp{ nullptr };
		RigidbodyComponent* m_pRigidBodyComponent{ nullptr };

		LevelComponent* m_pLevelComponent{ nullptr };

		float m_RunTimer{ 0 };
		float m_RunDuration{ 2.f };

		float m_JumpTimer{ 0 };
		float m_JumpDuration{ 4.f };

		float m_StartX;
		float m_StartY;

		float m_CurrentXSpeed{};
		float m_CurrentYSpeed{};

		const float m_MoveSpeed{ 150.f };
		const float m_MoveSpeedFalling{ 75.f };

		const float m_JumpSpeed{ 300.f };
		const float m_AirDecelerationSpeed{ 525.f };
		const float m_MaxFallSpeed{ 300.f };

		EnemyFacingDirection m_Direction{};
		EnemyFacingDirection m_StartDirection{};

		bool m_IsGrounded{ true };

		ISoundSystem* m_pSoundSystem{ nullptr };
	};
}