Body.cpp
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #pragma once
  2. #include "Stdafx.h"
  3. #include "Vector.cpp"
  4. #include "Shape.cpp"
  5. #include "ShapeDef.cpp"
  6. namespace Box2D
  7. {
  8. namespace Net
  9. {
  10. /// <summary>
  11. /// A rigid body. Internal computation are done in terms
  12. /// of the center of mass position. The center of mass may
  13. /// be offset from the body's origin.
  14. /// </summary>
  15. public ref class Body
  16. {
  17. internal:
  18. b2Body *body;
  19. Body(b2Body *bodyRef) : body(bodyRef) { }
  20. public:
  21. /// <summary>
  22. /// Set the position of the body's origin and rotation (radians).
  23. /// This breaks any contacts and wakes the other bodies.
  24. /// </summary>
  25. void SetXForm(Vector^ position, float32 rotation)
  26. {
  27. body->SetXForm(position->getVec2(), rotation);
  28. }
  29. /// <summary>
  30. /// Get the position of the body's origin. The body's origin does not
  31. /// necessarily coincide with the center of mass. It depends on how the
  32. /// shapes are created.
  33. /// </summary>
  34. XForm^ GetXForm()
  35. {
  36. return gcnew XForm(body->GetXForm());
  37. }
  38. ///<summary>Accesses the linear velocity of the center of mass.</summary>
  39. property Vector^ LinearVelocity
  40. {
  41. Vector^ get()
  42. {
  43. return gcnew Vector(body->GetLinearVelocity());
  44. }
  45. void set(Vector^ value)
  46. {
  47. body->SetLinearVelocity(value->getVec2());
  48. }
  49. }
  50. ///<summary>Accesses the angular velocity.</summary>
  51. property float32 AngularVelocity
  52. {
  53. float32 get()
  54. {
  55. return body->GetAngularVelocity();
  56. }
  57. void set(float32 value)
  58. {
  59. body->SetAngularVelocity(value);
  60. }
  61. }
  62. ///<summary> Apply a force at a world point. Additive. </summary>
  63. void ApplyForce(Vector^ Force, Vector^ Point)
  64. {
  65. body->ApplyForce(Force->getVec2(), Point->getVec2());
  66. }
  67. ///<summary> Apply a torque.  Additive. </summary>
  68. void ApplyTorque(float32 Torque)
  69. {
  70. body->ApplyTorque(Torque);
  71. }
  72. ///<summary> Apply an impulse at a point. This immediately modifies the velocity. </summary>
  73. void ApplyImpulse(Vector^ Impulse, Vector^ Point)
  74. {
  75. body->ApplyImpulse(Impulse->getVec2(), Point->getVec2());
  76. }
  77. ///<summary>Accesses the Mass.</summary>
  78. property float32 Mass
  79. {
  80. float32 get()
  81. {
  82. return body->GetMass();
  83. }
  84. }
  85. ///<summary>Accesses the Mass.</summary>
  86. property float32 Inertia
  87. {
  88. float32 get()
  89. {
  90. return body->GetInertia();
  91. }
  92. }
  93. /// <summary>
  94. /// Get the world coordinates of a point give the local coordinates
  95. /// relative to the body's center of mass.
  96. /// </summary>
  97. Vector^ GetWorldPoint(Vector^ LocalPoint)
  98. {
  99. return gcnew Vector(body->GetWorldPoint(LocalPoint->getVec2()));
  100. }
  101. /// <summary>
  102. /// Get the world coordinates of a vector given the local coordinates.
  103. /// </summary>
  104. Vector^ GetWorldVector(Vector^ LocalVector)
  105. {
  106. return gcnew Vector(body->GetWorldVector(LocalVector->getVec2()));
  107. }
  108. /// <summary>
  109. /// Returns a local point relative to the center of mass given a world point.
  110. /// </summary>
  111. Vector^ GetLocalPoint(Vector^ WorldPoint)
  112. {
  113. return gcnew Vector(body->GetLocalPoint(WorldPoint->getVec2()));
  114. }
  115. /// <summary>
  116. /// Returns a local vector given a world vector.
  117. /// </summary>
  118. Vector^ GetLocalVector(Vector^ WorldVector)
  119. {
  120. return gcnew Vector(body->GetLocalVector(WorldVector->getVec2()));
  121. }
  122. ///<summary>Is this body static (immovable)</summary>
  123. property bool Static
  124. {
  125. bool get()
  126. {
  127. return body->IsStatic();
  128. }
  129. }
  130. ///<summary>Is this body frozen</summary>
  131. property bool Frozen
  132. {
  133. bool get()
  134. {
  135. return body->IsFrozen();
  136. }
  137. }
  138. ///<summary>Is this body sleeping</summary>
  139. property bool Sleeping
  140. {
  141. bool get()
  142. {
  143. return body->IsSleeping();
  144. }
  145. }
  146. ///<summary>You can disable sleeping on this particular body.</summary>
  147. property bool AllowSleeping
  148. {
  149. bool get()
  150. {
  151. return body->IsSleeping();
  152. }
  153. void set(bool value)
  154. {
  155. body->AllowSleeping(value);
  156. }
  157. }
  158. property bool Bullet
  159. {
  160. bool get()
  161. {
  162. return body->IsBullet();
  163. }
  164. void set(bool value)
  165. {
  166. body->SetBullet(value);
  167. }
  168. }
  169. void WakeUp()
  170. {
  171. body->WakeUp();
  172. }
  173. ///<summary> Get the list of all shapes attached to this body.</summary>
  174. property IList<Shape^>^ Shapes
  175. {
  176. IList<Shape^>^ get()
  177. {
  178. List<Shape^>^ list = gcnew List<Shape^>();
  179. for(b2Shape *shape = body->GetShapeList(); shape; shape = shape->GetNext())
  180. list->Add(gcnew Shape(shape));
  181. return list;
  182. }
  183. }
  184. void CreateShape(ShapeDef^ def)
  185. {
  186. body->CreateShape(def->def);
  187. }
  188. void DestroyShape(Shape^ shape)
  189. {
  190. body->DestroyShape(shape->shape);
  191. }
  192. void SetMassFromShapes()
  193. {
  194. body->SetMassFromShapes();
  195. }
  196. //TODO:
  197. //void* GetUserData();
  198. //const b2Mat22& GetRotationMatrix() const;
  199. };
  200. }
  201. }
  202. /*
  203. TODO:
  204. public:
  205. // Get the list of all contacts attached to this body.
  206. b2ContactNode* GetContactList();
  207. // Get the list of all joints attached to this body.
  208. b2JointNode* GetJointList();
  209. */