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