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

游戏引擎

开发平台:

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 BODY_TYPES_H
  19. #define BODY_TYPES_H
  20. class BodyTypes : public Test
  21. {
  22. public:
  23. BodyTypes()
  24. {
  25. b2Body* ground = NULL;
  26. {
  27. b2BodyDef bd;
  28. ground = m_world->CreateBody(&bd);
  29. b2PolygonShape shape;
  30. shape.SetAsEdge(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f));
  31. b2FixtureDef fd;
  32. fd.shape = &shape;
  33. ground->CreateFixture(&fd);
  34. }
  35. // Define attachment
  36. {
  37. b2BodyDef bd;
  38. bd.type = b2_dynamicBody;
  39. bd.position.Set(0.0f, 3.0f);
  40. m_attachment = m_world->CreateBody(&bd);
  41. b2PolygonShape shape;
  42. shape.SetAsBox(0.5f, 2.0f);
  43. m_attachment->CreateFixture(&shape, 2.0f);
  44. }
  45. // Define platform
  46. {
  47. b2BodyDef bd;
  48. bd.type = b2_dynamicBody;
  49. bd.position.Set(-4.0f, 5.0f);
  50. m_platform = m_world->CreateBody(&bd);
  51. b2PolygonShape shape;
  52. shape.SetAsBox(0.5f, 4.0f, b2Vec2(4.0f, 0.0f), 0.5f * b2_pi);
  53. b2FixtureDef fd;
  54. fd.shape = &shape;
  55. fd.friction = 0.6f;
  56. fd.density = 2.0f;
  57. m_platform->CreateFixture(&fd);
  58. b2RevoluteJointDef rjd;
  59. rjd.Initialize(m_attachment, m_platform, b2Vec2(0.0f, 5.0f));
  60. rjd.maxMotorTorque = 50.0f;
  61. rjd.enableMotor = true;
  62. m_world->CreateJoint(&rjd);
  63. b2PrismaticJointDef pjd;
  64. pjd.Initialize(ground, m_platform, b2Vec2(0.0f, 5.0f), b2Vec2(1.0f, 0.0f));
  65. pjd.maxMotorForce = 1000.0f;
  66. pjd.enableMotor = true;
  67. pjd.lowerTranslation = -10.0f;
  68. pjd.upperTranslation = 10.0f;
  69. pjd.enableLimit = true;
  70. (b2PrismaticJoint*)m_world->CreateJoint(&pjd);
  71. m_speed = 3.0f;
  72. }
  73. // Create a payload
  74. {
  75. b2BodyDef bd;
  76. bd.type = b2_dynamicBody;
  77. bd.position.Set(0.0f, 8.0f);
  78. b2Body* body = m_world->CreateBody(&bd);
  79. b2PolygonShape shape;
  80. shape.SetAsBox(0.75f, 0.75f);
  81. b2FixtureDef fd;
  82. fd.shape = &shape;
  83. fd.friction = 0.6f;
  84. fd.density = 2.0f;
  85. body->CreateFixture(&fd);
  86. }
  87. }
  88. void Keyboard(unsigned char key)
  89. {
  90. switch (key)
  91. {
  92. case 'd':
  93. m_platform->SetType(b2_dynamicBody);
  94. break;
  95. case 's':
  96. m_platform->SetType(b2_staticBody);
  97. break;
  98. case 'k':
  99. m_platform->SetType(b2_kinematicBody);
  100. m_platform->SetLinearVelocity(b2Vec2(-m_speed, 0.0f));
  101. m_platform->SetAngularVelocity(0.0f);
  102. break;
  103. }
  104. }
  105. void Step(Settings* settings)
  106. {
  107. // Drive the kinematic body.
  108. if (m_platform->GetType() == b2_kinematicBody)
  109. {
  110. b2Vec2 p = m_platform->GetTransform().position;
  111. b2Vec2 v = m_platform->GetLinearVelocity();
  112. if ((p.x < -10.0f && v.x < 0.0f) ||
  113. (p.x > 10.0f && v.x > 0.0f))
  114. {
  115. v.x = -v.x;
  116. m_platform->SetLinearVelocity(v);
  117. }
  118. }
  119. Test::Step(settings);
  120. m_debugDraw.DrawString(5, m_textLine, "Keys: (d) dynamic, (s) static, (k) kinematic");
  121. m_textLine += 15;
  122. }
  123. static Test* Create()
  124. {
  125. return new BodyTypes;
  126. }
  127. b2Body* m_attachment;
  128. b2Body* m_platform;
  129. float32 m_speed;
  130. };
  131. #endif