Bomberman-OverlordEngine-x64 / BombermanGame / Prefabs / Bomberman / Player.h
Player.h
Raw
#pragma once
struct PlayerDesc
{
	PlayerDesc(
		PxMaterial* pMaterial,
		float radius = .5f,
		float height = 2.f)
	{
		controller.setToDefault();
		controller.radius = radius;
		controller.height = height;
		controller.material = pMaterial;
		controller.climbingMode = PxCapsuleClimbingMode::eCONSTRAINED;
		controller.slopeLimit = 1;
		controller.stepOffset = 0.1f;
		controller.contactOffset = 0.1f;
	}

	float maxMoveSpeed{ 72.5f };
	float moveAccelerationTime{ 0.f };

	PxCapsuleControllerDesc controller{};

	int actionId_MoveLeft{ -1 };
	int actionId_MoveRight{ -1 };
	int actionId_MoveUp{ -1 };
	int actionId_MoveDown{ -1 };
	int actionId_DropBomb{ -1 };
};

class Player : public GameObject
{

public:
	enum class State : int
	{
		IDLE,
		IDLE_LOOK_UP,
		RUNNING,
		RUNNING_LOOK_UP,
		CLEAN_SHOE,
		DEAD,
		WIN
	};

	Player(const PlayerDesc& characterDesc, float tileSize);
	~Player() override = default;

	Player(const Player& other) = delete;
	Player(Player&& other) noexcept = delete;
	Player& operator=(const Player& other) = delete;
	Player& operator=(Player&& other) noexcept = delete;

	void DrawImGui();
	int GetPoints() { return m_Points; }

	State GetState() { return m_State; }

	void AddPoints(int points) { m_Points += points; }

	void Kill();
	void Win();

protected:
	void Initialize(const SceneContext&) override;
	void Update(const SceneContext&) override;

	void DropBomb(const SceneContext&);

private:
	int m_Points{ 0 };
	int m_NormalFaceMatId{ 0 };
	int m_HappyFaceMatId{ 0 };
	int m_SadFaceMatId{ 0 };

	int m_Power{ 2 };
	int m_NrBombs{ 3 };

	State m_State;
	float m_TileSize;

	ControllerComponent* m_pControllerComponent{};
	ModelComponent* m_pModel{ nullptr };
	ModelAnimator* m_pAnimator{ nullptr };

	PlayerDesc m_PlayerDesc;
	float m_MoveAcceleration{};						//Acceleration required to reach maxMoveVelocity after 1 second (maxMoveVelocity / moveAccelerationTime)
	float m_MoveSpeed{};								//MoveSpeed > Horizontal Velocity = MoveDirection * MoveVelocity (= TotalVelocity.xz)

	float m_CurrentRotationY{ 0.0f };
	float m_TargetRotationY{ 0.0f };
	float m_RotationLerpTime{ 0.1f };

	XMFLOAT3 m_TotalVelocity{};						//TotalVelocity with X/Z for Horizontal Movement AND Y for Vertical Movement (fall/jump)
	XMFLOAT3 m_CurrentDirection{};					//Current/Last Direction based on Camera forward/right (Stored for deacceleration)
};