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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. * Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com
  3. *
  4. * This software is provided 'as-is', without any express or implied
  5. * warranty.  In no event will the authors be held liable for any damages
  6. * arising from the use of this software.
  7. * Permission is granted to anyone to use this software for any purpose,
  8. * including commercial applications, and to alter it and redistribute it
  9. * freely, subject to the following restrictions:
  10. * 1. The origin of this software must not be misrepresented; you must not
  11. * claim that you wrote the original software. If you use this software
  12. * in a product, an acknowledgment in the product documentation would be
  13. * appreciated but is not required.
  14. * 2. Altered source versions must be plainly marked as such, and must not be
  15. * misrepresented as being the original software.
  16. * 3. This notice may not be removed or altered from any source distribution.
  17. */
  18. #ifndef WEB_H
  19. #define WEB_H
  20. // This tests distance joints, body destruction, and joint destruction.
  21. class Web : public Test
  22. {
  23. public:
  24. Web()
  25. {
  26. b2Body* ground = NULL;
  27. {
  28. b2BodyDef bd;
  29. ground = m_world->CreateBody(&bd);
  30. b2PolygonShape shape;
  31. shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f));
  32. ground->CreateFixture(&shape, 0.0f);
  33. }
  34. {
  35. b2PolygonShape shape;
  36. shape.SetAsBox(0.5f, 0.5f);
  37. b2BodyDef bd;
  38. bd.type = b2_dynamicBody;
  39. bd.position.Set(-5.0f, 5.0f);
  40. m_bodies[0] = m_world->CreateBody(&bd);
  41. m_bodies[0]->CreateFixture(&shape, 5.0f);
  42. bd.position.Set(5.0f, 5.0f);
  43. m_bodies[1] = m_world->CreateBody(&bd);
  44. m_bodies[1]->CreateFixture(&shape, 5.0f);
  45. bd.position.Set(5.0f, 15.0f);
  46. m_bodies[2] = m_world->CreateBody(&bd);
  47. m_bodies[2]->CreateFixture(&shape, 5.0f);
  48. bd.position.Set(-5.0f, 15.0f);
  49. m_bodies[3] = m_world->CreateBody(&bd);
  50. m_bodies[3]->CreateFixture(&shape, 5.0f);
  51. b2DistanceJointDef jd;
  52. b2Vec2 p1, p2, d;
  53. jd.frequencyHz = 4.0f;
  54. jd.dampingRatio = 0.5f;
  55. jd.bodyA = ground;
  56. jd.bodyB = m_bodies[0];
  57. jd.localAnchorA.Set(-10.0f, 0.0f);
  58. jd.localAnchorB.Set(-0.5f, -0.5f);
  59. p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA);
  60. p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB);
  61. d = p2 - p1;
  62. jd.length = d.Length();
  63. m_joints[0] = m_world->CreateJoint(&jd);
  64. jd.bodyA = ground;
  65. jd.bodyB = m_bodies[1];
  66. jd.localAnchorA.Set(10.0f, 0.0f);
  67. jd.localAnchorB.Set(0.5f, -0.5f);
  68. p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA);
  69. p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB);
  70. d = p2 - p1;
  71. jd.length = d.Length();
  72. m_joints[1] = m_world->CreateJoint(&jd);
  73. jd.bodyA = ground;
  74. jd.bodyB = m_bodies[2];
  75. jd.localAnchorA.Set(10.0f, 20.0f);
  76. jd.localAnchorB.Set(0.5f, 0.5f);
  77. p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA);
  78. p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB);
  79. d = p2 - p1;
  80. jd.length = d.Length();
  81. m_joints[2] = m_world->CreateJoint(&jd);
  82. jd.bodyA = ground;
  83. jd.bodyB = m_bodies[3];
  84. jd.localAnchorA.Set(-10.0f, 20.0f);
  85. jd.localAnchorB.Set(-0.5f, 0.5f);
  86. p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA);
  87. p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB);
  88. d = p2 - p1;
  89. jd.length = d.Length();
  90. m_joints[3] = m_world->CreateJoint(&jd);
  91. jd.bodyA = m_bodies[0];
  92. jd.bodyB = m_bodies[1];
  93. jd.localAnchorA.Set(0.5f, 0.0f);
  94. jd.localAnchorB.Set(-0.5f, 0.0f);;
  95. p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA);
  96. p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB);
  97. d = p2 - p1;
  98. jd.length = d.Length();
  99. m_joints[4] = m_world->CreateJoint(&jd);
  100. jd.bodyA = m_bodies[1];
  101. jd.bodyB = m_bodies[2];
  102. jd.localAnchorA.Set(0.0f, 0.5f);
  103. jd.localAnchorB.Set(0.0f, -0.5f);
  104. p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA);
  105. p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB);
  106. d = p2 - p1;
  107. jd.length = d.Length();
  108. m_joints[5] = m_world->CreateJoint(&jd);
  109. jd.bodyA = m_bodies[2];
  110. jd.bodyB = m_bodies[3];
  111. jd.localAnchorA.Set(-0.5f, 0.0f);
  112. jd.localAnchorB.Set(0.5f, 0.0f);
  113. p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA);
  114. p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB);
  115. d = p2 - p1;
  116. jd.length = d.Length();
  117. m_joints[6] = m_world->CreateJoint(&jd);
  118. jd.bodyA = m_bodies[3];
  119. jd.bodyB = m_bodies[0];
  120. jd.localAnchorA.Set(0.0f, -0.5f);
  121. jd.localAnchorB.Set(0.0f, 0.5f);
  122. p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA);
  123. p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB);
  124. d = p2 - p1;
  125. jd.length = d.Length();
  126. m_joints[7] = m_world->CreateJoint(&jd);
  127. }
  128. }
  129. void Keyboard(unsigned char key)
  130. {
  131. switch (key)
  132. {
  133. case 'b':
  134. for (int32 i = 0; i < 4; ++i)
  135. {
  136. if (m_bodies[i])
  137. {
  138. m_world->DestroyBody(m_bodies[i]);
  139. m_bodies[i] = NULL;
  140. break;
  141. }
  142. }
  143. break;
  144. case 'j':
  145. for (int32 i = 0; i < 8; ++i)
  146. {
  147. if (m_joints[i])
  148. {
  149. m_world->DestroyJoint(m_joints[i]);
  150. m_joints[i] = NULL;
  151. break;
  152. }
  153. }
  154. break;
  155. }
  156. }
  157. void Step(Settings* settings)
  158. {
  159. Test::Step(settings);
  160. m_debugDraw.DrawString(5, m_textLine, "This demonstrates a soft distance joint.");
  161. m_textLine += 15;
  162. m_debugDraw.DrawString(5, m_textLine, "Press: (b) to delete a body, (j) to delete a joint");
  163. m_textLine += 15;
  164. }
  165. void JointDestroyed(b2Joint* joint)
  166. {
  167. for (int32 i = 0; i < 8; ++i)
  168. {
  169. if (m_joints[i] == joint)
  170. {
  171. m_joints[i] = NULL;
  172. break;
  173. }
  174. }
  175. }
  176. static Test* Create()
  177. {
  178. return new Web;
  179. }
  180. b2Body* m_bodies[4];
  181. b2Joint* m_joints[8];
  182. };
  183. #endif