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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. * Copyright (c) 2008-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 CAR_H
  19. #define CAR_H
  20. // Adapted from SpiritWalkers by darkzerox
  21. class Car : public Test
  22. {
  23. public:
  24. Car()
  25. {
  26. { // car body
  27. b2PolygonDef poly1, poly2;
  28. // bottom half
  29. poly1.vertexCount = 5;
  30. poly1.vertices[4].Set(-2.2f,-0.74f);
  31. poly1.vertices[3].Set(-2.2f,0);
  32. poly1.vertices[2].Set(1.0f,0);
  33. poly1.vertices[1].Set(2.2f,-0.2f);
  34. poly1.vertices[0].Set(2.2f,-0.74f);
  35. poly1.filter.groupIndex = -1;
  36. poly1.density = 20.0f;
  37. poly1.friction = 0.68f;
  38. poly1.filter.groupIndex = -1;
  39. // top half
  40. poly2.vertexCount = 4;
  41. poly2.vertices[3].Set(-1.7f,0);
  42. poly2.vertices[2].Set(-1.3f,0.7f);
  43. poly2.vertices[1].Set(0.5f,0.74f);
  44. poly2.vertices[0].Set(1.0f,0);
  45. poly2.filter.groupIndex = -1;
  46. poly2.density = 5.0f;
  47. poly2.friction = 0.68f;
  48. poly2.filter.groupIndex = -1;
  49. b2BodyDef bd;
  50. bd.position.Set(-35.0f, 2.8f);
  51. m_vehicle = m_world->CreateBody(&bd);
  52. m_vehicle->CreateFixture(&poly1);
  53. m_vehicle->CreateFixture(&poly2);
  54. m_vehicle->SetMassFromShapes();
  55. }
  56. { // vehicle wheels
  57. b2CircleDef circ;
  58. circ.density = 40.0f;
  59. circ.radius = 0.38608f;
  60. circ.friction = 0.8f;
  61. circ.filter.groupIndex = -1;
  62. b2BodyDef bd;
  63. bd.allowSleep = false;
  64. bd.position.Set(-33.8f, 2.0f);
  65. m_rightWheel = m_world->CreateBody(&bd);
  66. m_rightWheel->CreateFixture(&circ);
  67. m_rightWheel->SetMassFromShapes();
  68. bd.position.Set(-36.2f, 2.0f);
  69. m_leftWheel = m_world->CreateBody(&bd);
  70. m_leftWheel->CreateFixture(&circ);
  71. m_leftWheel->SetMassFromShapes();
  72. }
  73. { // join wheels to chassis
  74. b2Vec2 anchor;
  75. b2RevoluteJointDef jd;
  76. jd.Initialize(m_vehicle, m_leftWheel, m_leftWheel->GetWorldCenter());
  77. jd.collideConnected = false;
  78. jd.enableMotor = true;
  79. jd.maxMotorTorque = 10.0f;
  80. jd.motorSpeed = 0.0f;
  81. m_leftJoint = (b2RevoluteJoint*)m_world->CreateJoint(&jd);
  82. jd.Initialize(m_vehicle, m_rightWheel, m_rightWheel->GetWorldCenter());
  83. jd.collideConnected = false;
  84. m_rightJoint = (b2RevoluteJoint*)m_world->CreateJoint(&jd);
  85. }
  86. { // ground
  87. b2PolygonDef box;
  88. box.SetAsBox(19.5f, 0.5f);
  89. box.friction = 0.62f;
  90. b2BodyDef bd;
  91. bd.position.Set(-25.0f, 1.0f);
  92. b2Body* ground = m_world->CreateBody(&bd);
  93. ground->CreateFixture(&box);
  94. }
  95. { // more ground
  96. b2PolygonDef box;
  97. b2BodyDef bd;
  98. box.SetAsBox(9.5f, 0.5f, b2Vec2_zero, 0.1f * b2_pi);
  99. box.friction = 0.62f;
  100. bd.position.Set(27.0f - 30.0f, 3.1f);
  101. b2Body* ground = m_world->CreateBody(&bd);
  102. ground->CreateFixture(&box);
  103. }
  104. { // more ground
  105. b2PolygonDef box;
  106. b2BodyDef bd;
  107. box.SetAsBox(9.5f, 0.5f, b2Vec2_zero, -0.1f * b2_pi);
  108. box.friction = 0.62f;
  109. bd.position.Set(55.0f - 30.0f, 3.1f);
  110. b2Body* ground = m_world->CreateBody(&bd);
  111. ground->CreateFixture(&box);
  112. }
  113. { // more ground
  114. b2PolygonDef box;
  115. b2BodyDef bd;
  116. box.SetAsBox(9.5f, 0.5f, b2Vec2_zero, 0.03f * b2_pi);
  117. box.friction = 0.62f;
  118. bd.position.Set(41.0f, 2.0f);
  119. b2Body* ground = m_world->CreateBody(&bd);
  120. ground->CreateFixture(&box);
  121. }
  122. { // more ground
  123. b2PolygonDef box;
  124. b2BodyDef bd;
  125. box.SetAsBox(5.0f, 0.5f, b2Vec2_zero, 0.15f * b2_pi);
  126. box.friction = 0.62f;
  127. bd.position.Set(50.0f, 4.0f);
  128. b2Body* ground = m_world->CreateBody(&bd);
  129. ground->CreateFixture(&box);
  130. }
  131. { // more ground
  132. b2PolygonDef box;
  133. b2BodyDef bd;
  134. box.SetAsBox(20.0f, 0.5f);
  135. box.friction = 0.62f;
  136. bd.position.Set(85.0f, 2.0f);
  137. b2Body* ground = m_world->CreateBody(&bd);
  138. ground->CreateFixture(&box);
  139. }
  140. }
  141. void Step(Settings* settings)
  142. {
  143. m_debugDraw.DrawString(5, m_textLine, "Keys: left = a, brake = s, right = d");
  144. m_textLine += 15;
  145. Test::Step(settings);
  146. }
  147. void Keyboard(unsigned char key)
  148. {
  149. switch (key)
  150. {
  151. case 'a':
  152. m_leftJoint->SetMaxMotorTorque(800.0f);
  153. m_leftJoint->SetMotorSpeed(12.0f);
  154. break;
  155. case 's':
  156. m_leftJoint->SetMaxMotorTorque(100.0f);
  157. m_leftJoint->SetMotorSpeed(0.0f);
  158. break;
  159. case 'd':
  160. m_leftJoint->SetMaxMotorTorque(1200.0f);
  161. m_leftJoint->SetMotorSpeed(-36.0f);
  162. break;
  163. }
  164. }
  165. static Test* Create()
  166. {
  167. return new Car;
  168. }
  169. b2Body* m_leftWheel;
  170. b2Body* m_rightWheel;
  171. b2Body* m_vehicle;
  172. b2RevoluteJoint* m_leftJoint;
  173. b2RevoluteJoint* m_rightJoint;
  174. };
  175. #endif