public DistanceJoint(DistanceJointDef def) : base(def) { this._localAnchor1 = def.LocalAnchor1; this._localAnchor2 = def.LocalAnchor2; this._length = def.Length; this._frequencyHz = def.FrequencyHz; this._dampingRatio = def.DampingRatio; this._impulse = 0f; this._gamma = 0f; this._bias = 0f; }
public DistanceJoint(DistanceJointDef def) : base(def) { _localAnchor1 = def.LocalAnchor1; _localAnchor2 = def.LocalAnchor2; _length = def.Length; _frequencyHz = def.FrequencyHz; _dampingRatio = def.DampingRatio; _impulse = 0.0f; _gamma = 0.0f; _bias = 0.0f; }
public DistanceJoint(DistanceJointDef def) : base(def) { _localAnchor1 = def.LocalAnchor1; _localAnchor2 = def.LocalAnchor2; _length = def.Length; _frequencyHz = def.FrequencyHz; _dampingRatio = def.DampingRatio; _impulse = 0.0f; _gamma = 0.0f; _bias = 0.0f; }
public DistanceJoint(DistanceJointDef def) : base(def) { this._localAnchor1 = def.LocalAnchor1; this._localAnchor2 = def.LocalAnchor2; this._length = def.Length; this._frequencyHz = def.FrequencyHz; this._dampingRatio = def.DampingRatio; this._impulse = 0f; this._gamma = 0f; this._bias = 0f; }
private void CreateLeg(float s, Vec2 wheelAnchor) { Vec2 p1 = new Vec2(5.4f * s, -6.1f); Vec2 p2 = new Vec2(7.2f * s, -1.2f); Vec2 p3 = new Vec2(4.3f * s, -1.9f); Vec2 p4 = new Vec2(3.1f * s, 0.8f); Vec2 p5 = new Vec2(6.0f * s, 1.5f); Vec2 p6 = new Vec2(2.5f * s, 3.7f); FixtureDef fd1 = new FixtureDef(); FixtureDef fd2 = new FixtureDef(); fd1.Filter.GroupIndex = -1; fd2.Filter.GroupIndex = -1; fd1.Density = 1.0f; fd2.Density = 1.0f; PolygonShape poly1 = new PolygonShape(); PolygonShape poly2 = new PolygonShape(); if (s > 0.0f) { Vec2[] vertices = new Vec2[3]; vertices[0] = p1; vertices[1] = p2; vertices[2] = p3; poly1.Set(vertices, 3); vertices[0] = Vec2.Zero; vertices[1] = p5 - p4; vertices[2] = p6 - p4; poly2.Set(vertices, 3); } else { Vec2[] vertices = new Vec2[3]; vertices[0] = p1; vertices[1] = p3; vertices[2] = p2; poly1.Set(vertices, 3); vertices[0] = Vec2.Zero; vertices[1] = p6 - p4; vertices[2] = p5 - p4; poly2.Set(vertices, 3); } fd1.Shape = poly1; fd2.Shape = poly2; BodyDef bd1 = new BodyDef(); BodyDef bd2 = new BodyDef(); bd1.Position = _offset; bd2.Position = p4 + _offset; bd1.AngularDamping = 10.0f; bd2.AngularDamping = 10.0f; Body body1 = _world.CreateBody(bd1); Body body2 = _world.CreateBody(bd2); body1.CreateFixture(fd1); body2.CreateFixture(fd2); DistanceJointDef djd = new DistanceJointDef(); // Using a soft distance constraint can reduce some jitter. // It also makes the structure seem a bit more fluid by // acting like a suspension system. djd.DampingRatio = 0.5f; djd.FrequencyHz = 10.0f; djd.Initialize(body1, body2, p2 + _offset, p5 + _offset); _world.CreateJoint(djd); djd.Initialize(body1, body2, p3 + _offset, p4 + _offset); _world.CreateJoint(djd); djd.Initialize(body1, _wheel, p3 + _offset, wheelAnchor + _offset); _world.CreateJoint(djd); djd.Initialize(body2, _wheel, p6 + _offset, wheelAnchor + _offset); _world.CreateJoint(djd); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(body2, _chassis, p4 + _offset); _world.CreateJoint(rjd); }
// Main... public ElasticBody() { // Bottom static body { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 2.0f); sd.Friction = 0.1f; sd.Restitution = 0.1f; BodyDef bd = new BodyDef(); bd.Position.Set(-1.0f, -7.5f); _ground = _world.CreateBody(bd); _ground.CreateShape(sd); } // Upper static body { PolygonDef sd = new PolygonDef(); sd.SetAsBox(20.0f, 0.50f, new Vec2(0.0f, 0.0f), 0.047f * Box2DX.Common.Settings.Pi); sd.Friction = 0.01f; sd.Restitution = 0.001f; BodyDef bd = new BodyDef(); bd.Position.Set(-20.0f, 93.0f); Body g = _world.CreateBody(bd); g.CreateShape(sd); sd.SetAsBox(15.0f, 0.50f, new Vec2(-15.0f, 12.5f), 0.0f); g.CreateShape(sd); sd.SetAsBox(20.0f, 0.5f, new Vec2(0.0f, -25.0f), -0.5f); g.CreateShape(sd); } // Left channel left wall { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.7f, 55.0f); sd.Friction = 0.1f; sd.Restitution = 0.1f; BodyDef bd = new BodyDef(); bd.Position.Set(-49.3f, 50.0f); Body g = _world.CreateBody(bd); g.CreateShape(sd); } // Right wall { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.7f, 55.0f); sd.Friction = 0.1f; sd.Restitution = 0.1f; BodyDef bd = new BodyDef(); bd.Position.Set(45.0f, 50.0f); Body g = _world.CreateBody(bd); g.CreateShape(sd); } // Left channel right upper wall { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.5f, 20.0f); sd.Friction = 0.05f; sd.Restitution = 0.01f; BodyDef bd = new BodyDef(); bd.Position.Set(-42.0f, 70.0f); bd.Angle = -0.03f * Box2DX.Common.Settings.Pi; Body g = _world.CreateBody(bd); g.CreateShape(sd); } // Left channel right lower wall { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.50f, 23.0f); sd.Friction = 0.05f; sd.Restitution = 0.01f; BodyDef bd = new BodyDef(); bd.Position.Set(-44.0f, 27.0f); Body g = _world.CreateBody(bd); g.CreateShape(sd); // Bottom motors CircleDef cd = new CircleDef(); cd.Radius = 3.0f; cd.Density = 15.0f; cd.Friction = 1.0f; cd.Restitution = 0.2f; // 1. bd.Position.Set(-40.0f, 2.5f); Body body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); RevoluteJointDef jr = new RevoluteJointDef(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); jr.MaxMotorTorque = 30000.0f; jr.EnableMotor = true; jr.MotorSpeed = 20.0f; _world.CreateJoint(jr); // 1. left down bd.Position.Set(-46.0f, -2.5f); cd.Radius = 1.5f; jr.MotorSpeed = -20.0f; body = _world.CreateBody(bd); body.CreateShape(cd); sd.SetAsBox(2.0f, 0.50f); body.CreateShape(sd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter()); _world.CreateJoint(jr); // 2. cd.Radius = 3.0f; jr.MotorSpeed = 20.0f; bd.Position.Set(-32.0f, 2.5f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 3. jr.MotorSpeed = 20.0f; bd.Position.Set(-24.0f, 1.5f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 4. bd.Position.Set(-16.0f, 0.8f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 5. bd.Position.Set(-8.0f, 0.5f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 6. bd.Position.Set(0.0f, 0.1f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 7. bd.Position.Set(8.0f, -0.5f); body = _world.CreateBody(bd); body.CreateShape(cd); sd.SetAsBox(3.7f, 0.5f); body.CreateShape(sd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 8. right rotator sd.SetAsBox(5.0f, 0.5f); sd.Density = 2.0f; bd.Position.Set(18.0f, 1.0f); Body rightmotor = _world.CreateBody(bd); rightmotor.CreateShape(sd); sd.SetAsBox(4.5f, 0.5f, new Vec2(0.0f, 0.0f), Box2DX.Common.Settings.Pi / 3.0f); rightmotor.CreateShape(sd); sd.SetAsBox(4.5f, 0.5f, new Vec2(0.0f, 0.0f), Box2DX.Common.Settings.Pi * 2.0f / 3.0f); rightmotor.CreateShape(sd); cd.Radius = 4.2f; rightmotor.CreateShape(cd); rightmotor.SetMassFromShapes(); jr.Initialize(g, rightmotor, rightmotor.GetWorldCenter()); jr.MaxMotorTorque = 70000.0f; jr.MotorSpeed = -4.0f; _world.CreateJoint(jr); // 9. left rotator sd.SetAsBox(8.5f, 0.5f); sd.Density = 2.0f; bd.Position.Set(-34.0f, 17.0f); body = _world.CreateBody(bd); body.CreateShape(sd); sd.SetAsBox(8.5f, 0.5f, new Vec2(0.0f, 0.0f), Box2DX.Common.Settings.Pi * .5f); body.CreateShape(sd); cd.Radius = 7.0f; cd.Friction = 0.9f; body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter()); jr.MaxMotorTorque = 100000.0f; jr.MotorSpeed = -5.0f; _world.CreateJoint(jr); // big compressor sd.SetAsBox(3.0f, 4.0f); sd.Density = 10.0f; bd.Position.Set(-16.0f, 17.0f); Body hammerleft = _world.CreateBody(bd); hammerleft.CreateShape(sd); hammerleft.SetMassFromShapes(); DistanceJointDef jd = new DistanceJointDef(); jd.Initialize(body, hammerleft, body.GetWorldCenter() + new Vec2(0.0f, 6.0f), hammerleft.GetWorldCenter()); _world.CreateJoint(jd); bd.Position.Set(4.0f, 17.0f); Body hammerright = _world.CreateBody(bd); hammerright.CreateShape(sd); hammerright.SetMassFromShapes(); jd.Initialize(body, hammerright, body.GetWorldCenter() - new Vec2(0.0f, 6.0f), hammerright.GetWorldCenter()); _world.CreateJoint(jd); // pusher sd.SetAsBox(6.0f, 0.75f); bd.Position.Set(-21.0f, 9.0f); Body pusher = _world.CreateBody(bd); pusher.CreateShape(sd); sd.SetAsBox(2.0f, 1.5f, new Vec2(-5.0f, 0.0f), 0.0f); pusher.SetMassFromShapes(); pusher.CreateShape(sd); jd.Initialize(rightmotor, pusher, rightmotor.GetWorldCenter() + new Vec2(-8.0f, 0.0f), pusher.GetWorldCenter() + new Vec2(5.0f, 0.0f)); _world.CreateJoint(jd); } // Static bodies above motors { PolygonDef sd = new PolygonDef(); CircleDef cd = new CircleDef(); sd.SetAsBox(9.0f, 0.5f); sd.Friction = 0.05f; sd.Restitution = 0.01f; BodyDef bd = new BodyDef(); bd.Position.Set(-15.5f, 12.0f); bd.Angle = 0.0f; Body g = _world.CreateBody(bd); g.CreateShape(sd); sd.SetAsBox(8.0f, 0.5f, new Vec2(23.0f, 0.0f), 0.0f); g.CreateShape(sd); // compressor statics sd.SetAsBox(7.0f, 0.5f, new Vec2(-2.0f, 9.0f), 0.0f); g.CreateShape(sd); sd.SetAsBox(9.0f, 0.5f, new Vec2(22.0f, 9.0f), 0.0f); g.CreateShape(sd); sd.SetAsBox(19.0f, 0.5f, new Vec2(-9.0f, 15.0f), -0.05f); g.CreateShape(sd); sd.SetAsBox(4.7f, 0.5f, new Vec2(15.0f, 11.5f), -0.5f); g.CreateShape(sd); // below compressor sd.SetAsBox(26.0f, 0.3f, new Vec2(17.0f, -4.4f), -0.02f); g.CreateShape(sd); cd.Radius = 1.0f; cd.Friction = 1.0f; cd.LocalPosition = new Vec2(29.0f, -6.0f); g.CreateShape(cd); cd.Radius = 0.7f; cd.LocalPosition = new Vec2(-2.0f, -4.5f); g.CreateShape(cd); } // Elevator { BodyDef bd = new BodyDef(); CircleDef cd = new CircleDef(); PolygonDef sd = new PolygonDef(); bd.Position.Set(40.0f, 4.0f); _elev = _world.CreateBody(bd); sd.SetAsBox(0.5f, 2.5f, new Vec2(3.0f, -3.0f), 0.0f); sd.Density = 1.0f; sd.Friction = 0.01f; _elev.CreateShape(sd); sd.SetAsBox(7.0f, 0.5f, new Vec2(-3.5f, -5.5f), 0.0f); _elev.CreateShape(sd); sd.SetAsBox(0.5f, 2.5f, new Vec2(-11.0f, -3.5f), 0.0f); _elev.CreateShape(sd); _elev.SetMassFromShapes(); PrismaticJointDef jp = new PrismaticJointDef(); jp.Initialize(_ground, _elev, bd.Position, new Vec2(0.0f, 1.0f)); jp.LowerTranslation = 0.0f; jp.UpperTranslation = 100.0f; jp.EnableLimit = true; jp.EnableMotor = true; jp.MaxMotorForce = 10000.0f; jp.MotorSpeed = 0.0f; _joint_elev = (PrismaticJoint)_world.CreateJoint(jp); // Korb sd.SetAsBox(2.3f, 0.5f, new Vec2(1.0f, 0.0f), 0.0f); sd.Density = 0.5f; bd.Position.Set(29.0f, 6.5f); Body body = _world.CreateBody(bd); body.CreateShape(sd); sd.SetAsBox(2.5f, 0.5f, new Vec2(3.0f, -2.0f), Box2DX.Common.Settings.Pi / 2.0f); body.CreateShape(sd); sd.SetAsBox(4.6f, 0.5f, new Vec2(7.8f, -4.0f), 0.0f); body.CreateShape(sd); sd.SetAsBox(0.5f, 4.5f, new Vec2(12.0f, 0.0f), 0.0f); body.CreateShape(sd); sd.SetAsBox(0.5f, 0.5f, new Vec2(13.0f, 4.0f), 0.0f); body.CreateShape(sd); cd.Radius = 0.7f; cd.Density = 1.0f; cd.Friction = 0.01f; cd.LocalPosition = new Vec2(0.0f, 0.0f); body.CreateShape(cd); body.SetMassFromShapes(); RevoluteJointDef jr = new RevoluteJointDef(); jr.Initialize(_elev, body, bd.Position); jr.EnableLimit = true; jr.LowerAngle = -0.2f; jr.UpperAngle = Box2DX.Common.Settings.Pi * 1.1f; jr.CollideConnected = true; _world.CreateJoint(jr); // upper body exit sd.SetAsBox(14.0f, 0.5f, new Vec2(-3.5f, -10.0f), 0.0f); bd.Position.Set(17.5f, 96.0f); body = _world.CreateBody(bd); body.CreateShape(sd); } // "Elastic body" 64 bodies - something like a lin. elastic compound // connected via dynamic forces (springs) { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.55f, 0.55f); sd.Density = 1.5f; sd.Friction = 0.01f; sd.Filter.GroupIndex = -1; Vec2 startpoint = new Vec2(30.0f, 20.0f); BodyDef bd = new BodyDef(); bd.IsBullet = false; bd.AllowSleep = false; for (int i = 0; i < 8; ++i) { for (int j = 0; j < 8; ++j) { bd.Position.Set(j * 1.02f, 2.51f + 1.02f * i); bd.Position += startpoint; Body body = _world.CreateBody(bd); bodies[8 * i + j] = body; body.CreateShape(sd); body.SetMassFromShapes(); } } } }
public Web() { Body ground = null; { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); ground = _world.CreateBody(bd); ground.CreateShape(sd); } { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.5f, 0.5f); sd.Density = 5.0f; sd.Friction = 0.2f; BodyDef bd = new BodyDef(); bd.Position.Set(-5.0f, 5.0f); _bodies[0] = _world.CreateBody(bd); _bodies[0].CreateShape(sd); _bodies[0].SetMassFromShapes(); bd.Position.Set(5.0f, 5.0f); _bodies[1] = _world.CreateBody(bd); _bodies[1].CreateShape(sd); _bodies[1].SetMassFromShapes(); bd.Position.Set(5.0f, 15.0f); _bodies[2] = _world.CreateBody(bd); _bodies[2].CreateShape(sd); _bodies[2].SetMassFromShapes(); bd.Position.Set(-5.0f, 15.0f); _bodies[3] = _world.CreateBody(bd); _bodies[3].CreateShape(sd); _bodies[3].SetMassFromShapes(); DistanceJointDef jd = new DistanceJointDef(); Vec2 p1, p2, d; jd.FrequencyHz = 4.0f; jd.DampingRatio = 0.5f; jd.Body1 = ground; jd.Body2 = _bodies[0]; jd.LocalAnchor1.Set(-10.0f, 10.0f); jd.LocalAnchor2.Set(-0.5f, -0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[0] = _world.CreateJoint(jd); jd.Body1 = ground; jd.Body2 = _bodies[1]; jd.LocalAnchor1.Set(10.0f, 10.0f); jd.LocalAnchor2.Set(0.5f, -0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[1] = _world.CreateJoint(jd); jd.Body1 = ground; jd.Body2 = _bodies[2]; jd.LocalAnchor1.Set(10.0f, 30.0f); jd.LocalAnchor2.Set(0.5f, 0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[2] = _world.CreateJoint(jd); jd.Body1 = ground; jd.Body2 = _bodies[3]; jd.LocalAnchor1.Set(-10.0f, 30.0f); jd.LocalAnchor2.Set(-0.5f, 0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[3] = _world.CreateJoint(jd); jd.Body1 = _bodies[0]; jd.Body2 = _bodies[1]; jd.LocalAnchor1.Set(0.5f, 0.0f); jd.LocalAnchor2.Set(-0.5f, 0.0f); ; p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[4] = _world.CreateJoint(jd); jd.Body1 = _bodies[1]; jd.Body2 = _bodies[2]; jd.LocalAnchor1.Set(0.0f, 0.5f); jd.LocalAnchor2.Set(0.0f, -0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[5] = _world.CreateJoint(jd); jd.Body1 = _bodies[2]; jd.Body2 = _bodies[3]; jd.LocalAnchor1.Set(-0.5f, 0.0f); jd.LocalAnchor2.Set(0.5f, 0.0f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[6] = _world.CreateJoint(jd); jd.Body1 = _bodies[3]; jd.Body2 = _bodies[0]; jd.LocalAnchor1.Set(0.0f, -0.5f); jd.LocalAnchor2.Set(0.0f, 0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[7] = _world.CreateJoint(jd); } }
public Web() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); BodyDef bd = new BodyDef(); bd.Position.Set(-5.0f, 5.0f); _bodies[0] = _world.CreateBody(bd); _bodies[0].CreateFixture(shape, 0); bd.Position.Set(5.0f, 5.0f); _bodies[1] = _world.CreateBody(bd); _bodies[1].CreateFixture(shape, 0); bd.Position.Set(5.0f, 15.0f); _bodies[2] = _world.CreateBody(bd); _bodies[2].CreateFixture(shape, 0); bd.Position.Set(-5.0f, 15.0f); _bodies[3] = _world.CreateBody(bd); _bodies[3].CreateFixture(shape, 0); DistanceJointDef jd = new DistanceJointDef(); Vec2 p1, p2, d; jd.FrequencyHz = 4.0f; jd.DampingRatio = 0.5f; jd.Body1 = ground; jd.Body2 = _bodies[0]; jd.LocalAnchor1.Set(-10.0f, 10.0f); jd.LocalAnchor2.Set(-0.5f, -0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[0] = _world.CreateJoint(jd); jd.Body1 = ground; jd.Body2 = _bodies[1]; jd.LocalAnchor1.Set(10.0f, 10.0f); jd.LocalAnchor2.Set(0.5f, -0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[1] = _world.CreateJoint(jd); jd.Body1 = ground; jd.Body2 = _bodies[2]; jd.LocalAnchor1.Set(10.0f, 30.0f); jd.LocalAnchor2.Set(0.5f, 0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[2] = _world.CreateJoint(jd); jd.Body1 = ground; jd.Body2 = _bodies[3]; jd.LocalAnchor1.Set(-10.0f, 30.0f); jd.LocalAnchor2.Set(-0.5f, 0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[3] = _world.CreateJoint(jd); jd.Body1 = _bodies[0]; jd.Body2 = _bodies[1]; jd.LocalAnchor1.Set(0.5f, 0.0f); jd.LocalAnchor2.Set(-0.5f, 0.0f); ; p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[4] = _world.CreateJoint(jd); jd.Body1 = _bodies[1]; jd.Body2 = _bodies[2]; jd.LocalAnchor1.Set(0.0f, 0.5f); jd.LocalAnchor2.Set(0.0f, -0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[5] = _world.CreateJoint(jd); jd.Body1 = _bodies[2]; jd.Body2 = _bodies[3]; jd.LocalAnchor1.Set(-0.5f, 0.0f); jd.LocalAnchor2.Set(0.5f, 0.0f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[6] = _world.CreateJoint(jd); jd.Body1 = _bodies[3]; jd.Body2 = _bodies[0]; jd.LocalAnchor1.Set(0.0f, -0.5f); jd.LocalAnchor2.Set(0.0f, 0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[7] = _world.CreateJoint(jd); } }
public Dominos() { Body b1; { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); BodyDef bd = new BodyDef(); b1 = _world.CreateBody(bd); b1.CreateFixture(shape,0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(6.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position.Set(-1.5f, 10.0f); Body ground = _world.CreateBody(bd); ground.CreateFixture(shape,0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; fd.Friction = 0.1f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(-6.0f + 1.0f * i, 11.25f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(7.0f, 0.25f, Vec2.Zero, 0.3f); BodyDef bd = new BodyDef(); bd.Position.Set(1.0f, 6.0f); Body ground = _world.CreateBody(bd); ground.CreateFixture(shape,0); } Body b2; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 1.5f); BodyDef bd = new BodyDef(); bd.Position.Set(-7.0f, 4.0f); b2 = _world.CreateBody(bd); b2.CreateFixture(shape,0); } Body b3; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(6.0f, 0.125f); BodyDef bd = new BodyDef(); bd.Position.Set(-0.9f, 1.0f); bd.Angle = -0.15f; b3 = _world.CreateBody(bd); b3.CreateFixture(shape, 10.0f); } RevoluteJointDef jd = new RevoluteJointDef(); Vec2 anchor = new Vec2(); anchor.Set(-2.0f, 1.0f); jd.Initialize(b1, b3, anchor); jd.CollideConnected = true; _world.CreateJoint(jd); Body b4; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 0.25f); BodyDef bd = new BodyDef(); bd.Position.Set(-10.0f, 15.0f); b4 = _world.CreateBody(bd); b4.CreateFixture(shape, 10.0f); } anchor.Set(-7.0f, 15.0f); jd.Initialize(b2, b4, anchor); _world.CreateJoint(jd); Body b5; { BodyDef bd = new BodyDef(); bd.Position.Set(6.5f, 3.0f); b5 = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 10.0f; fd.Friction = 0.1f; shape.SetAsBox(1.0f, 0.1f,new Vec2(0.0f, -0.9f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f, new Vec2(-0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f,new Vec2(0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); } anchor.Set(6.0f, 2.0f); jd.Initialize(b1, b5, anchor); _world.CreateJoint(jd); Body b6; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.1f); BodyDef bd = new BodyDef(); bd.Position.Set(6.5f, 4.1f); b6 = _world.CreateBody(bd); b6.CreateFixture(shape, 30.0f); } anchor.Set(7.5f, 4.0f); jd.Initialize(b5, b6, anchor); _world.CreateJoint(jd); Body b7; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); BodyDef bd = new BodyDef(); bd.Position.Set(7.4f, 1.0f); b7 = _world.CreateBody(bd); b7.CreateFixture(shape, 10.0f); } DistanceJointDef djd =new DistanceJointDef(); djd.Body1 = b3; djd.Body2 = b7; djd.LocalAnchor1.Set(6.0f, 0.0f); djd.LocalAnchor2.Set(0.0f, -1.0f); Vec2 d = djd.Body2.GetWorldPoint(djd.LocalAnchor2) - djd.Body1.GetWorldPoint(djd.LocalAnchor1); djd.Length = d.Length(); _world.CreateJoint(djd); { float radius = 0.2f; CircleShape shape = new CircleShape(); shape._radius = radius; for (int i = 0; i < 4; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(5.9f + 2.0f * radius * i, 2.4f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 10.0f); } } }