/// <summary> /// Creates a revolute joint and adds it to the world /// </summary> /// <param name="world"></param> /// <param name="bodyA"></param> /// <param name="bodyB"></param> /// <param name="anchorB"></param> /// <returns></returns> public static RevoluteJoint CreateRevoluteJoint(World world, Body bodyA, Body bodyB, Vector2 anchorB) { Vector2 localanchorA = bodyA.GetLocalPoint(bodyB.GetWorldPoint(anchorB)); RevoluteJoint joint = new RevoluteJoint(bodyA, bodyB, localanchorA, anchorB); world.AddJoint(joint); return joint; }
public override void HandleInput() { InputHelper input = game.inputManager.inputHelper; if (input.IsNewButtonPress(MouseButtons.LeftButton)) { Vector2 position = ProjectionHelper.PixelToFarseer(input.MousePosition); List<Fixture> list = game.farseerManager.world.TestPointAll(position); if (list.Count > 0) { if (startBody == null) { startBody = list[0].Body; startBodyLocal = startBody.GetLocalPoint(position); } else { Body endBody = list[0].Body; Vector2 endBodyLocal = endBody.GetLocalPoint(position); RopeJoint j = new RopeJoint(startBody, endBody, startBodyLocal, endBodyLocal); j.CollideConnected = true; game.farseerManager.world.AddJoint(j); FormManager.Property.setSelectedObject(j); startBody = null; } } } }
/// Initialize the bodies, anchors, lengths, max lengths, and ratio using the world anchors. public void Initialize(Body body1, Body body2, Vector2 groundAnchor1, Vector2 groundAnchor2, Vector2 anchor1, Vector2 anchor2, float ratio) { Body1 = body1; Body2 = body2; GroundAnchor1 = groundAnchor1; GroundAnchor2 = groundAnchor2; LocalAnchor1 = body1.GetLocalPoint(anchor1); LocalAnchor2 = body2.GetLocalPoint(anchor2); Vector2 d1 = anchor1 - groundAnchor1; Length1 = d1.Length(); Vector2 d2 = anchor2 - groundAnchor2; Length2 = d2.Length(); Ratio = ratio; //Box2DXDebug.Assert(ratio > Settings.FLT_EPSILON); float C = Length1 + ratio * Length2; MaxLength1 = C - ratio * PulleyJoint.MinPulleyLength; MaxLength2 = (C - PulleyJoint.MinPulleyLength) / ratio; }
private BodyTypesTest() { //Ground BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); // Define attachment { _attachment = BodyFactory.CreateBody(World); _attachment.BodyType = BodyType.Dynamic; _attachment.Position = new Vector2(0.0f, 3.0f); Vertices box = PolygonTools.CreateRectangle(0.5f, 2.0f); PolygonShape shape = new PolygonShape(box, 2); _attachment.CreateFixture(shape); } // Define platform { _platform = BodyFactory.CreateBody(World); _platform.BodyType = BodyType.Dynamic; _platform.Position = new Vector2(0.0f, 5.0f); Vertices box = PolygonTools.CreateRectangle(4.0f, 0.5f); PolygonShape shape = new PolygonShape(box, 2); Fixture fixture = _platform.CreateFixture(shape); fixture.Friction = 0.6f; RevoluteJoint rjd = new RevoluteJoint(_attachment, _platform, _attachment.GetLocalPoint(_platform.Position), Vector2.Zero); rjd.MaxMotorTorque = 50.0f; rjd.MotorEnabled = true; World.AddJoint(rjd); //FixedPrismaticJoint pjd = new FixedPrismaticJoint(_platform, new Vector2(0.0f, 5.0f), // new Vector2(1.0f, 0.0f)); //pjd.MaxMotorForce = 1000.0f; //pjd.MotorEnabled = true; //pjd.LowerLimit = -10.0f; //pjd.UpperLimit = 10.0f; //pjd.LimitEnabled = true; //World.AddJoint(pjd); _speed = 3.0f; } // Create a payload { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(0.0f, 8.0f); Vertices box = PolygonTools.CreateRectangle(0.75f, 0.75f); PolygonShape shape = new PolygonShape(box, 2); Fixture fixture = body.CreateFixture(shape); fixture.Friction = 0.6f; } }
private BridgeTest() { Body ground; { ground = new Body(World); PolygonShape shape = new PolygonShape(0); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(0.5f, 0.125f); PolygonShape shape = new PolygonShape(box, 20); Body prevBody = ground; for (int i = 0; i < Count; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-14.5f + 1.0f*i, 5.0f); Fixture fixture = body.CreateFixture(shape); fixture.Friction = 0.2f; Vector2 anchor = new Vector2(-0.5f, 0.0f); RevoluteJoint jd = new RevoluteJoint(prevBody, body, prevBody.GetLocalPoint(body.GetWorldPoint(anchor)), anchor); World.AddJoint(jd); prevBody = body; } Vector2 anchor2 = new Vector2(0.5f, 0.0f); RevoluteJoint jd2 = new RevoluteJoint(ground, prevBody, ground.GetLocalPoint(prevBody.GetWorldPoint(anchor2)), anchor2); World.AddJoint(jd2); } Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-0.5f, 0.0f)); vertices.Add(new Vector2(0.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 1.5f)); for (int i = 0; i < 2; ++i) { PolygonShape shape = new PolygonShape(vertices, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-8.0f + 8.0f*i, 12.0f); body.CreateFixture(shape); } for (int i = 0; i < 3; ++i) { CircleShape shape = new CircleShape(0.5f, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-6.0f + 6.0f*i, 10.0f); body.CreateFixture(shape); } }
private void CreateChassis(World world, Vector2 pivot, AssetCreator assets) { { PolygonShape shape = new PolygonShape(1f); shape.Vertices = PolygonTools.CreateRectangle(2.5f, 1.0f); _body = new Sprite(assets.TextureFromShape(shape, MaterialType.Blank, Color.Beige, 1f)); _chassis = BodyFactory.CreateBody(world); _chassis.BodyType = BodyType.Dynamic; _chassis.Position = pivot + _position; Fixture fixture = _chassis.CreateFixture(shape); fixture.CollisionGroup = -1; } { CircleShape shape = new CircleShape(1.6f, 1f); _engine = new Sprite(assets.TextureFromShape(shape, MaterialType.Waves, Color.Beige * 0.8f, 1f)); _wheel = BodyFactory.CreateBody(world); _wheel.BodyType = BodyType.Dynamic; _wheel.Position = pivot + _position; Fixture fixture = _wheel.CreateFixture(shape); fixture.CollisionGroup = -1; } { _motorJoint = new RevoluteJoint(_wheel, _chassis, _wheel.GetLocalPoint(_chassis.Position), Vector2.Zero); _motorJoint.CollideConnected = false; _motorJoint.MotorSpeed = _motorSpeed; _motorJoint.MaxMotorTorque = 400f; _motorJoint.MotorEnabled = true; world.AddJoint(_motorJoint); } }
/// <summary> /// Creates a weld joint /// </summary> /// <param name="bodyA"></param> /// <param name="bodyB"></param> /// <param name="localAnchor"></param> /// <returns></returns> public static WeldJoint CreateWeldJoint(Body bodyA, Body bodyB, Vector2 localAnchor) { WeldJoint joint = new WeldJoint(bodyA, bodyB, bodyA.GetLocalPoint(localAnchor), bodyB.GetLocalPoint(localAnchor)); return joint; }
/// <summary> /// Creates a revolute joint. /// </summary> /// <param name="bodyA"></param> /// <param name="bodyB"></param> /// <param name="localAnchorB">The anchor of bodyB in local coordinates</param> /// <returns></returns> public static RevoluteJoint CreateRevoluteJoint(Body bodyA, Body bodyB, Vector2 localAnchorB) { Vector2 localanchorA = bodyA.GetLocalPoint(bodyB.GetWorldPoint(localAnchorB)); RevoluteJoint joint = new RevoluteJoint(bodyA, bodyB, localanchorA, localAnchorB); return joint; }
/// <summary> /// Creates a prsimatic joint /// </summary> /// <param name="bodyA"></param> /// <param name="bodyB"></param> /// <param name="localanchorB"></param> /// <param name="axis"></param> /// <returns></returns> public static PrismaticJoint CreatePrismaticJoint(Body bodyA, Body bodyB, Vector2 localanchorB, Vector2 axis) { Vector2 localanchorA = bodyA.GetLocalPoint(bodyB.GetWorldPoint(localanchorB)); PrismaticJoint joint = new PrismaticJoint(bodyA, bodyB, localanchorA, localanchorB, axis); return joint; }
public TheoJansenWalker(World world, PhysicsGameScreen screen, Vector2 position) { _position = position; _motorSpeed = 2.0f; _motorOn = true; _screen = screen; _walkerJoints = new List<DistanceJoint>(); _leftShoulders = new Body[3]; _rightShoulders = new Body[3]; _leftLegs = new Body[3]; _rightLegs = new Body[3]; Vector2 pivot = new Vector2(0f, -0.8f); // Chassis { PolygonShape shape = new PolygonShape(1f); shape.SetAsBox(2.5f, 1.0f); _body = new Sprite(_screen.ScreenManager.Assets.TextureFromShape(shape, MaterialType.Blank, Color.Beige, 1f)); _chassis = BodyFactory.CreateBody(world); _chassis.BodyType = BodyType.Dynamic; _chassis.Position = pivot + _position; Fixture fixture = _chassis.CreateFixture(shape); fixture.CollisionGroup = -1; } { CircleShape shape = new CircleShape(1.6f, 1f); _engine = new Sprite(_screen.ScreenManager.Assets.TextureFromShape(shape, MaterialType.Waves, Color.Beige * 0.8f, 1f)); _wheel = BodyFactory.CreateBody(world); _wheel.BodyType = BodyType.Dynamic; _wheel.Position = pivot + _position; Fixture fixture = _wheel.CreateFixture(shape); fixture.CollisionGroup = -1; } { _motorJoint = new RevoluteJoint(_wheel, _chassis, _wheel.GetLocalPoint(_chassis.Position), Vector2.Zero); _motorJoint.CollideConnected = false; _motorJoint.MotorSpeed = _motorSpeed; _motorJoint.MaxMotorTorque = 400f; _motorJoint.MotorEnabled = _motorOn; world.AddJoint(_motorJoint); } Vector2 wheelAnchor = pivot + new Vector2(0f, 0.8f); CreateLegTextures(); CreateLeg(world, -1f, wheelAnchor, 0); CreateLeg(world, 1f, wheelAnchor, 0); _leftLeg.Origin = AssetCreator.CalculateOrigin(_leftLegs[0]); _leftShoulder.Origin = AssetCreator.CalculateOrigin(_leftShoulders[0]); _rightLeg.Origin = AssetCreator.CalculateOrigin(_rightLegs[0]); _rightShoulder.Origin = AssetCreator.CalculateOrigin(_rightShoulders[0]); _wheel.SetTransform(_wheel.Position, 120f * Settings.Pi / 180f); CreateLeg(world, -1f, wheelAnchor, 1); CreateLeg(world, 1f, wheelAnchor, 1); _wheel.SetTransform(_wheel.Position, -120f * Settings.Pi / 180f); CreateLeg(world, -1f, wheelAnchor, 2); CreateLeg(world, 1f, wheelAnchor, 2); }
/// <summary> /// Creates a weld joint /// </summary> /// <param name="world"></param> /// <param name="bodyA"></param> /// <param name="bodyB"></param> /// <param name="localanchorB"></param> /// <returns></returns> public static WeldJoint CreateWeldJoint(Body bodyA, Body bodyB, Vector2 localanchorB) { Vector2 localanchorA = bodyA.GetLocalPoint(bodyB.GetWorldPoint(localanchorB)); WeldJoint joint = new WeldJoint(bodyA, bodyB, localanchorA, localanchorB); return joint; }
private TheoJansenTest() { _offset = new Vector2(0.0f, 8.0f); _motorSpeed = 2.0f; _motorOn = true; Vector2 pivot = new Vector2(0.0f, 0.8f); // Ground { Body ground = BodyFactory.CreateBody(World); EdgeShape shape = new EdgeShape(new Vector2(-50.0f, 0.0f), new Vector2(50.0f, 0.0f)); ground.CreateFixture(shape); shape = new EdgeShape(new Vector2(-50.0f, 0.0f), new Vector2(-50.0f, 10.0f)); ground.CreateFixture(shape); shape = new EdgeShape(new Vector2(50.0f, 0.0f), new Vector2(50.0f, 10.0f)); ground.CreateFixture(shape); } // Balls for (int i = 0; i < 40; ++i) { CircleShape shape = new CircleShape(0.25f, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-40.0f + 2.0f * i, 0.5f); body.CreateFixture(shape); } // Chassis { PolygonShape shape = new PolygonShape(1); shape.SetAsBox(2.5f, 1.0f); _chassis = BodyFactory.CreateBody(World); _chassis.BodyType = BodyType.Dynamic; _chassis.Position = pivot + _offset; Fixture fixture = _chassis.CreateFixture(shape); fixture.CollisionGroup = -1; } { CircleShape shape = new CircleShape(1.6f, 1); _wheel = BodyFactory.CreateBody(World); _wheel.BodyType = BodyType.Dynamic; _wheel.Position = pivot + _offset; Fixture fixture = _wheel.CreateFixture(shape); fixture.CollisionGroup = -1; } { //_motorJoint = new RevoluteJoint(_wheel, _chassis, pivot + _offset); _motorJoint = new RevoluteJoint(_wheel, _chassis, _wheel.GetLocalPoint(_chassis.Position), Vector2.Zero); _motorJoint.CollideConnected = false; _motorJoint.MotorSpeed = _motorSpeed; _motorJoint.MaxMotorTorque = 400.0f; _motorJoint.MotorEnabled = _motorOn; World.AddJoint(_motorJoint); } Vector2 wheelAnchor = pivot + new Vector2(0.0f, -0.8f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.Position, 120.0f * Settings.Pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.Position, -120.0f * Settings.Pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); }
public override void Start() { base.Start(); CircleShape circ; PolygonShape box; Fixture fixture; RevoluteJoint joint; // Add 2 ragdolls along the top for(int i = 0; i < 2; i++) { float startX = 70f + Random.value * 20f + 480f * (float)i; float startY = (20f + Random.value * 50f) * -1f; // Head Body head = new Body(FSWorldComponent.PhysicsWorld); circ = new CircleShape(12.5f / physScale, 1f); fixture = new Fixture(head, circ); fixture.Friction = 0.4f; fixture.Restitution = 0.3f; head.Position = new FVector2(startX / physScale, startY / physScale); head.ApplyLinearImpulse(new FVector2(Random.value * 100f - 50f, Random.value * 100f - 50f), head.Position); head.BodyType = BodyType.Dynamic; // Torso 1 Body torso1 = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(15f / physScale, 10f / physScale); fixture = new Fixture(torso1, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; torso1.Position = new FVector2(startX / physScale, (startY - 28f) / physScale); torso1.BodyType = BodyType.Dynamic; // Torso 2 Body torso2 = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(15f / physScale, 10f / physScale); fixture = new Fixture(torso2, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; torso2.Position = new FVector2(startX / physScale, (startY - 43f) / physScale); torso2.BodyType = BodyType.Dynamic; // Torso 3 Body torso3 = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(15f / physScale, 10f / physScale); fixture = new Fixture(torso3, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; torso3.Position = new FVector2(startX / physScale, (startY - 58f) / physScale); torso3.BodyType = BodyType.Dynamic; // UpperArm // L Body upperArmL = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(18f / physScale, 6.5f / physScale); fixture = new Fixture(upperArmL, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; upperArmL.Position = new FVector2((startX - 30f) / physScale, (startY - 20f) / physScale); upperArmL.BodyType = BodyType.Dynamic; // R Body upperArmR = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(18f / physScale, 6.5f / physScale); fixture = new Fixture(upperArmR, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; upperArmR.Position = new FVector2((startX + 30f) / physScale, (startY - 20f) / physScale); upperArmR.BodyType = BodyType.Dynamic; // LowerArm // L Body lowerArmL = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(17f / physScale, 6f / physScale); fixture = new Fixture(lowerArmL, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; lowerArmL.Position = new FVector2((startX - 57f) / physScale, (startY - 20f) / physScale); lowerArmL.BodyType = BodyType.Dynamic; // R Body lowerArmR = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(17f / physScale, 6f / physScale); fixture = new Fixture(lowerArmR, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; lowerArmR.Position = new FVector2((startX + 57f) / physScale, (startY - 20f) / physScale); lowerArmR.BodyType = BodyType.Dynamic; // UpperLeg // L Body upperLegL = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(7.5f / physScale, 22f / physScale); fixture = new Fixture(upperLegL, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; upperLegL.Position = new FVector2((startX - 8f) / physScale, (startY - 85f) / physScale); upperLegL.BodyType = BodyType.Dynamic; // R Body upperLegR = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(7.5f / physScale, 22f / physScale); fixture = new Fixture(upperLegR, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; upperLegR.Position = new FVector2((startX + 8f) / physScale, (startY - 85f) / physScale); upperLegR.BodyType = BodyType.Dynamic; // LowerLeg // L Body lowerLegL = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(7.5f / physScale, 22f / physScale); fixture = new Fixture(lowerLegL, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; lowerLegL.Position = new FVector2((startX - 8f) / physScale, (startY - 120f) / physScale); lowerLegL.BodyType = BodyType.Dynamic; // R Body lowerLegR = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(7.5f / physScale, 22f / physScale); fixture = new Fixture(lowerLegR, box); fixture.Friction = 0.4f; fixture.Restitution = 0.1f; lowerLegR.Position = new FVector2((startX + 8f) / physScale, (startY - 120f) / physScale); lowerLegR.BodyType = BodyType.Dynamic; // JOINTS // Head to shoulders joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, torso1, head, head.GetLocalPoint(new FVector2(startX / physScale, (startY - 15f) / physScale))); joint.LowerLimit = -40f * Mathf.Deg2Rad; joint.UpperLimit = 40f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // Upper arm to shoulders // L joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, torso1, upperArmL, upperArmL.GetLocalPoint(new FVector2((startX - 18f) / physScale, (startY - 20f) / physScale))); joint.LowerLimit = -85f * Mathf.Deg2Rad; joint.UpperLimit = 130f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // R joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, torso1, upperArmR, upperArmR.GetLocalPoint(new FVector2((startX + 18f) / physScale, (startY - 20f) / physScale))); joint.LowerLimit = -130f * Mathf.Deg2Rad; joint.UpperLimit = 85f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // Lower arm to upper arm // L joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, upperArmL, lowerArmL, lowerArmL.GetLocalPoint(new FVector2((startX - 45f) / physScale, (startY - 20f) / physScale))); joint.LowerLimit = -130f * Mathf.Deg2Rad; joint.UpperLimit = 10f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // R joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, upperArmR, lowerArmR, lowerArmR.GetLocalPoint(new FVector2((startX + 45f) / physScale, (startY - 20f) / physScale))); joint.LowerLimit = -10f * Mathf.Deg2Rad; joint.UpperLimit = 130f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // Shoulders/stomach joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, torso1, torso2, torso2.GetLocalPoint(new FVector2((startX + 0f) / physScale, (startY - 35f) / physScale))); joint.LowerLimit = -15f * Mathf.Deg2Rad; joint.UpperLimit = 15f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // Stomach/hips joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, torso2, torso3, torso3.GetLocalPoint(new FVector2((startX + 0f) / physScale, (startY - 50f) / physScale))); joint.LowerLimit = -15f * Mathf.Deg2Rad; joint.UpperLimit = 15f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // Torso to upper leg // L joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, torso3, upperLegL, upperLegL.GetLocalPoint(new FVector2((startX - 8f) / physScale, (startY - 72f) / physScale))); joint.LowerLimit = -25f * Mathf.Deg2Rad; joint.UpperLimit = 45f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // R joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, torso3, upperLegR, upperLegR.GetLocalPoint(new FVector2((startX + 8f) / physScale, (startY - 72f) / physScale))); joint.LowerLimit = -45f * Mathf.Deg2Rad; joint.UpperLimit = 25f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // Upper leg to lower leg // L joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, upperLegL, lowerLegL, lowerLegL.GetLocalPoint(new FVector2((startX - 8f) / physScale, (startY - 105f) / physScale))); joint.LowerLimit = -25f * Mathf.Deg2Rad; joint.UpperLimit = 115f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; // R joint = JointFactory.CreateRevoluteJoint(FSWorldComponent.PhysicsWorld, upperLegR, lowerLegR, lowerLegR.GetLocalPoint(new FVector2((startX + 8f) / physScale, (startY - 105f) / physScale))); joint.LowerLimit = -115f * Mathf.Deg2Rad; joint.UpperLimit = 25f * Mathf.Deg2Rad; joint.LimitEnabled = true; joint.CollideConnected = false; } // Add stairs on the left, these are static bodies so set the type accordingly for(int j = 1; j <= 10; j++) { Body body = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox((10f * (float)j) / physScale, 10f / physScale); fixture = new Fixture(body, box); body.Position = new FVector2((10f * (float)j) / physScale, ((150f + 20f * (float)j) / physScale) * -1f); } // Add stairs on the right for(int k = 1; k <= 10; k++) { Body body = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox((10f * (float)k) / physScale, 10f / physScale); fixture = new Fixture(body, box); body.Position = new FVector2((640f - 10f * (float)k) / physScale, ((150f + 20f * (float)k) / physScale) * -1f); } Body ground = new Body(FSWorldComponent.PhysicsWorld); box = new PolygonShape(1f); box.SetAsBox(30f / physScale, 40f / physScale); fixture = new Fixture(ground, box); ground.Position = new FVector2(320f / physScale, (320f / physScale) * -1f); }
RevoluteJoint EasyRevoluteJoint(Body bodyA, Body bodyB, Vector2 worldPos) { return new RevoluteJoint(bodyA, bodyB, bodyA.GetLocalPoint(ref worldPos), bodyB.GetLocalPoint(ref worldPos)); }