public static WheelJoint CreateWheelJoint(World world, Body bodyA, Body bodyB, Vector2 anchor, Vector2 axis, bool useWorldCoordinates = false) { WheelJoint joint = new WheelJoint(bodyA, bodyB, anchor, axis, useWorldCoordinates); world.addJoint(joint); return(joint); }
public override void InitJoint() { base.InitJoint(); //B tekerlek //A araba //jesus %99 em-in Vector3 p0 = BodyB.transform.TransformPoint(new Vector3(LocalAnchorB.x, LocalAnchorB.y, -5f)); joint = JointFactory.CreateWheelJoint(FSWorldComponent.PhysicsWorld, BodyA.PhysicsBody, BodyB.PhysicsBody, BodyB.PhysicsBody.GetLocalPoint(FSHelper.Vector3ToFVector2(p0)), FSHelper.Vector2ToFVector2(axis)); //UnitY ile yanlış yapıyor olabilirim joint.MaxMotorTorque = MaxMotorTorque; joint.MotorEnabled = MotorEnabled; joint.MotorSpeed = MotorSpeed; joint.SpringDampingRatio = springDampingRatio; joint.SpringFrequencyHz = springFrequency; joint.CollideConnected = false; // }
/// <summary> /// Creates a Wheel Joint and adds it to the world /// </summary> /// <param name="world"></param> /// <param name="bodyA"></param> /// <param name="bodyB"></param> /// <param name="localanchorB"></param> /// <param name="axis"></param> /// <returns></returns> public static WheelJoint CreateWheelJoint(World world, Body bodyA, Body bodyB, Vector2 localanchorB, Vector2 axis) { WheelJoint joint = CreateWheelJoint(bodyA, bodyB, localanchorB, axis); world.AddJoint(joint); return(joint); }
private WheelJointTest() { Body ground = BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); { PolygonShape shape = new PolygonShape(1); shape.SetAsBox(0.5f, 2.0f); Body body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(0.0f, 7.0f); body.CreateFixture(shape); Vector2 axis = new Vector2(-1000.0f, -2.0f); axis.Normalize(); WheelJoint jd = new WheelJoint(ground, body, new Vector2(0, 8.5f), axis); jd.MotorSpeed = 1.0f; jd.MaxMotorTorque = 1000.0f; jd.MotorEnabled = true; jd.SpringFrequencyHz = 1.0f; jd.SpringDampingRatio = 0.2f; World.AddJoint(jd); PolygonShape shape2 = new PolygonShape(1); shape2.SetAsBox(0.5f, 2.0f); Body body2 = BodyFactory.CreatePolygon(World, shape2.Vertices, 0.5f); body2.BodyType = BodyType.Dynamic; body2.Position = new Vector2(10.0f, 7.0f); } }
public override Joint CreateJoint() { var joint = new WheelJoint(BodyA, BodyB, Anchor * FSConvert.DisplayToSim, Axis); joint.CollideConnected = CollideConnected; joint.Axis = Axis; joint.MotorEnabled = MotorEnabled; joint.MotorSpeed = MotorSpeed; joint.MaxMotorTorque = MaxMotorTorque; joint.Frequency = Frequency; joint.DampingRatio = DampingRatio; return(joint); }
public override Joint createJoint() { var joint = new WheelJoint(bodyA, bodyB, anchor * FSConvert.displayToSim, axis); joint.collideConnected = collideConnected; joint.axis = axis; joint.motorEnabled = motorEnabled; joint.motorSpeed = motorSpeed; joint.maxMotorTorque = maxMotorTorque; joint.frequency = frequency; joint.dampingRatio = dampingRatio; return(joint); }
public Car(World world, Genom.Genom genom) { chassis = new Chassis(world, genom.chassis.vertices, genom.chassis.density); chassis.body.Position = new Vector2(2.5f, -1.0f); chassis.body.Mass = 2f; chassis.body.Friction = 10f; max_x = chassis.body.Position.X; Utils util = new Utils(); wheel_1 = new Wheel(world, genom.wheel_1.vertex, genom.wheel_1.radius, genom.wheel_1.density); wheel_1.body.Mass = 0.5f; wheel_1.body.Position = new Vector2( (float)util.lengthdir_x(genom.chassis.vertices[genom.wheel_1.vertex], genom.wheel_1.vertex * 45), (float)util.lengthdir_y(genom.chassis.vertices[genom.wheel_1.vertex], genom.wheel_1.vertex * 45) ) + chassis.body.Position; wheel_2 = new Wheel(world, genom.wheel_2.vertex, genom.wheel_2.radius, genom.wheel_2.density); wheel_2.body.Mass = 0.5f; wheel_2.body.Position = new Vector2( (float)util.lengthdir_x(genom.chassis.vertices[genom.wheel_2.vertex], genom.wheel_2.vertex * 45), (float)util.lengthdir_y(genom.chassis.vertices[genom.wheel_2.vertex], genom.wheel_2.vertex * 45) ) + chassis.body.Position; Vector2 axis = new Vector2(0.0f, 1.0f); WheelJoint spring_1; spring_1 = new WheelJoint(chassis.body, wheel_1.body, wheel_1.body.Position, axis, true); spring_1.MotorSpeed = 20f; spring_1.MaxMotorTorque = 50f; spring_1.MotorEnabled = true; spring_1.Frequency = 10f; spring_1.DampingRatio = 1f; world.AddJoint(spring_1); WheelJoint spring_2; spring_2 = new WheelJoint(chassis.body, wheel_2.body, wheel_2.body.Position, axis, true); spring_2.MotorSpeed = 20.0f; spring_2.MaxMotorTorque = 50f; spring_2.MotorEnabled = true; spring_2.Frequency = 10f; spring_2.DampingRatio = 1f; world.AddJoint(spring_2); this.genom = genom; }
public WheelJointTestBase() { Body ground = null; { var bd = new BodyDef(); ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } EnableLimit = true; EnableMotor = false; MotorSpeed = 10.0f; { CircleShape shape = new CircleShape(); shape.Radius = 2.0f; BodyDef bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(0.0f, 10.0f); bd.AllowSleep = false; var body = World.CreateBody(bd); body.CreateFixture(shape, 5.0f); var mass = body.Mass; var hertz = 1.0f; var dampingRatio = 0.7f; var omega = 2.0f * Settings.Pi * hertz; var jd = new WheelJointDef(); // Horizontal jd.Initialize(ground, body, bd.Position, new Vector2(0.0f, 1.0f)); jd.MotorSpeed = MotorSpeed; jd.MaxMotorTorque = 10000.0f; jd.EnableMotor = EnableMotor; jd.Stiffness = mass * omega * omega; jd.Damping = 2.0f * mass * dampingRatio * omega; jd.LowerTranslation = -3.0f; jd.UpperTranslation = 3.0f; jd.EnableLimit = EnableLimit; Joint = (WheelJoint)World.CreateJoint(jd); } }
private WheelJointTest() { Body ground; { BodyDef bd = new BodyDef(); ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(shape); } _enableLimit = true; _enableMotor = false; _motorSpeed = 10.0f; { CircleShape shape = new CircleShape(5.0f); shape.Radius = 2.0f; BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 10.0f); bd.AllowSleep = false; Body body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(shape); WheelJointDef jd = new WheelJointDef(); // Horizontal jd.Initialize(ground, body, bd.Position, new Vector2(0.0f, 1.0f)); jd.MotorSpeed = _motorSpeed; jd.MaxMotorTorque = 10000.0f; jd.EnableMotor = _enableMotor; jd.LowerTranslation = -3.0f; jd.UpperTranslation = 3.0f; jd.EnableLimit = _enableLimit; float hertz = 1.0f; float dampingRatio = 0.7f; JointHelper.LinearStiffness(hertz, dampingRatio, ground, body, out float stiffness, out float damping); jd.Stiffness = stiffness; jd.Damping = damping; _joint = (WheelJoint)JointFactory.CreateFromDef(World, jd); } }
public override Joint CreateJoint() { WheelJoint joint = new WheelJoint(BodyA, BodyB, Anchor * FSConvert.DisplayToSim, Axis) { CollideConnected = CollideConnected, Axis = Axis, MotorEnabled = MotorEnabled, MotorSpeed = MotorSpeed, MaxMotorTorque = MaxMotorTorque, Frequency = Frequency, DampingRatio = DampingRatio }; return(joint); }
private SerializationTest() { Body ground = BodyFactory.CreateEdge(World, new Vector2(-20, 0), new Vector2(20, 0)); //Friction and distance joint { Body bodyA = BodyFactory.CreateCircle(World, 1, 1.5f, new Vector2(10, 25)); bodyA.BodyType = BodyType.Dynamic; Body bodyB = BodyFactory.CreateRectangle(World, 1, 1, 1, new Vector2(-1, 25)); bodyB.BodyType = BodyType.Dynamic; FrictionJoint frictionJoint = JointFactory.CreateFrictionJoint(World, bodyB, ground, Vector2.Zero); frictionJoint.CollideConnected = true; frictionJoint.MaxForce = 100; JointFactory.CreateDistanceJoint(World, bodyA, bodyB); } //Wheel joint { Vertices vertices = new Vertices(6); vertices.Add(new Vector2(-1.5f, -0.5f)); vertices.Add(new Vector2(1.5f, -0.5f)); vertices.Add(new Vector2(1.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 0.9f)); vertices.Add(new Vector2(-1.15f, 0.9f)); vertices.Add(new Vector2(-1.5f, 0.2f)); Body carBody = BodyFactory.CreatePolygon(World, vertices, 1, new Vector2(0, 1)); carBody.BodyType = BodyType.Dynamic; Body wheel1 = BodyFactory.CreateCircle(World, 0.4f, 1, new Vector2(-1.0f, 0.35f)); wheel1.BodyType = BodyType.Dynamic; wheel1.Friction = 0.9f; Body wheel2 = BodyFactory.CreateCircle(World, 0.4f, 1, new Vector2(1.0f, 0.4f)); wheel2.BodyType = BodyType.Dynamic; wheel2.Friction = 0.9f; Vector2 axis = new Vector2(0.0f, 1.0f); WheelJoint spring1 = JointFactory.CreateWheelJoint(World, carBody, wheel1, axis); spring1.MotorSpeed = 0.0f; spring1.MaxMotorTorque = 20.0f; spring1.MotorEnabled = true; spring1.Frequency = 4; spring1.DampingRatio = 0.7f; WheelJoint spring2 = JointFactory.CreateWheelJoint(World, carBody, wheel2, axis); spring2.MotorSpeed = 0.0f; spring2.MaxMotorTorque = 10.0f; spring2.MotorEnabled = false; spring2.Frequency = 4; spring2.DampingRatio = 0.7f; } //Prismatic joint { Body body = BodyFactory.CreateRectangle(World, 2, 2, 5, new Vector2(-10.0f, 10.0f)); body.BodyType = BodyType.Dynamic; body.Rotation = 0.5f * Settings.Pi; Vector2 axis = new Vector2(2.0f, 1.0f); axis.Normalize(); PrismaticJoint joint = JointFactory.CreatePrismaticJoint(World, ground, body, Vector2.Zero, axis); joint.MotorSpeed = 5.0f; joint.MaxMotorForce = 1000.0f; joint.MotorEnabled = true; joint.LowerLimit = -10.0f; joint.UpperLimit = 20.0f; joint.LimitEnabled = true; } // Pulley joint { Body body1 = BodyFactory.CreateRectangle(World, 2, 4, 5, new Vector2(-10.0f, 16.0f)); body1.BodyType = BodyType.Dynamic; Body body2 = BodyFactory.CreateRectangle(World, 2, 4, 5, new Vector2(10.0f, 16.0f)); body2.BodyType = BodyType.Dynamic; Vector2 anchor1 = new Vector2(-10.0f, 16.0f + 2.0f); Vector2 anchor2 = new Vector2(10.0f, 16.0f + 2.0f); Vector2 worldAnchor1 = new Vector2(-10.0f, 16.0f + 2.0f + 12.0f); Vector2 worldAnchor2 = new Vector2(10.0f, 16.0f + 2.0f + 12.0f); JointFactory.CreatePulleyJoint(World, body1, body2, anchor1, anchor2, worldAnchor1, worldAnchor2, 1.5f, true); } //Revolute joint { Body ball = BodyFactory.CreateCircle(World, 3.0f, 5.0f, new Vector2(5.0f, 30.0f)); ball.BodyType = BodyType.Dynamic; Body polygonBody = BodyFactory.CreateRectangle(World, 20, 0.4f, 2, new Vector2(10, 10)); polygonBody.BodyType = BodyType.Dynamic; polygonBody.IsBullet = true; RevoluteJoint joint = JointFactory.CreateRevoluteJoint(World, ground, polygonBody, new Vector2(10, 0)); joint.LowerLimit = -0.25f * Settings.Pi; joint.UpperLimit = 0.0f * Settings.Pi; joint.LimitEnabled = true; } //Weld joint { PolygonShape shape = new PolygonShape(PolygonUtils.CreateRectangle(0.5f, 0.125f), 20); Body prevBody = ground; for (int i = 0; i < 10; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-14.5f + 1.0f * i, 5.0f); body.CreateFixture(shape); Vector2 anchor = new Vector2(0.5f, 0); if (i == 0) { anchor = new Vector2(-15f, 5); } JointFactory.CreateWeldJoint(World, prevBody, body, anchor, new Vector2(-0.5f, 0)); prevBody = body; } } //Rope joint { LinkFactory.CreateChain(World, new Vector2(-10, 10), new Vector2(-20, 10), 0.1f, 0.5f, 10, 0.1f, true); } //Angle joint { Body fA = BodyFactory.CreateRectangle(World, 4, 4, 1, new Vector2(-5, 4)); fA.BodyType = BodyType.Dynamic; fA.Rotation = (float)(Math.PI / 3); Body fB = BodyFactory.CreateRectangle(World, 4, 4, 1, new Vector2(5, 4)); fB.BodyType = BodyType.Dynamic; AngleJoint joint = new AngleJoint(fA, fB); joint.TargetAngle = (float)Math.PI / 2; World.AddJoint(joint); } //Motor joint { Body body = BodyFactory.CreateRectangle(World, 4, 1, 2, new Vector2(0, 35)); body.BodyType = BodyType.Dynamic; body.Friction = 0.6f; MotorJoint motorJoint = JointFactory.CreateMotorJoint(World, ground, body); motorJoint.MaxForce = 1000.0f; motorJoint.MaxTorque = 1000.0f; motorJoint.LinearOffset = new Vector2(0, 35); motorJoint.AngularOffset = (float)(Math.PI / 3f); } }
CarTest() { _hz = 4.0; _zeta = 0.7; _speed = 50.0; Body ground = BodyFactory.CreateEdge(World, new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); { double[] hs = new[] { 0.25, 1.0, 4.0, 0.0, 0.0, -1.0, -2.0, -2.0, -1.25, 0.0 }; double x = 20.0, y1 = 0.0; const double dx = 5.0; for (int i = 0; i < 10; ++i) { double y2 = hs[i]; FixtureFactory.AttachEdge(new Vector2(x, y1), new Vector2(x + dx, y2), ground); y1 = y2; x += dx; } for (int i = 0; i < 10; ++i) { double y2 = hs[i]; FixtureFactory.AttachEdge(new Vector2(x, y1), new Vector2(x + dx, y2), ground); y1 = y2; x += dx; } FixtureFactory.AttachEdge(new Vector2(x, 0.0), new Vector2(x + 40.0, 0.0), ground); x += 80.0; FixtureFactory.AttachEdge(new Vector2(x, 0.0), new Vector2(x + 40.0, 0.0), ground); x += 40.0; FixtureFactory.AttachEdge(new Vector2(x, 0.0), new Vector2(x + 10.0, 5.0), ground); x += 20.0; FixtureFactory.AttachEdge(new Vector2(x, 0.0), new Vector2(x + 40.0, 0.0), ground); x += 40.0; FixtureFactory.AttachEdge(new Vector2(x, 0.0), new Vector2(x, 20.0), ground); ground.Friction = 0.6f; } // Teeter { Body body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(140.0, 1.0); PolygonShape box = new PolygonShape(1); box.Vertices = PolygonTools.CreateRectangle(10.0, 0.25); body.CreateFixture(box); RevoluteJoint jd = JointFactory.CreateRevoluteJoint(World, ground, body, Vector2.Zero); jd.LowerLimit = -8.0 * Alt.FarseerPhysics.Settings.Pi / 180.0; jd.UpperLimit = 8.0 * Alt.FarseerPhysics.Settings.Pi / 180.0; jd.LimitEnabled = true; body.ApplyAngularImpulse(100.0); } //Bridge { const int N = 20; PolygonShape shape = new PolygonShape(1); shape.Vertices = PolygonTools.CreateRectangle(1.0, 0.125); Body prevBody = ground; for (int i = 0; i < N; ++i) { Body body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(161.0 + 2.0 * i, -0.125); Fixture fix = body.CreateFixture(shape); fix.Friction = 0.6; Vector2 anchor = new Vector2(-1, 0); JointFactory.CreateRevoluteJoint(World, prevBody, body, anchor); prevBody = body; } Vector2 anchor2 = new Vector2(1.0, 0); JointFactory.CreateRevoluteJoint(World, ground, prevBody, anchor2); } // Boxes { PolygonShape box = new PolygonShape(0.5); box.Vertices = PolygonTools.CreateRectangle(0.5, 0.5); Body body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0, 0.5); body.CreateFixture(box); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0, 1.5); body.CreateFixture(box); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0, 2.5); body.CreateFixture(box); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0, 3.5); body.CreateFixture(box); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0, 4.5); body.CreateFixture(box); } // Car { Vertices vertices = new Vertices(8); vertices.Add(new Vector2(-1.5, -0.5)); vertices.Add(new Vector2(1.5, -0.5)); vertices.Add(new Vector2(1.5, 0.0)); vertices.Add(new Vector2(0.0, 0.9)); vertices.Add(new Vector2(-1.15, 0.9)); vertices.Add(new Vector2(-1.5, 0.2)); PolygonShape chassis = new PolygonShape(vertices, 1); CircleShape circle = new CircleShape(0.4, 1); _car = new Body(World); _car.BodyType = BodyType.Dynamic; _car.Position = new Vector2(0.0, 1.0); _car.CreateFixture(chassis); _wheel1 = new Body(World); _wheel1.BodyType = BodyType.Dynamic; _wheel1.Position = new Vector2(-1.0, 0.35); _wheel1.CreateFixture(circle); _wheel1.Friction = 0.9; _wheel2 = new Body(World); _wheel2.BodyType = BodyType.Dynamic; _wheel2.Position = new Vector2(1.0, 0.4); _wheel2.CreateFixture(circle); _wheel2.Friction = 0.9; Vector2 axis = new Vector2(0.0, 1.0); _spring1 = new WheelJoint(_car, _wheel1, _wheel1.Position, axis, true); _spring1.MotorSpeed = 0.0; _spring1.MaxMotorTorque = 10;// 20.0; _spring1.MotorEnabled = true; _spring1.Frequency = _hz; _spring1.DampingRatio = _zeta; World.AddJoint(_spring1); _spring2 = new WheelJoint(_car, _wheel2, _wheel2.Position, axis, true); _spring2.MotorSpeed = 0.0; _spring2.MaxMotorTorque = 10.0; _spring2.MotorEnabled = false; _spring2.Frequency = _hz; _spring2.DampingRatio = _zeta; World.AddJoint(_spring2); } }
private CarTest() { _hz = 4.0f; _zeta = 0.7f; _speed = 50.0f; Body ground = World.CreateEdge(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); { float[] hs = new[] { 0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f }; float x = 20.0f, y1 = 0.0f; const float dx = 5.0f; for (int i = 0; i < 10; ++i) { float y2 = hs[i]; ground.CreateEdge(new Vector2(x, y1), new Vector2(x + dx, y2)); y1 = y2; x += dx; } for (int i = 0; i < 10; ++i) { float y2 = hs[i]; ground.CreateEdge(new Vector2(x, y1), new Vector2(x + dx, y2)); y1 = y2; x += dx; } ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); x += 80.0f; ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); x += 40.0f; ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x + 10.0f, 5.0f)); x += 20.0f; ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); x += 40.0f; ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x, 20.0f)); ground.SetFriction(0.6f); } // Teeter { Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(140.0f, 1.0f); PolygonShape box = new PolygonShape(1); box.Vertices = PolygonTools.CreateRectangle(10.0f, 0.25f); body.CreateFixture(box); RevoluteJoint jd = JointFactory.CreateRevoluteJoint(World, ground, body, Vector2.Zero); jd.LowerLimit = -8.0f * MathHelper.Pi / 180.0f; jd.UpperLimit = 8.0f * MathHelper.Pi / 180.0f; jd.LimitEnabled = true; body.ApplyAngularImpulse(100.0f); } //Bridge { const int N = 20; PolygonShape shape = new PolygonShape(1); shape.Vertices = PolygonTools.CreateRectangle(1.0f, 0.125f); Body prevBody = ground; for (int i = 0; i < N; ++i) { Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(161.0f + 2.0f * i, -0.125f); Fixture fix = body.CreateFixture(shape); fix.Friction = 0.6f; Vector2 anchor = new Vector2(-1, 0); JointFactory.CreateRevoluteJoint(World, prevBody, body, anchor); prevBody = body; } Vector2 anchor2 = new Vector2(1.0f, 0); JointFactory.CreateRevoluteJoint(World, ground, prevBody, anchor2); } // Boxes { PolygonShape box = new PolygonShape(0.5f); box.Vertices = PolygonTools.CreateRectangle(0.5f, 0.5f); Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 0.5f); body.CreateFixture(box); body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 1.5f); body.CreateFixture(box); body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 2.5f); body.CreateFixture(box); body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 3.5f); body.CreateFixture(box); body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 4.5f); body.CreateFixture(box); } // Car { Vertices vertices = new Vertices(8); vertices.Add(new Vector2(-1.5f, -0.5f)); vertices.Add(new Vector2(1.5f, -0.5f)); vertices.Add(new Vector2(1.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 0.9f)); vertices.Add(new Vector2(-1.15f, 0.9f)); vertices.Add(new Vector2(-1.5f, 0.2f)); PolygonShape chassis = new PolygonShape(vertices, 1); CircleShape circle = new CircleShape(0.4f, 1); _car = World.CreateBody(); _car.BodyType = BodyType.Dynamic; _car.Position = new Vector2(0.0f, 1.0f); _car.CreateFixture(chassis); _wheel1 = World.CreateBody(); _wheel1.BodyType = BodyType.Dynamic; _wheel1.Position = new Vector2(-1.0f, 0.35f); _wheel1.CreateFixture(circle); _wheel1.SetFriction(0.9f); _wheel2 = World.CreateBody(); _wheel2.BodyType = BodyType.Dynamic; _wheel2.Position = new Vector2(1.0f, 0.4f); _wheel2.CreateFixture(circle); _wheel2.SetFriction(0.9f); Vector2 axis = new Vector2(0.0f, 1.0f); _spring1 = new WheelJoint(_car, _wheel1, _wheel1.Position, axis, true); _spring1.MotorSpeed = 0.0f; _spring1.MaxMotorTorque = 20.0f; _spring1.MotorEnabled = true; _spring1.Frequency = _hz; _spring1.DampingRatio = _zeta; World.Add(_spring1); _spring2 = new WheelJoint(_car, _wheel2, _wheel2.Position, axis, true); _spring2.MotorSpeed = 0.0f; _spring2.MaxMotorTorque = 10.0f; _spring2.MotorEnabled = false; _spring2.Frequency = _hz; _spring2.DampingRatio = _zeta; World.Add(_spring2); } }
private static void Deserialize(World world, Stream stream) { List <Body> bodies = new List <Body>(); List <Fixture> fixtures = new List <Fixture>(); List <Joint> joints = new List <Joint>(); List <Shape> shapes = new List <Shape>(); XMLFragmentElement root = XMLFragmentParser.LoadFromStream(stream); if (root.Name.ToLower() != "world") { throw new Exception(); } //Read gravity foreach (XMLFragmentElement element in root.Elements) { if (element.Name.ToLower() == "gravity") { world.Gravity = ReadVector(element); break; } } //Read shapes foreach (XMLFragmentElement shapeElement in root.Elements) { if (shapeElement.Name.ToLower() == "shapes") { foreach (XMLFragmentElement element in shapeElement.Elements) { if (element.Name.ToLower() != "shape") { throw new Exception(); } ShapeType type = (ShapeType)Enum.Parse(typeof(ShapeType), element.Attributes[0].Value, true); float density = float.Parse(element.Attributes[1].Value); switch (type) { case ShapeType.Circle: { CircleShape shape = new CircleShape(); shape._density = density; foreach (XMLFragmentElement sn in element.Elements) { switch (sn.Name.ToLower()) { case "radius": shape.Radius = float.Parse(sn.Value); break; case "position": shape.Position = ReadVector(sn); break; default: throw new Exception(); } } shapes.Add(shape); } break; case ShapeType.Polygon: { PolygonShape shape = new PolygonShape(); shape._density = density; foreach (XMLFragmentElement sn in element.Elements) { switch (sn.Name.ToLower()) { case "vertices": { List <Vector2> verts = new List <Vector2>(sn.Elements.Count); foreach (XMLFragmentElement vert in sn.Elements) { verts.Add(ReadVector(vert)); } shape.Vertices = new Vertices(verts); } break; case "centroid": shape.MassData.Centroid = ReadVector(sn); break; } } shapes.Add(shape); } break; case ShapeType.Edge: { EdgeShape shape = new EdgeShape(); shape._density = density; foreach (XMLFragmentElement sn in element.Elements) { switch (sn.Name.ToLower()) { case "hasvertex0": shape.HasVertex0 = bool.Parse(sn.Value); break; case "hasvertex3": shape.HasVertex0 = bool.Parse(sn.Value); break; case "vertex0": shape.Vertex0 = ReadVector(sn); break; case "vertex1": shape.Vertex1 = ReadVector(sn); break; case "vertex2": shape.Vertex2 = ReadVector(sn); break; case "vertex3": shape.Vertex3 = ReadVector(sn); break; default: throw new Exception(); } } shapes.Add(shape); } break; case ShapeType.Chain: { ChainShape shape = new ChainShape(); shape._density = density; foreach (XMLFragmentElement sn in element.Elements) { switch (sn.Name.ToLower()) { case "vertices": { List <Vector2> verts = new List <Vector2>(sn.Elements.Count); foreach (XMLFragmentElement vert in sn.Elements) { verts.Add(ReadVector(vert)); } shape.Vertices = new Vertices(verts); } break; case "nextvertex": shape.NextVertex = ReadVector(sn); break; case "prevvertex": shape.PrevVertex = ReadVector(sn); break; default: throw new Exception(); } } shapes.Add(shape); } break; } } } } //Read fixtures foreach (XMLFragmentElement fixtureElement in root.Elements) { if (fixtureElement.Name.ToLower() == "fixtures") { foreach (XMLFragmentElement element in fixtureElement.Elements) { Fixture fixture = new Fixture(); if (element.Name.ToLower() != "fixture") { throw new Exception(); } fixture.FixtureId = int.Parse(element.Attributes[0].Value); foreach (XMLFragmentElement sn in element.Elements) { switch (sn.Name.ToLower()) { case "filterdata": foreach (XMLFragmentElement ssn in sn.Elements) { switch (ssn.Name.ToLower()) { case "categorybits": fixture._collisionCategories = (Category)int.Parse(ssn.Value); break; case "maskbits": fixture._collidesWith = (Category)int.Parse(ssn.Value); break; case "groupindex": fixture._collisionGroup = short.Parse(ssn.Value); break; case "CollisionIgnores": string[] split = ssn.Value.Split('|'); foreach (string s in split) { fixture._collisionIgnores.Add(int.Parse(s)); } break; } } break; case "friction": fixture.Friction = float.Parse(sn.Value); break; case "issensor": fixture.IsSensor = bool.Parse(sn.Value); break; case "restitution": fixture.Restitution = float.Parse(sn.Value); break; case "userdata": fixture.UserData = ReadSimpleType(sn, null, false); break; } } fixtures.Add(fixture); } } } //Read bodies foreach (XMLFragmentElement bodyElement in root.Elements) { if (bodyElement.Name.ToLower() == "bodies") { foreach (XMLFragmentElement element in bodyElement.Elements) { Body body = new Body(world); if (element.Name.ToLower() != "body") { throw new Exception(); } body.BodyType = (BodyType)Enum.Parse(typeof(BodyType), element.Attributes[0].Value, true); foreach (XMLFragmentElement sn in element.Elements) { switch (sn.Name.ToLower()) { case "active": bool enabled = bool.Parse(sn.Value); if (enabled) { body._flags |= BodyFlags.Enabled; } else { body._flags &= ~BodyFlags.Enabled; } break; case "allowsleep": body.SleepingAllowed = bool.Parse(sn.Value); break; case "angle": { Vector2 position = body.Position; body.SetTransformIgnoreContacts(ref position, float.Parse(sn.Value)); } break; case "angulardamping": body.AngularDamping = float.Parse(sn.Value); break; case "angularvelocity": body.AngularVelocity = float.Parse(sn.Value); break; case "awake": body.Awake = bool.Parse(sn.Value); break; case "bullet": body.IsBullet = bool.Parse(sn.Value); break; case "fixedrotation": body.FixedRotation = bool.Parse(sn.Value); break; case "lineardamping": body.LinearDamping = float.Parse(sn.Value); break; case "linearvelocity": body.LinearVelocity = ReadVector(sn); break; case "position": { float rotation = body.Rotation; Vector2 position = ReadVector(sn); body.SetTransformIgnoreContacts(ref position, rotation); } break; case "userdata": body.UserData = ReadSimpleType(sn, null, false); break; case "bindings": { foreach (XMLFragmentElement pair in sn.Elements) { Fixture fix = fixtures[int.Parse(pair.Attributes[0].Value)]; fix.Shape = shapes[int.Parse(pair.Attributes[1].Value)].Clone(); fix.CloneOnto(body); } break; } } } bodies.Add(body); } } } //Read joints foreach (XMLFragmentElement jointElement in root.Elements) { if (jointElement.Name.ToLower() == "joints") { foreach (XMLFragmentElement n in jointElement.Elements) { Joint joint; if (n.Name.ToLower() != "joint") { throw new Exception(); } JointType type = (JointType)Enum.Parse(typeof(JointType), n.Attributes[0].Value, true); int bodyAIndex = -1, bodyBIndex = -1; bool collideConnected = false; object userData = null; foreach (XMLFragmentElement sn in n.Elements) { switch (sn.Name.ToLower()) { case "bodya": bodyAIndex = int.Parse(sn.Value); break; case "bodyb": bodyBIndex = int.Parse(sn.Value); break; case "collideconnected": collideConnected = bool.Parse(sn.Value); break; case "userdata": userData = ReadSimpleType(sn, null, false); break; } } Body bodyA = bodies[bodyAIndex]; Body bodyB = bodies[bodyBIndex]; switch (type) { //case JointType.FixedMouse: // joint = new FixedMouseJoint(); // break; //case JointType.FixedRevolute: // break; //case JointType.FixedDistance: // break; //case JointType.FixedLine: // break; //case JointType.FixedPrismatic: // break; //case JointType.FixedAngle: // break; //case JointType.FixedFriction: // break; case JointType.Distance: joint = new DistanceJoint(); break; case JointType.Friction: joint = new FrictionJoint(); break; case JointType.Wheel: joint = new WheelJoint(); break; case JointType.Prismatic: joint = new PrismaticJoint(); break; case JointType.Pulley: joint = new PulleyJoint(); break; case JointType.Revolute: joint = new RevoluteJoint(); break; case JointType.Weld: joint = new WeldJoint(); break; case JointType.Rope: joint = new RopeJoint(); break; case JointType.Angle: joint = new AngleJoint(); break; case JointType.Motor: joint = new MotorJoint(); break; case JointType.Gear: throw new Exception("GearJoint is not supported."); default: throw new Exception("Invalid or unsupported joint."); } joint.CollideConnected = collideConnected; joint.UserData = userData; joint.BodyA = bodyA; joint.BodyB = bodyB; joints.Add(joint); world.AddJoint(joint); foreach (XMLFragmentElement sn in n.Elements) { // check for specific nodes switch (type) { case JointType.Distance: { switch (sn.Name.ToLower()) { case "dampingratio": ((DistanceJoint)joint).DampingRatio = float.Parse(sn.Value); break; case "frequencyhz": ((DistanceJoint)joint).Frequency = float.Parse(sn.Value); break; case "length": ((DistanceJoint)joint).Length = float.Parse(sn.Value); break; case "localanchora": ((DistanceJoint)joint).LocalAnchorA = ReadVector(sn); break; case "localanchorb": ((DistanceJoint)joint).LocalAnchorB = ReadVector(sn); break; } } break; case JointType.Friction: { switch (sn.Name.ToLower()) { case "localanchora": ((FrictionJoint)joint).LocalAnchorA = ReadVector(sn); break; case "localanchorb": ((FrictionJoint)joint).LocalAnchorB = ReadVector(sn); break; case "maxforce": ((FrictionJoint)joint).MaxForce = float.Parse(sn.Value); break; case "maxtorque": ((FrictionJoint)joint).MaxTorque = float.Parse(sn.Value); break; } } break; case JointType.Wheel: { switch (sn.Name.ToLower()) { case "enablemotor": ((WheelJoint)joint).MotorEnabled = bool.Parse(sn.Value); break; case "localanchora": ((WheelJoint)joint).LocalAnchorA = ReadVector(sn); break; case "localanchorb": ((WheelJoint)joint).LocalAnchorB = ReadVector(sn); break; case "motorspeed": ((WheelJoint)joint).MotorSpeed = float.Parse(sn.Value); break; case "dampingratio": ((WheelJoint)joint).DampingRatio = float.Parse(sn.Value); break; case "maxmotortorque": ((WheelJoint)joint).MaxMotorTorque = float.Parse(sn.Value); break; case "frequencyhz": ((WheelJoint)joint).Frequency = float.Parse(sn.Value); break; case "axis": ((WheelJoint)joint).Axis = ReadVector(sn); break; } } break; case JointType.Prismatic: { switch (sn.Name.ToLower()) { case "enablelimit": ((PrismaticJoint)joint).LimitEnabled = bool.Parse(sn.Value); break; case "enablemotor": ((PrismaticJoint)joint).MotorEnabled = bool.Parse(sn.Value); break; case "localanchora": ((PrismaticJoint)joint).LocalAnchorA = ReadVector(sn); break; case "localanchorb": ((PrismaticJoint)joint).LocalAnchorB = ReadVector(sn); break; case "axis": ((PrismaticJoint)joint).Axis = ReadVector(sn); break; case "maxmotorforce": ((PrismaticJoint)joint).MaxMotorForce = float.Parse(sn.Value); break; case "motorspeed": ((PrismaticJoint)joint).MotorSpeed = float.Parse(sn.Value); break; case "lowertranslation": ((PrismaticJoint)joint).LowerLimit = float.Parse(sn.Value); break; case "uppertranslation": ((PrismaticJoint)joint).UpperLimit = float.Parse(sn.Value); break; case "referenceangle": ((PrismaticJoint)joint).ReferenceAngle = float.Parse(sn.Value); break; } } break; case JointType.Pulley: { switch (sn.Name.ToLower()) { case "worldanchora": ((PulleyJoint)joint).WorldAnchorA = ReadVector(sn); break; case "worldanchorb": ((PulleyJoint)joint).WorldAnchorB = ReadVector(sn); break; case "lengtha": ((PulleyJoint)joint).LengthA = float.Parse(sn.Value); break; case "lengthb": ((PulleyJoint)joint).LengthB = float.Parse(sn.Value); break; case "localanchora": ((PulleyJoint)joint).LocalAnchorA = ReadVector(sn); break; case "localanchorb": ((PulleyJoint)joint).LocalAnchorB = ReadVector(sn); break; case "ratio": ((PulleyJoint)joint).Ratio = float.Parse(sn.Value); break; case "constant": ((PulleyJoint)joint).Constant = float.Parse(sn.Value); break; } } break; case JointType.Revolute: { switch (sn.Name.ToLower()) { case "enablelimit": ((RevoluteJoint)joint).LimitEnabled = bool.Parse(sn.Value); break; case "enablemotor": ((RevoluteJoint)joint).MotorEnabled = bool.Parse(sn.Value); break; case "localanchora": ((RevoluteJoint)joint).LocalAnchorA = ReadVector(sn); break; case "localanchorb": ((RevoluteJoint)joint).LocalAnchorB = ReadVector(sn); break; case "maxmotortorque": ((RevoluteJoint)joint).MaxMotorTorque = float.Parse(sn.Value); break; case "motorspeed": ((RevoluteJoint)joint).MotorSpeed = float.Parse(sn.Value); break; case "lowerangle": ((RevoluteJoint)joint).LowerLimit = float.Parse(sn.Value); break; case "upperangle": ((RevoluteJoint)joint).UpperLimit = float.Parse(sn.Value); break; case "referenceangle": ((RevoluteJoint)joint).ReferenceAngle = float.Parse(sn.Value); break; } } break; case JointType.Weld: { switch (sn.Name.ToLower()) { case "localanchora": ((WeldJoint)joint).LocalAnchorA = ReadVector(sn); break; case "localanchorb": ((WeldJoint)joint).LocalAnchorB = ReadVector(sn); break; } } break; case JointType.Rope: { switch (sn.Name.ToLower()) { case "localanchora": ((RopeJoint)joint).LocalAnchorA = ReadVector(sn); break; case "localanchorb": ((RopeJoint)joint).LocalAnchorB = ReadVector(sn); break; case "maxlength": ((RopeJoint)joint).MaxLength = float.Parse(sn.Value); break; } } break; case JointType.Gear: throw new Exception("Gear joint is unsupported"); case JointType.Angle: { switch (sn.Name.ToLower()) { case "biasfactor": ((AngleJoint)joint).BiasFactor = float.Parse(sn.Value); break; case "maximpulse": ((AngleJoint)joint).MaxImpulse = float.Parse(sn.Value); break; case "softness": ((AngleJoint)joint).Softness = float.Parse(sn.Value); break; case "targetangle": ((AngleJoint)joint).TargetAngle = float.Parse(sn.Value); break; } } break; case JointType.Motor: switch (sn.Name.ToLower()) { case "angularoffset": ((MotorJoint)joint).AngularOffset = float.Parse(sn.Value); break; case "linearoffset": ((MotorJoint)joint).LinearOffset = ReadVector(sn); break; case "maxforce": ((MotorJoint)joint).MaxForce = float.Parse(sn.Value); break; case "maxtorque": ((MotorJoint)joint).MaxTorque = float.Parse(sn.Value); break; case "correctionfactor": ((MotorJoint)joint).CorrectionFactor = float.Parse(sn.Value); break; } break; } } } } } world.ProcessChanges(); }
public override void Construct() { Demo.Window.Title = "Game Scene Demo"; Demo.Camera3D.Position = new Vector3(17f, 9f, 19f); Vector2 defaultPositionShift = new Vector2(-100f, 5f); Demo.Camera3D.Target = new Vector3(defaultPositionShift.X, defaultPositionShift.Y, 18f); _positionStart = Demo.Camera3D.Target; ConstructBusStop(); ConstructBackground(); PolygonShape shape = new PolygonShape(1f) { Vertices = PolygonTools.CreateRoundedRectangle(25f, 6.45566f, 1.5f, 1.5f, 4) }; _chassis3D = Body3DFactory.CreateBody3D( _bodyModel, Demo.World3D.World2D, Demo.GraphicsDevice, defaultPositionShift, BodyType.Dynamic, new Vector2(25f, 6.45566f)); Demo.World3D.AddBody3D(_chassis3D); #region Přední náprava Vector2 frontPosition = new Vector2(6.996475f, -2.9f) + defaultPositionShift; Vector2 axis = new Vector2(0f, 1.2f); _frontWheels = new Body(); _frontWheels.CreateCircle(1.3163165f, 1f); _frontWheels3D = Body3DFactory.CreateBody3D( _frontWheelsModel, Demo.World3D.World2D, _frontWheels, frontPosition); _springFront = new WheelJoint(_chassis3D.Body2D, _frontWheels, frontPosition, axis, true) { MotorSpeed = 0f, MaxMotorTorque = 10f, MotorEnabled = false, Frequency = 4f, DampingRatio = 0.7f }; Demo.World3D.World2D.Add(_springFront); Demo.World3D.AddBody3D(_frontWheels3D); #endregion Přední náprava #region Zadní náprava Vector2 backPosition = new Vector2(-5.973385f, -2.9f) + defaultPositionShift; _backWheels = new Body(); _backWheels.CreateCircle(1.364622f, 1f); _backWheels3D = Body3DFactory.CreateBody3D( _backWheelsModel, Demo.World3D.World2D, _backWheels, backPosition); _springBack = new WheelJoint(_chassis3D.Body2D, _backWheels, backPosition, axis, true) { MotorSpeed = DEFAULT_MOTOR_SPEED, MaxMotorTorque = MAX_MOTOR_TORQUE, MotorEnabled = true, Frequency = 4f, DampingRatio = 0.7f }; Demo.World3D.World2D.Add(_springBack); Demo.World3D.AddBody3D(_backWheels3D); #endregion Zadní náprava #region Rampa _ramp3D = Body3DFactory.CreateBody3D( _rampModel, Demo.World3D.World2D, Demo.GraphicsDevice, new Vector2(0f, 5f)); Demo.World3D.AddBody3D(_ramp3D); #endregion Rampa }
public override void LoadContent() { base.LoadContent(); World.Gravity = new Vector2(0f, -10f); HasCursor = true; EnableCameraControl = true; HasVirtualStick = true; // terrain _ground = World.CreateBody(); { Vertices terrain = new Vertices(); terrain.Add(new Vector2(-20f, 5f)); terrain.Add(new Vector2(-20f, 0f)); terrain.Add(new Vector2(20f, 0f)); terrain.Add(new Vector2(25f, 0.25f)); terrain.Add(new Vector2(30f, 1f)); terrain.Add(new Vector2(35f, 4f)); terrain.Add(new Vector2(40f, 0f)); terrain.Add(new Vector2(45f, 0f)); terrain.Add(new Vector2(50f, -1f)); terrain.Add(new Vector2(55f, -2f)); terrain.Add(new Vector2(60f, -2f)); terrain.Add(new Vector2(65f, -1.25f)); terrain.Add(new Vector2(70f, 0f)); terrain.Add(new Vector2(75f, 0.3f)); terrain.Add(new Vector2(80f, 1.5f)); terrain.Add(new Vector2(85f, 3.5f)); terrain.Add(new Vector2(90f, 0f)); terrain.Add(new Vector2(95f, -0.5f)); terrain.Add(new Vector2(100f, -1f)); terrain.Add(new Vector2(105f, -2f)); terrain.Add(new Vector2(110f, -2.5f)); terrain.Add(new Vector2(115f, -1.3f)); terrain.Add(new Vector2(120f, 0f)); terrain.Add(new Vector2(160f, 0f)); terrain.Add(new Vector2(159f, -10f)); terrain.Add(new Vector2(201f, -10f)); terrain.Add(new Vector2(200f, 0f)); terrain.Add(new Vector2(240f, 0f)); terrain.Add(new Vector2(250f, 5f)); terrain.Add(new Vector2(250f, -10f)); terrain.Add(new Vector2(270f, -10f)); terrain.Add(new Vector2(270f, 0)); terrain.Add(new Vector2(310f, 0)); terrain.Add(new Vector2(310f, 5)); for (int i = 0; i < terrain.Count - 1; ++i) { _ground.CreateEdge(terrain[i], terrain[i + 1]); } _ground.SetFriction(0.6f); } // teeter board { _board = World.CreateBody(); _board.BodyType = BodyType.Dynamic; _board.Position = new Vector2(140.0f, 1.0f); PolygonShape box = new PolygonShape(PolygonTools.CreateRectangle(20.0f / 2f, 0.5f / 2f), 1); _teeter = new Sprite(ScreenManager.Assets.TextureFromShape(box, MaterialType.Pavement, Color.LightGray, 1.2f)); _board.CreateFixture(box); RevoluteJoint teeterAxis = JointFactory.CreateRevoluteJoint(World, _ground, _board, Vector2.Zero); teeterAxis.LowerLimit = -8.0f * MathHelper.Pi / 180.0f; teeterAxis.UpperLimit = 8.0f * MathHelper.Pi / 180.0f; teeterAxis.LimitEnabled = true; _board.ApplyAngularImpulse(100.0f); } // bridge { _bridgeSegments = new List <Body>(); const int segmentCount = 20; PolygonShape shape = new PolygonShape(PolygonTools.CreateRectangle(1.0f, 0.125f), 1f); _bridge = new Sprite(ScreenManager.Assets.TextureFromShape(shape, MaterialType.Dots, Color.SandyBrown, 1f)); Body prevBody = _ground; for (int i = 0; i < segmentCount; ++i) { Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(161f + 2f * i, -0.125f); Fixture fix = body.CreateFixture(shape); fix.Friction = 0.6f; JointFactory.CreateRevoluteJoint(World, prevBody, body, -Vector2.UnitX); prevBody = body; _bridgeSegments.Add(body); } JointFactory.CreateRevoluteJoint(World, _ground, prevBody, Vector2.UnitX); } // boxes { _boxes = new List <Body>(); PolygonShape box = new PolygonShape(PolygonTools.CreateRectangle(0.5f, 0.5f), 1f); _box = new Sprite(ScreenManager.Assets.TextureFromShape(box, MaterialType.Squares, Color.SaddleBrown, 2f)); Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(220f, 0.5f); body.CreateFixture(box); _boxes.Add(body); body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(220f, 1.5f); body.CreateFixture(box); _boxes.Add(body); body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(220f, 2.5f); body.CreateFixture(box); _boxes.Add(body); } // car { //вершины на основе которых делается физ.объект корпуса машины Vertices vertices = new Vertices(8); vertices.Add(new Vector2(-2.5f, -0.08f)); vertices.Add(new Vector2(-2.375f, 0.46f)); vertices.Add(new Vector2(-0.58f, 0.92f)); vertices.Add(new Vector2(0.46f, 0.92f)); vertices.Add(new Vector2(2.5f, 0.17f)); vertices.Add(new Vector2(2.5f, -0.205f)); vertices.Add(new Vector2(2.3f, -0.33f)); vertices.Add(new Vector2(-2.25f, -0.35f)); //создает форму на основе заданных вершин для корпуса и колёс PolygonShape chassis = new PolygonShape(vertices, 2); CircleShape wheelShape = new CircleShape(0.5f, 0.8f); //создание физ.объекта корпуса машины _car = World.CreateBody(); _car.BodyType = BodyType.Dynamic; _car.Position = new Vector2(0.0f, 1.0f); _car.CreateFixture(chassis); //создание физ.объекта заднего колеса _wheelBack = World.CreateBody(); _wheelBack.BodyType = BodyType.Dynamic; _wheelBack.Position = new Vector2(-1.709f, 0.78f); _wheelBack.CreateFixture(wheelShape); _wheelBack.SetFriction(0.9f); //создание физ.объекта переднего колеса wheelShape.Density = 1; _wheelFront = World.CreateBody(); _wheelFront.BodyType = BodyType.Dynamic; _wheelFront.Position = new Vector2(1.54f, 0.8f); _wheelFront.CreateFixture(wheelShape); Vector2 axis = new Vector2(0.0f, 1.2f); _springBack = new WheelJoint(_car, _wheelBack, _wheelBack.Position, axis, true); _springBack.MotorSpeed = 0.0f; _springBack.MaxMotorTorque = 20.0f; _springBack.MotorEnabled = true; _springBack.Frequency = 4.0f; _springBack.DampingRatio = 0.7f; World.Add(_springBack); _springFront = new WheelJoint(_car, _wheelFront, _wheelFront.Position, axis, true); _springFront.MotorSpeed = 0.0f; _springFront.MaxMotorTorque = 10.0f; _springFront.MotorEnabled = false; _springFront.Frequency = 4.0f; _springFront.DampingRatio = 0.7f; World.Add(_springFront); _carBody = new Sprite(ScreenManager.Content.Load <Texture2D>("Samples/car"), AssetCreator.CalculateOrigin(_car, 24f)); _wheel = new Sprite(ScreenManager.Content.Load <Texture2D>("Samples/wheel")); } Camera.MinRotation = -0.05f; Camera.MaxRotation = 0.05f; Camera.TrackingBody = _car; Camera.EnableTracking = true; }
public override void LoadContent() { base.LoadContent(); song = ScreenManager.Instance.Content.Load <Song>("Audio/mainsong"); // use the name of your song instead of "song_name" sacrificeSprite.LoadContent(); audioManager.LoadContent(); camera = new Camera2D(ScreenManager.Instance.GraphicsDevice); if (world == null) { world = new World(Vector2.UnitY * 10); } else { world.Clear(); } cameraTarget = CameraTarget.Init; camera.MaxPosition = new Vector2(6850, 0); camera.MinPosition = new Vector2(-3300, 0); background.LoadContent(); truckAngel.LoadContent(); tireAngel.LoadContent(); instructionAngel.LoadContent(); instructionDemon.LoadContent(); endText.LoadContent(); truckDemon.LoadContent(); tireDemon.LoadContent(); angelVictoryGoal = new Goal(world, new Vector2(8350, 775), true); angelVictoryGoal.LoadContent(); demonVictoryGoal = new Goal(world, new Vector2(-4900, 775), false); demonVictoryGoal.LoadContent(); if (debug == null) { debug = new DebugViewXNA(world); debug.AppendFlags(DebugViewFlags.Shape); debug.AppendFlags(DebugViewFlags.PolygonPoints); debug.LoadContent(ScreenManager.Instance.GraphicsDevice, ScreenManager.Instance.Content); } floor = new Body(world); { Vertices terrain = new Vertices(); terrain.Add(ConvertUnits.ToSimUnits(-6890, 880)); //terrain.Add(ConvertUnits.ToSimUnits(200, 880)); //terrain.Add(ConvertUnits.ToSimUnits(400, 870)); //terrain.Add(ConvertUnits.ToSimUnits(600, 890)); //terrain.Add(ConvertUnits.ToSimUnits(800, 875)); //terrain.Add(ConvertUnits.ToSimUnits(1000, 880)); //terrain.Add(ConvertUnits.ToSimUnits(1200, 880)); //terrain.Add(ConvertUnits.ToSimUnits(1400, 880)); //terrain.Add(ConvertUnits.ToSimUnits(1600, 885)); //terrain.Add(ConvertUnits.ToSimUnits(1800, 875)); ////terrain.Add(ConvertUnits.ToSimUnits(20, 890)); ////terrain.Add(ConvertUnits.ToSimUnits(20, 890)); terrain.Add(ConvertUnits.ToSimUnits(8540, 880)); for (int i = 0; i < terrain.Count - 1; ++i) { FixtureFactory.AttachEdge(terrain[i], terrain[i + 1], floor); } floor.Friction = 0.6f; } world.Gravity = new Vector2(0, 17f); wallLeft = BodyFactory.CreateRectangle(world, ConvertUnits.ToSimUnits(2f), ConvertUnits.ToSimUnits(1080f), 10f); //wallLeft.Position = ConvertUnits.ToSimUnits(0, 540); wallLeft.Position = camera.Position - new Vector2(0, -5); wallLeft.IsStatic = true; wallLeft.Restitution = 0.2f; wallLeft.Friction = 0.2f; wallRight = BodyFactory.CreateRectangle(world, ConvertUnits.ToSimUnits(2f), ConvertUnits.ToSimUnits(1080f), 10f); //wallRight.Position = ConvertUnits.ToSimUnits(1920, 540); wallRight.Position = camera.Position + new Vector2(19.2f, 5); wallRight.IsStatic = true; wallRight.Restitution = 0.2f; wallRight.Friction = 0.2f; wallLeft_1 = BodyFactory.CreateRectangle(world, ConvertUnits.ToSimUnits(2f), ConvertUnits.ToSimUnits(1080f), 10f); wallLeft_1.Position = ConvertUnits.ToSimUnits(-5000, 540); wallLeft_1.IsStatic = true; wallLeft_1.Restitution = 0.2f; wallLeft_1.Friction = 0.2f; wallRight_1 = BodyFactory.CreateRectangle(world, ConvertUnits.ToSimUnits(2f), ConvertUnits.ToSimUnits(1080f), 10f); wallRight_1.Position = ConvertUnits.ToSimUnits(8430, 540); wallRight_1.IsStatic = true; wallRight_1.Restitution = 0.2f; wallRight_1.Friction = 0.2f; CircleShape wheelShape = new CircleShape(0.4f, 0.8f); Vertices chassisShapeDemon = new Vertices(4); chassisShapeDemon.Add(ConvertUnits.ToSimUnits(-190, -20)); chassisShapeDemon.Add(ConvertUnits.ToSimUnits(-150, 30)); chassisShapeDemon.Add(ConvertUnits.ToSimUnits(165, -5)); chassisShapeDemon.Add(ConvertUnits.ToSimUnits(165, 10)); PolygonShape chassisDemon = new PolygonShape(chassisShapeDemon, 2); truckDemonCollisionBox = new Body(world); truckDemonCollisionBox.BodyType = BodyType.Dynamic; truckDemonCollisionBox.Position = camera.Position + new Vector2(3.5f, -1.0f); truckDemonCollisionBox.CreateFixture(chassisDemon); truckDemonCollisionBox.UserData = "demon"; _wheelBackDemon = new Body(world); _wheelBackDemon.BodyType = BodyType.Dynamic; //_wheelBackDemon.Position = new Vector2(2.4f, -0.4f); _wheelBackDemon.Position = truckDemonCollisionBox.Position + new Vector2(-1.1f, 0.6f); _wheelBackDemon.CreateFixture(wheelShape); _wheelBackDemon.Friction = 0.8f; wheelShape.Density = 1; _wheelFrontDemon = new Body(world); _wheelFrontDemon.BodyType = BodyType.Dynamic; _wheelFrontDemon.Position = truckDemonCollisionBox.Position + new Vector2(-0.1f, 0.6f); //_wheelFrontDemon.Position = new Vector2(3.4f, -0.4f); _wheelFrontDemon.CreateFixture(wheelShape); _wheelFrontDemon.Friction = 0.8f; Vector2 axisDemon = new Vector2(0.0f, -1.2f); _springBackDemon = new WheelJoint(truckDemonCollisionBox, _wheelBackDemon, _wheelBackDemon.Position, axisDemon, true); _springBackDemon.MotorSpeed = 0.0f; _springBackDemon.MaxMotorTorque = 19.5f; _springBackDemon.MotorEnabled = true; _springBackDemon.Frequency = 4.0f; _springBackDemon.DampingRatio = 0.7f; world.AddJoint(_springBackDemon); _springFrontDemon = new WheelJoint(truckDemonCollisionBox, _wheelFrontDemon, _wheelFrontDemon.Position, axisDemon, true); _springFrontDemon.MotorSpeed = 0.0f; _springFrontDemon.MaxMotorTorque = 19.5f; _springFrontDemon.MotorEnabled = true; _springFrontDemon.Frequency = 4.0f; _springFrontDemon.DampingRatio = 0.7f; world.AddJoint(_springFrontDemon); Vertices chassisShapeAngel = new Vertices(4); chassisShapeAngel.Add(ConvertUnits.ToSimUnits(-160, 0)); chassisShapeAngel.Add(ConvertUnits.ToSimUnits(-160, 20)); chassisShapeAngel.Add(ConvertUnits.ToSimUnits(170, -30)); chassisShapeAngel.Add(ConvertUnits.ToSimUnits(140, 35)); PolygonShape chassisAngel = new PolygonShape(chassisShapeAngel, 2); truckAngelCollisionBox = new Body(world); truckAngelCollisionBox.BodyType = BodyType.Dynamic; truckAngelCollisionBox.Position = camera.Position + new Vector2(16.7f, -1.0f); truckAngelCollisionBox.CreateFixture(chassisAngel); truckAngelCollisionBox.UserData = "angel"; _wheelBackAngel = new Body(world); _wheelBackAngel.BodyType = BodyType.Dynamic; //_wheelBackAngel.Position = new Vector2(16.7f, -0.45f); _wheelBackAngel.Position = truckAngelCollisionBox.Position + new Vector2(0f, 0.55f); _wheelBackAngel.CreateFixture(wheelShape); _wheelBackAngel.Friction = 0.8f; wheelShape.Density = 1; _wheelFrontAngel = new Body(world); _wheelFrontAngel.BodyType = BodyType.Dynamic; //_wheelFrontAngel.Position = new Vector2(17.8f, -0.45f); _wheelFrontAngel.Position = truckAngelCollisionBox.Position + new Vector2(1.1f, 0.55f); _wheelFrontAngel.CreateFixture(wheelShape); _wheelFrontAngel.Friction = 0.8f; Vector2 axisAngel = new Vector2(0.0f, -1.2f); _springBackAngel = new WheelJoint(truckAngelCollisionBox, _wheelBackAngel, _wheelBackAngel.Position, axisAngel, true); _springBackAngel.MotorSpeed = 0.0f; _springBackAngel.MaxMotorTorque = 19.5f; _springBackAngel.MotorEnabled = true; _springBackAngel.Frequency = 4.0f; _springBackAngel.DampingRatio = 0.7f; world.AddJoint(_springBackAngel); _springFrontAngel = new WheelJoint(truckAngelCollisionBox, _wheelFrontAngel, _wheelFrontAngel.Position, axisAngel, true); _springFrontAngel.MotorSpeed = 0.0f; _springFrontAngel.MaxMotorTorque = 19.5f; _springFrontAngel.MotorEnabled = true; _springFrontAngel.Frequency = 4.0f; _springFrontAngel.DampingRatio = 0.7f; world.AddJoint(_springFrontAngel); sacrifice = BodyFactory.CreateRectangle(world, 0.8f, 0.4f, 1f); sacrifice.Position = ConvertUnits.ToSimUnits(960, 700); sacrifice.BodyType = BodyType.Dynamic; }
protected override void Create() { _hz = 4.0f; _zeta = 0.7f; _speed = 50.0f; Body ground; { var bd = new BodyDef(); ground = World.CreateBody(bd); var shape = new EdgeShape(); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 0.0f; fd.Friction = 0.6f; shape.Set(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); ground.CreateFixture(fd); float[] hs = { 0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f }; float x = 20.0f, y1 = 0.0f, dx = 5.0f; for (var i = 0; i < 10; ++i) { var y2 = hs[i]; shape.Set(new Vector2(x, y1), new Vector2(x + dx, y2)); ground.CreateFixture(fd); y1 = y2; x += dx; } for (var i = 0; i < 10; ++i) { var y2 = hs[i]; shape.Set(new Vector2(x, y1), new Vector2(x + dx, y2)); ground.CreateFixture(fd); y1 = y2; x += dx; } shape.Set(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 80.0f; shape.Set(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 40.0f; shape.Set(new Vector2(x, 0.0f), new Vector2(x + 10.0f, 5.0f)); ground.CreateFixture(fd); x += 20.0f; shape.Set(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 40.0f; shape.Set(new Vector2(x, 0.0f), new Vector2(x, 20.0f)); ground.CreateFixture(fd); } // Teeter { var bd = new BodyDef(); bd.Position.Set(140.0f, 1.0f); bd.BodyType = BodyType.DynamicBody; var body = World.CreateBody(bd); var box = new PolygonShape(); box.SetAsBox(10.0f, 0.25f); body.CreateFixture(box, 1.0f); var jd = new RevoluteJointDef(); jd.Initialize(ground, body, body.GetPosition()); jd.LowerAngle = -8.0f * Settings.Pi / 180.0f; jd.UpperAngle = 8.0f * Settings.Pi / 180.0f; jd.EnableLimit = true; World.CreateJoint(jd); body.ApplyAngularImpulse(100.0f, true); } // Bridge { var N = 20; var shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.125f); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; fd.Friction = 0.6f; var jd = new RevoluteJointDef(); var prevBody = ground; for (var i = 0; i < N; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(161.0f + 2.0f * i, -0.125f); var body = World.CreateBody(bd); body.CreateFixture(fd); var anchor = new Vector2(160.0f + 2.0f * i, -0.125f); jd.Initialize(prevBody, body, anchor); World.CreateJoint(jd); prevBody = body; } { var anchor = new Vector2(160.0f + 2.0f * N, -0.125f); jd.Initialize(prevBody, ground, anchor); World.CreateJoint(jd); } } // Boxes { var box = new PolygonShape(); box.SetAsBox(0.5f, 0.5f); Body body = null; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(230.0f, 0.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.Position.Set(230.0f, 1.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.Position.Set(230.0f, 2.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.Position.Set(230.0f, 3.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.Position.Set(230.0f, 4.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); } // Car { var chassis = new PolygonShape(); var vertices = new Vector2[8]; vertices[0].Set(-1.5f, -0.5f); vertices[1].Set(1.5f, -0.5f); vertices[2].Set(1.5f, 0.0f); vertices[3].Set(0.0f, 0.9f); vertices[4].Set(-1.15f, 0.9f); vertices[5].Set(-1.5f, 0.2f); chassis.Set(vertices); var circle = new CircleShape(); circle.Radius = 0.4f; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(0.0f, 1.0f); _car = World.CreateBody(bd); _car.CreateFixture(chassis, 1.0f); var fd = new FixtureDef(); fd.Shape = circle; fd.Density = 1.0f; fd.Friction = 0.9f; bd.Position.Set(-1.0f, 0.35f); _wheel1 = World.CreateBody(bd); _wheel1.CreateFixture(fd); bd.Position.Set(1.0f, 0.4f); _wheel2 = World.CreateBody(bd); _wheel2.CreateFixture(fd); var jd = new WheelJointDef(); var axis = new Vector2(0.0f, 1.0f); jd.Initialize(_car, _wheel1, _wheel1.GetPosition(), axis); jd.MotorSpeed = 0.0f; jd.MaxMotorTorque = 20.0f; jd.EnableMotor = true; jd.FrequencyHz = _hz; jd.DampingRatio = _zeta; _spring1 = (WheelJoint)World.CreateJoint(jd); jd.Initialize(_car, _wheel2, _wheel2.GetPosition(), axis); jd.MotorSpeed = 0.0f; jd.MaxMotorTorque = 10.0f; jd.EnableMotor = false; jd.FrequencyHz = _hz; jd.DampingRatio = _zeta; _spring2 = (WheelJoint)World.CreateJoint(jd); } }
//public static FixedPrismaticJoint CreateFixedPrismaticJoint(World world, Body body, Vector2 worldAnchor, // Vector2 axis) //{ // FixedPrismaticJoint joint = new FixedPrismaticJoint(body, worldAnchor, axis); // world.AddJoint(joint); // return joint; //} #endregion #region Wheel Joint /// <summary> /// Creates a Wheel Joint /// </summary> /// <param name="bodyA"></param> /// <param name="bodyB"></param> /// <param name="anchor"></param> /// <param name="axis"></param> /// <returns></returns> public static WheelJoint CreateWheelJoint(Body bodyA, Body bodyB, Vector2 anchor, Vector2 axis) { WheelJoint joint = new WheelJoint(bodyA, bodyB, anchor, axis); return(joint); }
public override void LoadContent() { base.LoadContent(); World.Gravity = new Vector2(0f, 10f); HasCursor = false; EnableCameraControl = true; _hzFront = 8.5f; _hzBack = 5.0f; _zeta = 0.85f; _maxSpeed = 50.0f; // terrain _ground = BodyFactory.CreateBody(World); { Vertices terrain = new Vertices(); terrain.Add(new Vector2(-20f, -5f)); terrain.Add(new Vector2(-20f, 0f)); terrain.Add(new Vector2(20f, 0f)); terrain.Add(new Vector2(25f, -0.25f)); terrain.Add(new Vector2(30f, -1f)); terrain.Add(new Vector2(35f, -4f)); terrain.Add(new Vector2(40f, 0f)); terrain.Add(new Vector2(45f, 0f)); terrain.Add(new Vector2(50f, 1f)); terrain.Add(new Vector2(55f, 2f)); terrain.Add(new Vector2(60f, 2f)); terrain.Add(new Vector2(65f, 1.25f)); terrain.Add(new Vector2(70f, 0f)); terrain.Add(new Vector2(75f, -0.3f)); terrain.Add(new Vector2(80f, -1.5f)); terrain.Add(new Vector2(85f, -3.5f)); terrain.Add(new Vector2(90f, 0f)); terrain.Add(new Vector2(95f, 0.5f)); terrain.Add(new Vector2(100f, 1f)); terrain.Add(new Vector2(105f, 2f)); terrain.Add(new Vector2(110f, 2.5f)); terrain.Add(new Vector2(115f, 1.3f)); terrain.Add(new Vector2(120f, 0f)); terrain.Add(new Vector2(160f, 0f)); terrain.Add(new Vector2(159f, 10f)); terrain.Add(new Vector2(201f, 10f)); terrain.Add(new Vector2(200f, 0f)); terrain.Add(new Vector2(240f, 0f)); terrain.Add(new Vector2(250f, -5f)); terrain.Add(new Vector2(250f, 10f)); terrain.Add(new Vector2(270f, 10f)); terrain.Add(new Vector2(270f, 0)); terrain.Add(new Vector2(310f, 0)); terrain.Add(new Vector2(310f, -5)); for (int i = 0; i < terrain.Count - 1; ++i) { FixtureFactory.AttachEdge(terrain[i], terrain[i + 1], _ground); } _ground.Friction = 0.6f; } // teeter board { _board = BodyFactory.CreateBody(World); _board.BodyType = BodyType.Dynamic; _board.Position = new Vector2(140.0f, -1.0f); PolygonShape box = new PolygonShape(1f); box.Vertices = PolygonUtils.CreateRectangle(10.0f, 0.25f); _teeter = new Sprite(ContentWrapper.TextureFromShape(box, "Stripe", ContentWrapper.Gold, ContentWrapper.Black, ContentWrapper.Black, 1f)); _board.CreateFixture(box); RevoluteJoint teeterAxis = JointFactory.CreateRevoluteJoint(World, _ground, _board, Vector2.Zero); teeterAxis.LowerLimit = -8.0f * MathConstants.Pi / 180.0f; teeterAxis.UpperLimit = 8.0f * MathConstants.Pi / 180.0f; teeterAxis.LimitEnabled = true; _board.ApplyAngularImpulse(-100.0f); } // bridge { _bridgeSegments = new List <Body>(); const int segmentCount = 20; PolygonShape shape = new PolygonShape(1f); shape.Vertices = PolygonUtils.CreateRectangle(1.0f, 0.125f); _bridge = new Sprite(ContentWrapper.TextureFromShape(shape, ContentWrapper.Gold, ContentWrapper.Black)); Body prevBody = _ground; for (int i = 0; i < segmentCount; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(161f + 2f * i, 0.125f); Fixture fix = body.CreateFixture(shape); fix.Friction = 0.6f; JointFactory.CreateRevoluteJoint(World, prevBody, body, -Vector2.UnitX); prevBody = body; _bridgeSegments.Add(body); } JointFactory.CreateRevoluteJoint(World, _ground, prevBody, Vector2.UnitX); } // boxes { _boxes = new List <Body>(); PolygonShape box = new PolygonShape(1f); box.Vertices = PolygonUtils.CreateRectangle(0.5f, 0.5f); _box = new Sprite(ContentWrapper.TextureFromShape(box, "Square", ContentWrapper.Sky, ContentWrapper.Sunset, ContentWrapper.Black, 1f)); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(220f, -0.5f); body.CreateFixture(box); _boxes.Add(body); body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(220f, -1.5f); body.CreateFixture(box); _boxes.Add(body); body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(220f, -2.5f); body.CreateFixture(box); _boxes.Add(body); } // car { Vertices vertices = new Vertices(8); vertices.Add(new Vector2(-2.5f, 0.08f)); vertices.Add(new Vector2(-2.375f, -0.46f)); vertices.Add(new Vector2(-0.58f, -0.92f)); vertices.Add(new Vector2(0.46f, -0.92f)); vertices.Add(new Vector2(2.5f, -0.17f)); vertices.Add(new Vector2(2.5f, 0.205f)); vertices.Add(new Vector2(2.3f, 0.33f)); vertices.Add(new Vector2(-2.25f, 0.35f)); PolygonShape chassis = new PolygonShape(vertices, 2f); _car = BodyFactory.CreateBody(World); _car.BodyType = BodyType.Dynamic; _car.Position = new Vector2(0.0f, -1.0f); _car.CreateFixture(chassis); _wheelBack = BodyFactory.CreateBody(World); _wheelBack.BodyType = BodyType.Dynamic; _wheelBack.Position = new Vector2(-1.709f, -0.78f); Fixture fix = _wheelBack.CreateFixture(new CircleShape(0.5f, 0.8f)); fix.Friction = 0.9f; _wheelFront = BodyFactory.CreateBody(World); _wheelFront.BodyType = BodyType.Dynamic; _wheelFront.Position = new Vector2(1.54f, -0.8f); _wheelFront.CreateFixture(new CircleShape(0.5f, 1f)); Vector2 axis = new Vector2(0.0f, -1.2f); _springBack = new WheelJoint(_car, _wheelBack, _wheelBack.Position, axis, true); _springBack.MotorSpeed = 0.0f; _springBack.MaxMotorTorque = 20.0f; _springBack.MotorEnabled = true; _springBack.Frequency = _hzBack; _springBack.DampingRatio = _zeta; World.AddJoint(_springBack); _springFront = new WheelJoint(_car, _wheelFront, _wheelFront.Position, axis, true); _springFront.MotorSpeed = 0.0f; _springFront.MaxMotorTorque = 10.0f; _springFront.MotorEnabled = false; _springFront.Frequency = _hzFront; _springFront.DampingRatio = _zeta; World.AddJoint(_springFront); // GFX _carBody = new Sprite(ContentWrapper.GetTexture("Car"), ContentWrapper.CalculateOrigin(_car)); _wheel = new Sprite(ContentWrapper.GetTexture("Wheel")); } Camera.MinRotation = -0.05f; Camera.MaxRotation = 0.05f; Camera.TrackingBody = _car; Camera.EnableTracking = true; }
private CarTest() { _speed = 50.0f; Body ground; { BodyDef bd = new BodyDef(); ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Friction = 0.6f; ground.AddFixture(fd); float[] hs = { 0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f }; float x = 20.0f, y1 = 0.0f, dx = 5.0f; for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.SetTwoSided(new Vector2(x, y1), new Vector2(x + dx, y2)); ground.AddFixture(fd); y1 = y2; x += dx; } for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.SetTwoSided(new Vector2(x, y1), new Vector2(x + dx, y2)); ground.AddFixture(fd); y1 = y2; x += dx; } shape.SetTwoSided(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); ground.AddFixture(fd); x += 80.0f; shape.SetTwoSided(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); ground.AddFixture(fd); x += 40.0f; shape.SetTwoSided(new Vector2(x, 0.0f), new Vector2(x + 10.0f, 5.0f)); ground.AddFixture(fd); x += 20.0f; shape.SetTwoSided(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); ground.AddFixture(fd); x += 40.0f; shape.SetTwoSided(new Vector2(x, 0.0f), new Vector2(x, 20.0f)); ground.AddFixture(fd); } // Teeter { BodyDef bd = new BodyDef(); bd.Position = new Vector2(140.0f, 1.0f); bd.Type = BodyType.Dynamic; Body body = BodyFactory.CreateFromDef(World, bd); PolygonShape box = new PolygonShape(1.0f); box.SetAsBox(10.0f, 0.25f); body.AddFixture(box); RevoluteJointDef jd = new RevoluteJointDef(); jd.Initialize(ground, body, body.Position); jd.LowerAngle = -8.0f * MathConstants.Pi / 180.0f; jd.UpperAngle = 8.0f * MathConstants.Pi / 180.0f; jd.EnableLimit = true; JointFactory.CreateFromDef(World, jd); body.ApplyAngularImpulse(100.0f); } //Bridge { int N = 20; PolygonShape shape = new PolygonShape(1.0f); shape.SetAsBox(1.0f, 0.125f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Friction = 0.6f; RevoluteJointDef jd = new RevoluteJointDef(); Body prevBody = ground; for (int i = 0; i < N; ++i) { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(161.0f + 2.0f * i, -0.125f); Body body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(fd); Vector2 anchor = new Vector2(160.0f + 2.0f * i, -0.125f); jd.Initialize(prevBody, body, anchor); JointFactory.CreateFromDef(World, jd); prevBody = body; } Vector2 anchor2 = new Vector2(160.0f + 2.0f * N, -0.125f); jd.Initialize(prevBody, ground, anchor2); JointFactory.CreateFromDef(World, jd); } // Boxes { PolygonShape box = new PolygonShape(0.5f); box.SetAsBox(0.5f, 0.5f); Body body; BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(230.0f, 0.5f); body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(box); bd.Position = new Vector2(230.0f, 1.5f); body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(box); bd.Position = new Vector2(230.0f, 2.5f); body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(box); bd.Position = new Vector2(230.0f, 3.5f); body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(box); bd.Position = new Vector2(230.0f, 4.5f); body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(box); } // Car { PolygonShape chassis = new PolygonShape(1.0f); Vertices vertices = new Vertices(6); vertices.Add(new Vector2(-1.5f, -0.5f)); vertices.Add(new Vector2(1.5f, -0.5f)); vertices.Add(new Vector2(1.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 0.9f)); vertices.Add(new Vector2(-1.15f, 0.9f)); vertices.Add(new Vector2(-1.5f, 0.2f)); chassis.Vertices = vertices; CircleShape circle = new CircleShape(0.4f, 1.0f); BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 1.0f); _car = BodyFactory.CreateFromDef(World, bd); _car.AddFixture(chassis); FixtureDef fd = new FixtureDef(); fd.Shape = circle; fd.Friction = 0.9f; bd.Position = new Vector2(-1.0f, 0.35f); _wheel1 = BodyFactory.CreateFromDef(World, bd); _wheel1.AddFixture(fd); bd.Position = new Vector2(1.0f, 0.4f); _wheel2 = BodyFactory.CreateFromDef(World, bd); _wheel2.AddFixture(fd); WheelJointDef jd = new WheelJointDef(); Vector2 axis = new Vector2(0.0f, 1.0f); float mass1 = _wheel1.Mass; float mass2 = _wheel2.Mass; float hertz = 4.0f; float dampingRatio = 0.7f; float omega = 2.0f * MathConstants.Pi * hertz; jd.Initialize(_car, _wheel1, _wheel1.Position, axis); jd.MotorSpeed = 0.0f; jd.MaxMotorTorque = 20.0f; jd.EnableMotor = true; jd.Stiffness = mass1 * omega * omega; jd.Damping = 2.0f * mass1 * dampingRatio * omega; jd.LowerTranslation = -0.25f; jd.UpperTranslation = 0.25f; jd.EnableLimit = true; _spring1 = (WheelJoint)JointFactory.CreateFromDef(World, jd); jd.Initialize(_car, _wheel2, _wheel2.Position, axis); jd.MotorSpeed = 0.0f; jd.MaxMotorTorque = 10.0f; jd.EnableMotor = false; jd.Stiffness = mass2 * omega * omega; jd.Damping = 2.0f * mass2 * dampingRatio * omega; jd.LowerTranslation = -0.25f; jd.UpperTranslation = 0.25f; jd.EnableLimit = true; _spring2 = (WheelJoint)JointFactory.CreateFromDef(World, jd); } }
private static void SerializeJoint(List <Body> bodies, Joint joint) { _writer.WriteStartElement("Joint"); _writer.WriteAttributeString("Type", joint.JointType.ToString()); WriteElement("BodyA", FindIndex(bodies, joint.BodyA)); WriteElement("BodyB", FindIndex(bodies, joint.BodyB)); WriteElement("CollideConnected", joint.CollideConnected); WriteElement("Breakpoint", joint.Breakpoint); if (joint.UserData != null) { _writer.WriteStartElement("UserData"); WriteDynamicType(joint.UserData.GetType(), joint.UserData); _writer.WriteEndElement(); } switch (joint.JointType) { case JointType.Distance: { DistanceJoint distanceJoint = (DistanceJoint)joint; WriteElement("DampingRatio", distanceJoint.DampingRatio); WriteElement("FrequencyHz", distanceJoint.Frequency); WriteElement("Length", distanceJoint.Length); WriteElement("LocalAnchorA", distanceJoint.LocalAnchorA); WriteElement("LocalAnchorB", distanceJoint.LocalAnchorB); } break; case JointType.Friction: { FrictionJoint frictionJoint = (FrictionJoint)joint; WriteElement("LocalAnchorA", frictionJoint.LocalAnchorA); WriteElement("LocalAnchorB", frictionJoint.LocalAnchorB); WriteElement("MaxForce", frictionJoint.MaxForce); WriteElement("MaxTorque", frictionJoint.MaxTorque); } break; case JointType.Gear: throw new Exception("Gear joint not supported by serialization"); case JointType.Wheel: { WheelJoint wheelJoint = (WheelJoint)joint; WriteElement("EnableMotor", wheelJoint.MotorEnabled); WriteElement("LocalAnchorA", wheelJoint.LocalAnchorA); WriteElement("LocalAnchorB", wheelJoint.LocalAnchorB); WriteElement("MotorSpeed", wheelJoint.MotorSpeed); WriteElement("DampingRatio", wheelJoint.DampingRatio); WriteElement("MaxMotorTorque", wheelJoint.MaxMotorTorque); WriteElement("FrequencyHz", wheelJoint.Frequency); WriteElement("Axis", wheelJoint.Axis); } break; case JointType.Prismatic: { //NOTE: Does not conform with Box2DScene PrismaticJoint prismaticJoint = (PrismaticJoint)joint; WriteElement("EnableLimit", prismaticJoint.LimitEnabled); WriteElement("EnableMotor", prismaticJoint.MotorEnabled); WriteElement("LocalAnchorA", prismaticJoint.LocalAnchorA); WriteElement("LocalAnchorB", prismaticJoint.LocalAnchorB); WriteElement("Axis", prismaticJoint.Axis); WriteElement("LowerTranslation", prismaticJoint.LowerLimit); WriteElement("UpperTranslation", prismaticJoint.UpperLimit); WriteElement("MaxMotorForce", prismaticJoint.MaxMotorForce); WriteElement("MotorSpeed", prismaticJoint.MotorSpeed); } break; case JointType.Pulley: { PulleyJoint pulleyJoint = (PulleyJoint)joint; WriteElement("WorldAnchorA", pulleyJoint.WorldAnchorA); WriteElement("WorldAnchorB", pulleyJoint.WorldAnchorB); WriteElement("LengthA", pulleyJoint.LengthA); WriteElement("LengthB", pulleyJoint.LengthB); WriteElement("LocalAnchorA", pulleyJoint.LocalAnchorA); WriteElement("LocalAnchorB", pulleyJoint.LocalAnchorB); WriteElement("Ratio", pulleyJoint.Ratio); WriteElement("Constant", pulleyJoint.Constant); } break; case JointType.Revolute: { RevoluteJoint revoluteJoint = (RevoluteJoint)joint; WriteElement("EnableLimit", revoluteJoint.LimitEnabled); WriteElement("EnableMotor", revoluteJoint.MotorEnabled); WriteElement("LocalAnchorA", revoluteJoint.LocalAnchorA); WriteElement("LocalAnchorB", revoluteJoint.LocalAnchorB); WriteElement("LowerAngle", revoluteJoint.LowerLimit); WriteElement("MaxMotorTorque", revoluteJoint.MaxMotorTorque); WriteElement("MotorSpeed", revoluteJoint.MotorSpeed); WriteElement("ReferenceAngle", revoluteJoint.ReferenceAngle); WriteElement("UpperAngle", revoluteJoint.UpperLimit); } break; case JointType.Weld: { WeldJoint weldJoint = (WeldJoint)joint; WriteElement("LocalAnchorA", weldJoint.LocalAnchorA); WriteElement("LocalAnchorB", weldJoint.LocalAnchorB); } break; // // Not part of Box2DScene // case JointType.Rope: { RopeJoint ropeJoint = (RopeJoint)joint; WriteElement("LocalAnchorA", ropeJoint.LocalAnchorA); WriteElement("LocalAnchorB", ropeJoint.LocalAnchorB); WriteElement("MaxLength", ropeJoint.MaxLength); } break; case JointType.Angle: { AngleJoint angleJoint = (AngleJoint)joint; WriteElement("BiasFactor", angleJoint.BiasFactor); WriteElement("MaxImpulse", angleJoint.MaxImpulse); WriteElement("Softness", angleJoint.Softness); WriteElement("TargetAngle", angleJoint.TargetAngle); } break; case JointType.Motor: { MotorJoint motorJoint = (MotorJoint)joint; WriteElement("AngularOffset", motorJoint.AngularOffset); WriteElement("LinearOffset", motorJoint.LinearOffset); WriteElement("MaxForce", motorJoint.MaxForce); WriteElement("MaxTorque", motorJoint.MaxTorque); WriteElement("CorrectionFactor", motorJoint.CorrectionFactor); } break; default: throw new Exception("Joint not supported"); } _writer.WriteEndElement(); }
public override void LoadContent() { base.LoadContent(); World.Gravity = new Vector2(0f, 10f); HasCursor = false; EnableCameraControl = true; HasVirtualStick = true; _hzFront = 8.5f; _hzBack = 5.0f; _zeta = 0.85f; _maxSpeed = 50.0f; #if WINDOWS_PHONE _scale = 2f / 3f; #else _scale = 1f; #endif // terrain _ground = new Body(World); { Vertices terrain = new Vertices(); terrain.Add(new Vector2(-20f, -5f)); terrain.Add(new Vector2(-20f, 0f)); terrain.Add(new Vector2(20f, 0f)); terrain.Add(new Vector2(25f, -0.25f)); terrain.Add(new Vector2(30f, -1f)); terrain.Add(new Vector2(35f, -4f)); terrain.Add(new Vector2(40f, 0f)); terrain.Add(new Vector2(45f, 0f)); terrain.Add(new Vector2(50f, 1f)); terrain.Add(new Vector2(55f, 2f)); terrain.Add(new Vector2(60f, 2f)); terrain.Add(new Vector2(65f, 1.25f)); terrain.Add(new Vector2(70f, 0f)); terrain.Add(new Vector2(75f, -0.3f)); terrain.Add(new Vector2(80f, -1.5f)); terrain.Add(new Vector2(85f, -3.5f)); terrain.Add(new Vector2(90f, 0f)); terrain.Add(new Vector2(95f, 0.5f)); terrain.Add(new Vector2(100f, 1f)); terrain.Add(new Vector2(105f, 2f)); terrain.Add(new Vector2(110f, 2.5f)); terrain.Add(new Vector2(115f, 1.3f)); terrain.Add(new Vector2(120f, 0f)); terrain.Add(new Vector2(160f, 0f)); terrain.Add(new Vector2(159f, 10f)); terrain.Add(new Vector2(201f, 10f)); terrain.Add(new Vector2(200f, 0f)); terrain.Add(new Vector2(240f, 0f)); terrain.Add(new Vector2(250f, -5f)); terrain.Add(new Vector2(250f, 10f)); terrain.Add(new Vector2(270f, 10f)); terrain.Add(new Vector2(270f, 0)); terrain.Add(new Vector2(310f, 0)); terrain.Add(new Vector2(310f, -5)); for (int i = 0; i < terrain.Count - 1; ++i) { FixtureFactory.AttachEdge(terrain[i], terrain[i + 1], _ground); } _ground.Friction = 0.6f; } // teeter board { _board = new Body(World); _board.BodyType = BodyType.Dynamic; _board.Position = new Vector2(140.0f, -1.0f); PolygonShape box = new PolygonShape(1f); box.SetAsBox(10.0f, 0.25f); _teeter = new Sprite(ScreenManager.Assets.TextureFromShape(box, MaterialType.Pavement, Color.LightGray, 1.2f)); _board.CreateFixture(box); RevoluteJoint teeterAxis = JointFactory.CreateRevoluteJoint(_ground, _board, Vector2.Zero); teeterAxis.LowerLimit = -8.0f * Settings.Pi / 180.0f; teeterAxis.UpperLimit = 8.0f * Settings.Pi / 180.0f; teeterAxis.LimitEnabled = true; World.AddJoint(teeterAxis); _board.ApplyAngularImpulse(-100.0f); } // bridge { _bridgeSegments = new List <Body>(); const int segmentCount = 20; PolygonShape shape = new PolygonShape(1f); shape.SetAsBox(1.0f, 0.125f); _bridge = new Sprite(ScreenManager.Assets.TextureFromShape(shape, MaterialType.Dots, Color.SandyBrown, 1f)); Body prevBody = _ground; for (int i = 0; i < segmentCount; ++i) { Body body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(161f + 2f * i, 0.125f); Fixture fix = body.CreateFixture(shape); fix.Friction = 0.6f; JointFactory.CreateRevoluteJoint(World, prevBody, body, -Vector2.UnitX); prevBody = body; _bridgeSegments.Add(body); } JointFactory.CreateRevoluteJoint(World, _ground, prevBody, Vector2.UnitX); } // boxes { _boxes = new List <Body>(); PolygonShape box = new PolygonShape(1f); box.SetAsBox(0.5f, 0.5f); _box = new Sprite(ScreenManager.Assets.TextureFromShape(box, MaterialType.Squares, Color.SaddleBrown, 2f)); Body body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(220f, -0.5f); body.CreateFixture(box); _boxes.Add(body); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(220f, -1.5f); body.CreateFixture(box); _boxes.Add(body); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(220f, -2.5f); body.CreateFixture(box); _boxes.Add(body); } // car { Vertices vertices = new Vertices(8); vertices.Add(new Vector2(-2.5f, 0.08f)); vertices.Add(new Vector2(-2.375f, -0.46f)); vertices.Add(new Vector2(-0.58f, -0.92f)); vertices.Add(new Vector2(0.46f, -0.92f)); vertices.Add(new Vector2(2.5f, -0.17f)); vertices.Add(new Vector2(2.5f, 0.205f)); vertices.Add(new Vector2(2.3f, 0.33f)); vertices.Add(new Vector2(-2.25f, 0.35f)); PolygonShape chassis = new PolygonShape(vertices, 2f); _car = new Body(World); _car.BodyType = BodyType.Dynamic; _car.Position = new Vector2(0.0f, -1.0f); _car.CreateFixture(chassis); _wheelBack = new Body(World); _wheelBack.BodyType = BodyType.Dynamic; _wheelBack.Position = new Vector2(-1.709f, -0.78f); Fixture fix = _wheelBack.CreateFixture(new CircleShape(0.5f, 0.8f)); fix.Friction = 0.9f; _wheelFront = new Body(World); _wheelFront.BodyType = BodyType.Dynamic; _wheelFront.Position = new Vector2(1.54f, -0.8f); _wheelFront.CreateFixture(new CircleShape(0.5f, 1f)); Vector2 axis = new Vector2(0.0f, -1.2f); _springBack = new WheelJoint(_car, _wheelBack, _wheelBack.Position, axis); _springBack.MotorSpeed = 0.0f; _springBack.MaxMotorTorque = 20.0f; _springBack.MotorEnabled = true; //_springBack.Frequency = _hzBack; //_springBack.DampingRatio = _zeta; World.AddJoint(_springBack); _springFront = new WheelJoint(_car, _wheelFront, _wheelFront.Position, axis); _springFront.MotorSpeed = 0.0f; _springFront.MaxMotorTorque = 10.0f; _springFront.MotorEnabled = false; //_springFront.Frequency = _hzFront; //_springFront.DampingRatio = _zeta; World.AddJoint(_springFront); _carBody = new Sprite(ScreenManager.Content.Load <Texture2D>("Samples/car"), AssetCreator.CalculateOrigin(_car) / _scale); _wheel = new Sprite(ScreenManager.Content.Load <Texture2D>("Samples/wheel")); } Camera.MinRotation = -0.05f; Camera.MaxRotation = 0.05f; Camera.TrackingBody = _car; Camera.EnableTracking = true; }
/// <summary> /// Loads bodies, fixtures, and joints of the specified R.U.B.E. JSON export file to the provided world. A common usage is loading the bodies into /// a temporary world object and then plucking those items you're interested in out of that world and deep cloning them into another world. /// </summary> /// <param name="fileName">File path of the input JSON, e.g. "data/myRubeWorld.json"</param> /// <param name="world">The world to load the bodies, fixtures, and joints into.</param> public static void Load(string fileName, World world) { // load the R.U.B.E. file using ( var reader = new StreamReader(fileName)) { string json = reader.ReadToEnd(); // JSON clean-up... // NOTE: this list is certainly not complete, so it should be added to as other issues are discovered. json = json.Replace("massData-", "massData"); json = json.Replace("filter-", "filter"); json = json.Replace(@"""anchorB"" : 0", @"""anchorB"" : { ""x"":0, ""y"":0 }"); json = json.Replace(@"""center"" : 0", @"""center"" : { ""x"":0, ""y"":0 }"); json = json.Replace(@"""linearVelocity"" : 0", @"""linearVelocity"" : { ""x"":0, ""y"":0 }"); var rubeData = JsonConvert.DeserializeObject <RubeRootObject>(json); // Key = order loaded by var loadedBodies = new Dictionary <int, Body>(); for (var rubeBodyIndex = 0; rubeBodyIndex < rubeData.body.Count; rubeBodyIndex++) { var rubeBody = rubeData.body[rubeBodyIndex]; var body = new Body(); if (rubeBody.fixture != null) { foreach (var rubeFixture in rubeBody.fixture) { Fixture f = null; if (rubeFixture.polygon != null) { var vertices = new Vertices(); for (int i = 0; i < rubeFixture.polygon.vertices.x.Count; i++) { var x = rubeFixture.polygon.vertices.x[i]; var y = rubeFixture.polygon.vertices.y[i]; vertices.Add(new Vector2(x, y)); } f = body.CreatePolygon(vertices, rubeFixture.density); } else if (rubeFixture.circle != null) { f = body.CreateCircle( rubeFixture.circle.radius, rubeFixture.density, rubeFixture.circle.center.ToVector2()); } else { //throw new InvalidDataException(); continue; } f.Restitution = rubeFixture.restitution; f.Friction = rubeFixture.friction; } } body.Rotation = rubeBody.angle; body.AngularVelocity = rubeBody.angularVelocity; body.Awake = rubeBody.awake; body.LinearVelocity = Vector2.Zero; body.Position = new Vector2(rubeBody.position.x, rubeBody.position.y); body.BodyType = (BodyType)rubeBody.type; body.Tag = rubeBodyIndex; // reset mass data // NOTE: this probably isn't needed, but it shouldn't hurt anything body.ResetMassData(); body.ResetDynamics(); // add to world world.Add(body); // add to load array loadedBodies.Add(rubeBodyIndex, body); } if (rubeData.joint != null) { foreach (var rubeJoint in rubeData.joint) { var bodyA = loadedBodies[rubeJoint.bodyA]; var bodyB = loadedBodies[rubeJoint.bodyB]; var anchorA = new Vector2(rubeJoint.anchorA.x, rubeJoint.anchorA.y); var anchorB = new Vector2(rubeJoint.anchorB.x, rubeJoint.anchorB.y); Joint joint = null; switch (rubeJoint.type) { case "prismatic": var prisJoint = new PrismaticJoint( bodyA, bodyB, anchorA, anchorB, rubeJoint.localAxisA.ToVector2()); prisJoint.LowerLimit = rubeJoint.lowerLimit.Value; prisJoint.UpperLimit = rubeJoint.upperLimit.Value; prisJoint.LimitEnabled = rubeJoint.enableLimit.Value; joint = prisJoint; break; case "distance": DistanceJoint distJoint = new DistanceJoint( bodyA, bodyB, anchorA, anchorB); joint = distJoint; break; case "revolute": var revJoint = new RevoluteJoint( bodyA, bodyB, anchorA, anchorB ); revJoint.MotorSpeed = rubeJoint.motorSpeed.Value; revJoint.MaxMotorTorque = rubeJoint.maxMotorTorque.Value; revJoint.MotorEnabled = rubeJoint.enableMotor.Value; revJoint.LowerLimit = rubeJoint.lowerLimit.Value; revJoint.UpperLimit = rubeJoint.upperLimit.Value; revJoint.LimitEnabled = rubeJoint.enableLimit.Value; revJoint.CollideConnected = false; joint = revJoint; break; case "wheel": // TODO: There's a bug in this wheel joint. Don't have time to fix at the moment. var wheelJoint = new WheelJoint( bodyA, bodyB, bodyB.Position, rubeJoint.localAxisA.ToVector2(), true ); wheelJoint.MotorSpeed = rubeJoint.motorSpeed.Value; wheelJoint.MaxMotorTorque = rubeJoint.maxMotorTorque.Value; wheelJoint.MotorEnabled = rubeJoint.enableMotor.Value; wheelJoint.Frequency = rubeJoint.frequency; wheelJoint.DampingRatio = rubeJoint.dampingRatio; joint = wheelJoint; break; default: throw new InvalidDataException(); } // TODO: set all base joint properties here... if (joint != null) { // add it! world.Add(joint); } } } } }