#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) };