TheoJansen.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. // Inspired by a contribution by roman_m
  19. // Dimensions scooped from APE (http://www.cove.org/ape/index.htm)
  20. #ifndef THEO_JANSEN_H
  21. #define THEO_JANSEN_H
  22. class TheoJansen : public Test
  23. {
  24. public:
  25. void CreateLeg(float32 s, const b2Vec2& wheelAnchor)
  26. {
  27. b2Vec2 p1(5.4f * s, -6.1f);
  28. b2Vec2 p2(7.2f * s, -1.2f);
  29. b2Vec2 p3(4.3f * s, -1.9f);
  30. b2Vec2 p4(3.1f * s, 0.8f);
  31. b2Vec2 p5(6.0f * s, 1.5f);
  32. b2Vec2 p6(2.5f * s, 3.7f);
  33. b2FixtureDef fd1, fd2;
  34. fd1.filter.groupIndex = -1;
  35. fd2.filter.groupIndex = -1;
  36. fd1.density = 1.0f;
  37. fd2.density = 1.0f;
  38. b2PolygonShape poly1, poly2;
  39. if (s > 0.0f)
  40. {
  41. b2Vec2 vertices[3];
  42. vertices[0] = p1;
  43. vertices[1] = p2;
  44. vertices[2] = p3;
  45. poly1.Set(vertices, 3);
  46. vertices[0] = b2Vec2_zero;
  47. vertices[1] = p5 - p4;
  48. vertices[2] = p6 - p4;
  49. poly2.Set(vertices, 3);
  50. }
  51. else
  52. {
  53. b2Vec2 vertices[3];
  54. vertices[0] = p1;
  55. vertices[1] = p3;
  56. vertices[2] = p2;
  57. poly1.Set(vertices, 3);
  58. vertices[0] = b2Vec2_zero;
  59. vertices[1] = p6 - p4;
  60. vertices[2] = p5 - p4;
  61. poly2.Set(vertices, 3);
  62. }
  63. fd1.shape = &poly1;
  64. fd2.shape = &poly2;
  65. b2BodyDef bd1, bd2;
  66. bd1.type = b2_dynamicBody;
  67. bd2.type = b2_dynamicBody;
  68. bd1.position = m_offset;
  69. bd2.position = p4 + m_offset;
  70. bd1.angularDamping = 10.0f;
  71. bd2.angularDamping = 10.0f;
  72. b2Body* body1 = m_world->CreateBody(&bd1);
  73. b2Body* body2 = m_world->CreateBody(&bd2);
  74. body1->CreateFixture(&fd1);
  75. body2->CreateFixture(&fd2);
  76. b2DistanceJointDef djd;
  77. // Using a soft distance constraint can reduce some jitter.
  78. // It also makes the structure seem a bit more fluid by
  79. // acting like a suspension system.
  80. djd.dampingRatio = 0.5f;
  81. djd.frequencyHz = 10.0f;
  82. djd.Initialize(body1, body2, p2 + m_offset, p5 + m_offset);
  83. m_world->CreateJoint(&djd);
  84. djd.Initialize(body1, body2, p3 + m_offset, p4 + m_offset);
  85. m_world->CreateJoint(&djd);
  86. djd.Initialize(body1, m_wheel, p3 + m_offset, wheelAnchor + m_offset);
  87. m_world->CreateJoint(&djd);
  88. djd.Initialize(body2, m_wheel, p6 + m_offset, wheelAnchor + m_offset);
  89. m_world->CreateJoint(&djd);
  90. b2RevoluteJointDef rjd;
  91. rjd.Initialize(body2, m_chassis, p4 + m_offset);
  92. m_world->CreateJoint(&rjd);
  93. }
  94. TheoJansen()
  95. {
  96. m_offset.Set(0.0f, 8.0f);
  97. m_motorSpeed = 2.0f;
  98. m_motorOn = true;
  99. b2Vec2 pivot(0.0f, 0.8f);
  100. // Ground
  101. {
  102. b2BodyDef bd;
  103. b2Body* ground = m_world->CreateBody(&bd);
  104. b2PolygonShape shape;
  105. shape.SetAsEdge(b2Vec2(-50.0f, 0.0f), b2Vec2(50.0f, 0.0f));
  106. ground->CreateFixture(&shape, 0.0f);
  107. shape.SetAsEdge(b2Vec2(-50.0f, 0.0f), b2Vec2(-50.0f, 10.0f));
  108. ground->CreateFixture(&shape, 0.0f);
  109. shape.SetAsEdge(b2Vec2(50.0f, 0.0f), b2Vec2(50.0f, 10.0f));
  110. ground->CreateFixture(&shape, 0.0f);
  111. }
  112. // Balls
  113. for (int32 i = 0; i < 40; ++i)
  114. {
  115. b2CircleShape shape;
  116. shape.m_radius = 0.25f;
  117. b2BodyDef bd;
  118. bd.type = b2_dynamicBody;
  119. bd.position.Set(-40.0f + 2.0f * i, 0.5f);
  120. b2Body* body = m_world->CreateBody(&bd);
  121. body->CreateFixture(&shape, 1.0f);
  122. }
  123. // Chassis
  124. {
  125. b2PolygonShape shape;
  126. shape.SetAsBox(2.5f, 1.0f);
  127. b2FixtureDef sd;
  128. sd.density = 1.0f;
  129. sd.shape = &shape;
  130. sd.filter.groupIndex = -1;
  131. b2BodyDef bd;
  132. bd.type = b2_dynamicBody;
  133. bd.position = pivot + m_offset;
  134. m_chassis = m_world->CreateBody(&bd);
  135. m_chassis->CreateFixture(&sd);
  136. }
  137. {
  138. b2CircleShape shape;
  139. shape.m_radius = 1.6f;
  140. b2FixtureDef sd;
  141. sd.density = 1.0f;
  142. sd.shape = &shape;
  143. sd.filter.groupIndex = -1;
  144. b2BodyDef bd;
  145. bd.type = b2_dynamicBody;
  146. bd.position = pivot + m_offset;
  147. m_wheel = m_world->CreateBody(&bd);
  148. m_wheel->CreateFixture(&sd);
  149. }
  150. {
  151. b2RevoluteJointDef jd;
  152. jd.Initialize(m_wheel, m_chassis, pivot + m_offset);
  153. jd.collideConnected = false;
  154. jd.motorSpeed = m_motorSpeed;
  155. jd.maxMotorTorque = 400.0f;
  156. jd.enableMotor = m_motorOn;
  157. m_motorJoint = (b2RevoluteJoint*)m_world->CreateJoint(&jd);
  158. }
  159. b2Vec2 wheelAnchor;
  160. wheelAnchor = pivot + b2Vec2(0.0f, -0.8f);
  161. CreateLeg(-1.0f, wheelAnchor);
  162. CreateLeg(1.0f, wheelAnchor);
  163. m_wheel->SetTransform(m_wheel->GetPosition(), 120.0f * b2_pi / 180.0f);
  164. CreateLeg(-1.0f, wheelAnchor);
  165. CreateLeg(1.0f, wheelAnchor);
  166. m_wheel->SetTransform(m_wheel->GetPosition(), -120.0f * b2_pi / 180.0f);
  167. CreateLeg(-1.0f, wheelAnchor);
  168. CreateLeg(1.0f, wheelAnchor);
  169. }
  170. void Step(Settings* settings)
  171. {
  172. m_debugDraw.DrawString(5, m_textLine, "Keys: left = a, brake = s, right = d, toggle motor = m");
  173. m_textLine += 15;
  174. Test::Step(settings);
  175. }
  176. void Keyboard(unsigned char key)
  177. {
  178. switch (key)
  179. {
  180. case 'a':
  181. m_motorJoint->SetMotorSpeed(-m_motorSpeed);
  182. break;
  183. case 's':
  184. m_motorJoint->SetMotorSpeed(0.0f);
  185. break;
  186. case 'd':
  187. m_motorJoint->SetMotorSpeed(m_motorSpeed);
  188. break;
  189. case 'm':
  190. m_motorJoint->EnableMotor(!m_motorJoint->IsMotorEnabled());
  191. break;
  192. }
  193. }
  194. static Test* Create()
  195. {
  196. return new TheoJansen;
  197. }
  198. b2Vec2 m_offset;
  199. b2Body* m_chassis;
  200. b2Body* m_wheel;
  201. b2RevoluteJoint* m_motorJoint;
  202. bool m_motorOn;
  203. float32 m_motorSpeed;
  204. };
  205. #endif // THEO_JANSEN_H