Пример #1
0
        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);
        }
Пример #2
0
    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;


        //
    }
Пример #3
0
        /// <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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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;
        }
Пример #8
0
        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);
            }
        }
Пример #9
0
        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);
            }
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
            }
        }
Пример #12
0
        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);
            }
        }
Пример #13
0
        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);
            }
        }
Пример #14
0
        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();
        }
Пример #15
0
        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
        }
Пример #16
0
        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;
        }
Пример #17
0
        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;
        }
Пример #18
0
        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);
            }
        }
Пример #19
0
        //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);
        }
Пример #20
0
        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;
        }
Пример #21
0
        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);
            }
        }
Пример #22
0
        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;
        }
Пример #24
0
        /// <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);
                        }
                    }
                }
            }
        }