1 #ifndef PHYSICSCOMPONENT_H_ 2 #define PHYSICSCOMPONENT_H_ 3 4 #include <Box2D/Box2D.h> 5 #include "../../SharedDefines.h" 6 #include "../ActorComponent.h" 7 #include "../Actor.h" 8 9 class ControllableComponent; 10 class PhysicsComponent : public ActorComponent 11 { 12 public: 13 PhysicsComponent(); 14 virtual ~PhysicsComponent(); 15 16 static const char* g_Name; VGetName()17 virtual const char* VGetName() const override { return g_Name; } 18 19 virtual bool VInit(TiXmlElement* data) override; 20 virtual TiXmlElement* VGenerateXml() override; 21 virtual void VPostInit() override; 22 virtual void VPostPostInit() override; 23 24 virtual void VUpdate(uint32 msDiff) override; 25 Destroy()26 void Destroy() { m_pPhysics->VRemoveActor(m_pOwner->GetGUID()); } 27 28 void SetControllableComponent(ControllableComponent* pComp); 29 GetDirection()30 Direction GetDirection() { return m_Direction; } 31 void SetDirection(Direction newDirection); 32 CanBounce()33 bool CanBounce() const { return m_CanBounce; } SetCanBounce(bool canBounce)34 void SetCanBounce(bool canBounce) { m_CanBounce = canBounce; } 35 CanJump()36 bool CanJump() const { return m_CanJump; } SetCanJump(bool canJump)37 void SetCanJump(bool canJump) { m_CanJump = canJump; } 38 GetMaxJumpHeight()39 int32 GetMaxJumpHeight() const { return m_MaxJumpHeight; } 40 void SetMaxJumpHeight(int32 maxJumpHeight); 41 SetGravityScale(float gravityScale)42 void SetGravityScale(float gravityScale) { m_pPhysics->VSetGravityScale(m_pOwner->GetGUID(), gravityScale); } GetGravityScale()43 float GetGravityScale() { return m_GravityScale; } RestoreGravityScale()44 void RestoreGravityScale() { m_pPhysics->VSetGravityScale(m_pOwner->GetGUID(), m_GravityScale); } GetFriction()45 float GetFriction() { return m_Friction; } GetDensity()46 float GetDensity() { return m_Density; } 47 GetBodySize()48 Point GetBodySize() const { return m_ActorBodyDef.size; } GetBodyWidth()49 double GetBodyWidth() const { return m_ActorBodyDef.size.x; } GetBodyHeight()50 double GetBodyHeight() const { return m_ActorBodyDef.size.y; } 51 SetCurrentSpeed(Point speed)52 void SetCurrentSpeed(Point speed) { m_CurrentSpeed = speed; } SetConstantSpeed(Point speed)53 void SetConstantSpeed(Point speed) { m_ConstantSpeed = speed; } HasConstantSpeed()54 bool HasConstantSpeed() { return m_HasConstantSpeed; } StopMovement()55 void StopMovement() { m_CurrentSpeed = 0; m_ConstantSpeed = 0; } 56 57 void RequestClimb(Point climbMovement); 58 59 void OnBeginFootContact(); 60 void OnEndFootContact(); 61 void OnStartFalling(); 62 void OnStartJumping(); 63 64 void OnAttachedToRope(); 65 void OnDetachedFromRope(); 66 GetNumFootContacts()67 int32 GetNumFootContacts() { return m_NumFootContacts; } IsOnGround()68 bool IsOnGround() { return m_NumFootContacts > 0; } IsInAir()69 bool IsInAir() { return m_IsFalling || m_IsJumping; } IsFalling()70 bool IsFalling() { return m_IsFalling; } IsJumping()71 bool IsJumping() { return m_IsJumping; } IsClimbing()72 bool IsClimbing() { return m_IsClimbing; } IsOnLadder()73 bool IsOnLadder() { return m_OverlappingLaddersList.size() > 0; } GetClimbingSpeed()74 Point GetClimbingSpeed() { return m_ClimbingSpeed; } 75 76 void SetFalling(bool falling); 77 void SetJumping(bool jumping); 78 AddJumpHeight(float deltaHeight)79 void AddJumpHeight(float deltaHeight) { m_HeightInAir += deltaHeight; } GetHeightInAir()80 float GetHeightInAir() { return m_HeightInAir; } SetHeightInAir(float heightInAir)81 void SetHeightInAir(float heightInAir) { m_HeightInAir = heightInAir; } 82 AddFallHeight(float deltaFallHeight)83 void AddFallHeight(float deltaFallHeight) { m_FallHeight += deltaFallHeight; } SetFallHeight(float fallHeight)84 void SetFallHeight(float fallHeight) { m_FallHeight = fallHeight; } GetFallHeight()85 float GetFallHeight() { return m_FallHeight; } 86 87 void SetForceFall(); 88 89 bool AttachToLadder(); 90 91 bool CheckOverlap(FixtureType withWhatFixture); 92 SetExternalSourceSpeed(const Point & externalSpeed)93 void SetExternalSourceSpeed(const Point& externalSpeed) { m_ExternalSourceSpeed = externalSpeed; } SetMovingPlatformContact(b2Contact * pContact)94 void SetMovingPlatformContact(b2Contact* pContact) { m_pMovingPlatformContact = pContact; } 95 96 // Communication with IGamePhysics GetVelocity()97 Point GetVelocity() { return m_pPhysics->VGetVelocity(m_pOwner->GetGUID()); } SetVelocity(Point velocity)98 void SetVelocity(Point velocity) { m_pPhysics->VSetLinearSpeed(m_pOwner->GetGUID(), velocity); } 99 ApplyLinearImpulse(Point impulse)100 void ApplyLinearImpulse(Point impulse) { m_pPhysics->VApplyLinearImpulse(m_pOwner->GetGUID(), impulse); } ApplyForce(Point force)101 void ApplyForce(Point force) { m_pPhysics->VApplyForce(m_pOwner->GetGUID(), force); } 102 IsAwake()103 bool IsAwake() { return m_pPhysics->VIsAwake(m_pOwner->GetGUID()); } 104 105 void SetIsForcedUp(bool isForcedUp, int forcedUpHeight); GetIsForcedUp()106 bool GetIsForcedUp() { return m_bIsForcedUp; } 107 AddOverlappingLadder(const b2Fixture * ladder)108 void AddOverlappingLadder(const b2Fixture* ladder) { m_OverlappingLaddersList.push_back(ladder); } 109 void RemoveOverlappingLadder(const b2Fixture* ladder); 110 111 void AddOverlappingGround(const b2Fixture* pGround); 112 void RemoveOverlappingGround(const b2Fixture* pGround); 113 114 void AddOverlappingKinematicBody(const b2Body* pBody); 115 void RemoveOverlappingKinematicBody(const b2Body* pBody); 116 SetTopLadderContact(b2Contact * pContact)117 void SetTopLadderContact(b2Contact* pContact) { m_pTopLadderContact = pContact; } GetTopLadderContact()118 b2Contact* GetTopLadderContact() { return m_pTopLadderContact; } 119 SetExternalConveyorBeltSpeed(const Point & extSpeed)120 void SetExternalConveyorBeltSpeed(const Point& extSpeed) { m_ExternalConveyorBeltSpeed = extSpeed; } 121 122 private: 123 // Configurable data read from XML 124 bool m_CanClimb; 125 bool m_CanBounce; 126 bool m_CanJump; 127 int32 m_MaxJumpHeight; 128 float m_GravityScale; 129 float m_Friction; 130 float m_Density; 131 132 Point m_BodySize; 133 int32 m_NumFootContacts; 134 135 bool m_IsClimbing; 136 bool m_IsStopped; 137 bool m_IsRunning; 138 Direction m_Direction; 139 140 bool m_IsFalling; 141 bool m_IsJumping; 142 float m_HeightInAir; 143 144 float m_FallHeight; 145 146 bool m_HasConstantSpeed; 147 Point m_ConstantSpeed; 148 149 Point m_CurrentSpeed; 150 Point m_ExternalSourceSpeed; 151 Point m_ExternalConveyorBeltSpeed; 152 153 Point m_ClimbingSpeed; 154 155 // Hackerino to prevent loop jumping with space pressed 156 bool m_IgnoreJump; 157 158 ControllableComponent* m_pControllableComponent; 159 160 shared_ptr<IGamePhysics> m_pPhysics; 161 162 int m_DoNothingTimeout; 163 164 // Actor body definition for physics body creation 165 ActorBodyDef m_ActorBodyDef; 166 bool m_bClampToGround; 167 168 // Spring caused us to go up 169 bool m_bIsForcedUp; 170 int m_ForcedUpHeight; 171 172 b2Contact* m_pTopLadderContact; 173 b2Contact* m_pMovingPlatformContact; 174 175 std::vector<const b2Body*> m_OverlappingKinematicBodiesList; 176 std::vector<const b2Fixture*> m_OverlappingLaddersList; 177 std::vector<const b2Fixture*> m_OverlappingGroundsList; 178 }; 179 180 #endif 181