Example #1
0
        public void join(int targetID, string type)
        {
            if (game.game_objects[targetID] is PhysicsObject)
            {
                PhysicsObject target = (PhysicsObject)game.game_objects[targetID];

                switch (type)
                {
                case "weld":
                    WeldJointDef def = new WeldJointDef();
                    def.bodyA = body;
                    def.bodyB = target.body;

                    def.localAnchorA = body.GetPosition() - target.body.GetPosition();
                    def.localAnchorB = target.body.GetPosition() - body.GetPosition();

                    def.collideConnected = false;
                    game.world.CreateJoint(def);
                    break;

                case "revolute":
                    RevoluteJointDef rdef = new RevoluteJointDef();

                    rdef.Initialize(body, target.body, body.GetWorldCenter());

                    rdef.collideConnected = false;
                    game.world.CreateJoint(rdef);

                    break;
                }
            }
        }
Example #2
0
    // Use this for initialization
    protected override IntPtr Init()
    {
        WeldJointDef jd = new WeldJointDef(other.body, body.body);

        jd.Initialize(other.body, body.body, anchor);
        jd.frequencyHz  = frequencyHz;
        jd.dampingRatio = dampingRatio;
        return(API.CreateWeldJoint(B2DWorld.instance.world, jd));
    }
Example #3
0
        /// <summary>
        /// Creates a distance joint between two bodies
        /// </summary>
        /// <param name="b1"></param>
        /// <param name="b2"></param>
        /// <param name="anchor"></param>
        /// <returns></returns>
        public WeldJoint joinBodies_Weld(Body b1, Body b2, Vector2 anchor, bool collideCon)
        {
            WeldJointDef wjd = new WeldJointDef();

            wjd.Initialize(b1, b2, anchor);
            wjd.collideConnected = collideCon;
            WeldJoint wj = physicsWorld.CreateJoint(wjd) as WeldJoint;

            return(wj);
        }
Example #4
0
        public WeldJoint(WeldJointDef def)
            : base(def)
        {
            _localAnchorA   = def.LocalAnchorA;
            _localAnchorB   = def.LocalAnchorB;
            _referenceAngle = def.ReferenceAngle;
            _stiffness      = def.Stiffness;
            _damping        = def.Damping;

            _impulse = Vector3.Zero;
        }
Example #5
0
        /// <summary>
        /// Creates a new motorcycle and a driver into the given Box2D world.
        /// Creates all the parts of the motorcycle and driver and joints them together.
        /// </summary>
        /// <param name="pBikeSpeed">A pointer to the variable that describes the speed of the
        ///                          motorcycle</param>
        /// <param name="pRotationData">RotationData to provide the information of the rotation
        ///                             of the device</param>
        /// <param name="pWorld">The Box2D world where the bike is created into</param>
        /// <param name="pCamPos">A pointer to the variable that describes the position of the
        ///                       camera</param>
        /// <param name="pContent">The used ContentManager instance</param>
        /// <param name="pSpriteBatch">The used SpriteBatch instance</param>
        public Bike(float [] pBikeSpeed, RotationData pRotationData, World pWorld, float[] pCamPos,
                    ContentManager pContent)
        {
            OffTheBike   = false;
            camPos       = pCamPos;
            world        = pWorld;
            content      = pContent;
            RotationData = pRotationData;

            bikeSpeed = pBikeSpeed;

            frontWheel = CreateCirclePart("wheel", frontWheelInitPos, 35.0f, 0, 0.1f, 0.9f, 0.2f);
            frontFork  = CreateBoxPart("susp_lower_long", frontForkInitPos, 20.53f, 21.33f, 0, 0.8f,
                                       1.0f, 0.2f);
            rearWheel = CreateCirclePart("rearWheel", rearWheelInitPos, 32.0f, 0, 0.4f, 1.0f,
                                         0.2f);
            rearFork = CreateBoxPart("rearFork", rearForkInitPos, 64.0f, 17.0f, rearForkInitRot,
                                     0.5f, 1.0f, 0.2f);
            bikeBody = CreateBikeBody(bikeBodyInitPos, bikeBodyInitRot, 0.5f, 1.0f, 0.2f);

            RevoluteJointDef motorDef = new RevoluteJointDef();

            motorDef.Initialize(rearWheel, rearFork, rearWheel.GetWorldCenter());
            motorDef.maxMotorTorque = 2.0f;
            motorDef.enableMotor    = true;
            motor = (RevoluteJoint)world.CreateJoint(motorDef);

            RevoluteJointDef rearForkBodyDef = new RevoluteJointDef();
            Vector2          anchor          = rearFork.GetWorldCenter();

            anchor.X += (32.0f / Level.FACTOR);
            anchor.Y += (13.5f / Level.FACTOR);
            rearForkBodyDef.Initialize(rearFork, bikeBody, anchor);
            rearForkBodyDef.bodyA          = rearFork;
            rearForkBodyDef.bodyB          = bikeBody;
            rearForkBodyDef.maxMotorTorque = 300.0f;
            world.CreateJoint(rearForkBodyDef);

            RevoluteJointDef frontWheelJointDef = new RevoluteJointDef();

            frontWheelJointDef.Initialize(frontWheel, frontFork, frontWheel.GetWorldCenter());
            frontWheelJointDef.maxMotorTorque = 300.0f;
            world.CreateJoint(frontWheelJointDef);

            DistanceJointDef frontSuspToBikeDef = new DistanceJointDef();

            frontSuspToBikeDef.Initialize(bikeBody, frontFork,
                                          frontFork.GetWorldCenter() + new Vector2(0, 0.4f),
                                          frontFork.GetWorldCenter());
            frontSuspToBikeDef.frequencyHz      = 4.0f;
            frontSuspToBikeDef.dampingRatio     = 0.1f;
            frontSuspToBikeDef.collideConnected = true;
            world.CreateJoint(frontSuspToBikeDef);

            DistanceJointDef rearForkDistanceDef = new DistanceJointDef();

            rearForkDistanceDef.Initialize(bikeBody, rearFork,
                                           rearFork.GetWorldCenter() + new Vector2(0, 0.4f),
                                           rearFork.GetWorldCenter());
            rearForkDistanceDef.frequencyHz      = 7.0f;
            rearForkDistanceDef.dampingRatio     = 0.1f;
            rearForkDistanceDef.collideConnected = true;
            world.CreateJoint(rearForkDistanceDef);

            PrismaticJointDef fSuspBikePrismaticDef = new PrismaticJointDef();

            fSuspBikePrismaticDef.Initialize(bikeBody, frontFork, bikeBody.GetWorldCenter(),
                                             new Vector2(0, 1));
            fSuspBikePrismaticDef.enableLimit      = true;
            fSuspBikePrismaticDef.lowerTranslation = -0.2f;
            fSuspBikePrismaticDef.upperTranslation = 0.2f;
            fSuspBikePrismaticDef.collideConnected = true;
            world.CreateJoint(fSuspBikePrismaticDef);

            humanBody = CreateBoxPart("human", humanBodyInitPos, 17.0f, 64.0f, 0, 0.1f, 1.0f,
                                      0.2f);
            head = CreateBoxPart("head", headInitPos, 38.4f, 29.9f, headInitRot, 0.1f, 1.0f,
                                 0.2f);
            hand = CreateBoxPart("hand", handInitPos, 34.13f, 8.53f, handInitRot, 0.1f, 1.0f,
                                 0.2f);
            arm = CreateBoxPart("arm", armInitPos, 42.67f, 8.53f, armInitRot, 0.1f, 1.0f, 0.2f);

            WeldJointDef headToHumanDef = new WeldJointDef();

            headToHumanDef.Initialize(head, humanBody, head.GetWorldCenter());
            world.CreateJoint(headToHumanDef);

            RevoluteJointDef humanToBikeDef = new RevoluteJointDef();

            anchor    = humanBody.GetWorldCenter();
            anchor.Y += (30.0f / Level.FACTOR);
            humanToBikeDef.Initialize(humanBody, bikeBody, anchor);
            humanToBikeDef.maxMotorTorque = 300.0f;
            humanToBike = world.CreateJoint(humanToBikeDef);

            RevoluteJointDef humanToArmDef = new RevoluteJointDef();

            anchor = arm.GetWorldPoint(new Vector2(-21.33f / Level.FACTOR, 4.26f / Level.FACTOR));
            humanToArmDef.Initialize(humanBody, arm, anchor);
            humanToArmDef.maxMotorTorque = 300.0f;
            world.CreateJoint(humanToArmDef);

            RevoluteJointDef armToHandDef = new RevoluteJointDef();

            anchor = arm.GetWorldPoint(new Vector2(21.33f / Level.FACTOR, 4.26f / Level.FACTOR));
            armToHandDef.Initialize(arm, hand, anchor);
            armToHandDef.maxMotorTorque = 300.0f;
            world.CreateJoint(armToHandDef);

            RevoluteJointDef handToBikeDef = new RevoluteJointDef();

            anchor = hand.GetWorldPoint(new Vector2(17.06f / Level.FACTOR, 4.26f / Level.FACTOR));
            handToBikeDef.Initialize(hand, bikeBody, anchor);
            handToBikeDef.maxMotorTorque = 300.0f;
            handToBike = world.CreateJoint(handToBikeDef);

            DistanceJointDef armToBikeDef = new DistanceJointDef();

            armToBikeDef.Initialize(hand, bikeBody,
                                    hand.GetWorldPoint(new Vector2(-17.00f / Level.FACTOR,
                                                                   4.26f / Level.FACTOR)),
                                    bikeBody.GetWorldCenter());
            armToBikeDef.length           = 40.0f / Level.FACTOR;
            armToBikeDef.frequencyHz      = 10.0f;
            armToBikeDef.dampingRatio     = 1.0f;
            armToBikeDef.collideConnected = true;
            armToBike = world.CreateJoint(armToBikeDef);
        }
Example #6
0
        public Cantilever()
        {
            Body ground = null;

            {
                BodyDef bd = new BodyDef();
                ground = _world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                ground.CreateFixture(shape, 0.0f);
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type     = BodyType.Dynamic;
                    bd.position = new Vector2(-14.5f + 1.0f * i, 5.0f);
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(fd);

                    Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 5.0f);
                    jd.Initialize(prevBody, body, anchor);
                    _world.CreateJoint(jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type         = BodyType.Dynamic;
                    bd.position     = new Vector2(-14.5f + 1.0f * i, 15.0f);
                    bd.inertiaScale = 10.0f;
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(fd);

                    Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 15.0f);
                    jd.Initialize(prevBody, body, anchor);
                    _world.CreateJoint(jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type     = BodyType.Dynamic;
                    bd.position = new Vector2(-4.5f + 1.0f * i, 5.0f);
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(fd);

                    if (i > 0)
                    {
                        Vector2 anchor = new Vector2(-5.0f + 1.0f * i, 5.0f);
                        jd.Initialize(prevBody, body, anchor);
                        _world.CreateJoint(jd);
                    }

                    prevBody = body;
                }
            }
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type         = BodyType.Dynamic;
                    bd.position     = new Vector2(5.5f + 1.0f * i, 10.0f);
                    bd.inertiaScale = 10.0f;
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(fd);

                    if (i > 0)
                    {
                        Vector2 anchor = new Vector2(5.0f + 1.0f * i, 10.0f);
                        jd.Initialize(prevBody, body, anchor);
                        _world.CreateJoint(jd);
                    }

                    prevBody = body;
                }
            }

            for (int i = 0; i < 2; ++i)
            {
                Vector2[] vertices = new Vector2[3];
                vertices[0] = new Vector2(-0.5f, 0.0f);
                vertices[1] = new Vector2(0.5f, 0.0f);
                vertices[2] = new Vector2(0.0f, 1.5f);

                PolygonShape shape = new PolygonShape();
                shape.Set(vertices, 3);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.density = 1.0f;

                BodyDef bd = new BodyDef();
                bd.type     = BodyType.Dynamic;
                bd.position = new Vector2(-8.0f + 8.0f * i, 12.0f);
                Body body = _world.CreateBody(bd);
                body.CreateFixture(fd);
            }

            for (int i = 0; i < 2; ++i)
            {
                CircleShape shape = new CircleShape();
                shape._radius = 0.5f;

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.density = 1.0f;

                BodyDef bd = new BodyDef();
                bd.type     = BodyType.Dynamic;
                bd.position = new Vector2(-6.0f + 6.0f * i, 10.0f);
                Body body = _world.CreateBody(bd);
                body.CreateFixture(fd);
            }
        }
Example #7
0
        public Cantilever()
        {
            Body ground = null;
		    {
                BodyDef bd = new BodyDef();
			    ground = _world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
			    shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
			    ground.CreateFixture(shape, 0.0f);
		    }

		    {
                PolygonShape shape = new PolygonShape();
			    shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
			    fd.shape = shape;
			    fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

			    Body prevBody = ground;
			    for (int i = 0; i < e_count; ++i)
			    {
                    BodyDef bd = new BodyDef();
				    bd.type = BodyType.Dynamic;
				    bd.position = new Vector2(-14.5f + 1.0f * i, 5.0f);
				    Body body = _world.CreateBody(bd);
				    body.CreateFixture(fd);

				    Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 5.0f);
				    jd.Initialize(prevBody, body, anchor);
				    _world.CreateJoint(jd);

				    prevBody = body;
			    }
		    }

		   	{
                PolygonShape shape = new PolygonShape();
			    shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
			    fd.shape = shape;
			    fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

			    Body prevBody = ground;
			    for (int i = 0; i < e_count; ++i)
			    {
                    BodyDef bd = new BodyDef();
				    bd.type = BodyType.Dynamic;
				    bd.position = new Vector2(-14.5f + 1.0f * i, 15.0f);
				    bd.inertiaScale = 10.0f;
				    Body body = _world.CreateBody(bd);
				    body.CreateFixture(fd);

				    Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 15.0f);
				    jd.Initialize(prevBody, body, anchor);
				    _world.CreateJoint(jd);

				    prevBody = body;
			    }
		    }

		    {
                PolygonShape shape = new PolygonShape();
			    shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
			    fd.shape = shape;
			    fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

			    Body prevBody = ground;
			    for (int i = 0; i < e_count; ++i)
			    {
                    BodyDef bd = new BodyDef();
				    bd.type = BodyType.Dynamic;
				    bd.position = new Vector2(-4.5f + 1.0f * i, 5.0f);
				    Body body = _world.CreateBody(bd);
				    body.CreateFixture(fd);

				    if (i > 0)
				    {
					    Vector2 anchor = new Vector2(-5.0f + 1.0f * i, 5.0f);
					    jd.Initialize(prevBody, body, anchor);
					    _world.CreateJoint(jd);
				    }

				    prevBody = body;
			    }
		    }
            {
                PolygonShape shape = new PolygonShape();
			    shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
			    fd.shape = shape;
			    fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

			    Body prevBody = ground;
			    for (int i = 0; i < e_count; ++i)
			    {
                    BodyDef bd = new BodyDef();
				    bd.type = BodyType.Dynamic;
				    bd.position = new Vector2(5.5f + 1.0f * i, 10.0f);
				    bd.inertiaScale = 10.0f;
				    Body body = _world.CreateBody(bd);
				    body.CreateFixture(fd);

				    if (i > 0)
				    {
					    Vector2 anchor = new Vector2(5.0f + 1.0f * i, 10.0f);
					    jd.Initialize(prevBody, body, anchor);
					    _world.CreateJoint(jd);
				    }

				    prevBody = body;
			    }
		    }

		    for (int i = 0; i < 2; ++i)
		    {
			    Vector2[] vertices = new Vector2[3];
			    vertices[0] = new Vector2(-0.5f, 0.0f);
			    vertices[1] = new Vector2(0.5f, 0.0f);
			    vertices[2] = new Vector2(0.0f, 1.5f);

                PolygonShape shape = new PolygonShape();
			    shape.Set(vertices, 3);

                FixtureDef fd = new FixtureDef();
			    fd.shape = shape;
			    fd.density = 1.0f;

                BodyDef bd = new BodyDef();
			    bd.type = BodyType.Dynamic;
			    bd.position = new Vector2(-8.0f + 8.0f * i, 12.0f);
			    Body body = _world.CreateBody(bd);
			    body.CreateFixture(fd);
		    }

            for (int i = 0; i < 2; ++i)
		    {
                CircleShape shape = new CircleShape();
			    shape._radius = 0.5f;

                FixtureDef fd = new FixtureDef();
			    fd.shape = shape;
			    fd.density = 1.0f;

                BodyDef bd = new BodyDef();
			    bd.type = BodyType.Dynamic;
			    bd.position = new Vector2(-6.0f + 6.0f * i, 10.0f);
			    Body body = _world.CreateBody(bd);
			    body.CreateFixture(fd);
		    }
        }
Example #8
0
        public Cantilever()
        {
            Body ground;

            {
                var bd = new BodyDef();
                ground = World.CreateBody(bd);

                var shape = new EdgeShape();
                shape.Set(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                ground.CreateFixture(shape, 0.0f);
            }

            {
                var shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                var fd = new FixtureDef();
                fd.Shape   = shape;
                fd.Density = 20.0f;

                var jd = new WeldJointDef();

                var prevBody = ground;
                for (var i = 0; i < Count; ++i)
                {
                    var bd = new BodyDef();
                    bd.BodyType = BodyType.DynamicBody;
                    bd.Position.Set(-14.5f + 1.0f * i, 5.0f);
                    var body = World.CreateBody(bd);
                    body.CreateFixture(fd);

                    var anchor = new Vector2(-15.0f + 1.0f * i, 5.0f);
                    jd.Initialize(prevBody, body, anchor);
                    World.CreateJoint(jd);

                    prevBody = body;
                }
            }

            {
                var shape = new PolygonShape();
                shape.SetAsBox(1.0f, 0.125f);

                var fd = new FixtureDef();
                fd.Shape   = shape;
                fd.Density = 20.0f;

                var jd = new WeldJointDef();
                jd.FrequencyHz  = 5.0f;
                jd.DampingRatio = 0.7f;

                var prevBody = ground;
                for (var i = 0; i < 3; ++i)
                {
                    var bd = new BodyDef();
                    bd.BodyType = BodyType.DynamicBody;
                    bd.Position.Set(-14.0f + 2.0f * i, 15.0f);
                    var body = World.CreateBody(bd);
                    body.CreateFixture(fd);

                    var anchor = new Vector2(-15.0f + 2.0f * i, 15.0f);
                    jd.Initialize(prevBody, body, anchor);
                    World.CreateJoint(jd);

                    prevBody = body;
                }
            }

            {
                var shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                var fd = new FixtureDef();
                fd.Shape   = shape;
                fd.Density = 20.0f;

                var jd = new WeldJointDef();

                var prevBody = ground;
                for (var i = 0; i < Count; ++i)
                {
                    var bd = new BodyDef();
                    bd.BodyType = BodyType.DynamicBody;
                    bd.Position.Set(-4.5f + 1.0f * i, 5.0f);
                    var body = World.CreateBody(bd);
                    body.CreateFixture(fd);

                    if (i > 0)
                    {
                        var anchor = new Vector2(-5.0f + 1.0f * i, 5.0f);
                        jd.Initialize(prevBody, body, anchor);
                        World.CreateJoint(jd);
                    }

                    prevBody = body;
                }
            }

            {
                var shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                var fd = new FixtureDef();
                fd.Shape   = shape;
                fd.Density = 20.0f;

                var jd = new WeldJointDef();
                jd.FrequencyHz  = 8.0f;
                jd.DampingRatio = 0.7f;

                var prevBody = ground;
                for (var i = 0; i < Count; ++i)
                {
                    var bd = new BodyDef();
                    bd.BodyType = BodyType.DynamicBody;
                    bd.Position.Set(5.5f + 1.0f * i, 10.0f);
                    var body = World.CreateBody(bd);
                    body.CreateFixture(fd);

                    if (i > 0)
                    {
                        var anchor = new Vector2(5.0f + 1.0f * i, 10.0f);
                        jd.Initialize(prevBody, body, anchor);
                        World.CreateJoint(jd);
                    }

                    prevBody = body;
                }
            }

            for (var i = 0; i < 2; ++i)
            {
                var vertices = new Vector2 [3];
                vertices[0].Set(-0.5f, 0.0f);
                vertices[1].Set(0.5f, 0.0f);
                vertices[2].Set(0.0f, 1.5f);

                var shape = new PolygonShape();
                shape.Set(vertices);

                var fd = new FixtureDef();
                fd.Shape   = shape;
                fd.Density = 1.0f;

                var bd = new BodyDef();
                bd.BodyType = BodyType.DynamicBody;
                bd.Position.Set(-8.0f + 8.0f * i, 12.0f);
                var body = World.CreateBody(bd);
                body.CreateFixture(fd);
            }

            for (var i = 0; i < 2; ++i)
            {
                var shape = new CircleShape();
                shape.Radius = 0.5f;

                var fd = new FixtureDef();
                fd.Shape   = shape;
                fd.Density = 1.0f;

                var bd = new BodyDef();
                bd.BodyType = BodyType.DynamicBody;
                bd.Position.Set(-6.0f + 6.0f * i, 10.0f);
                var body = World.CreateBody(bd);
                body.CreateFixture(fd);
            }
        }
Example #9
0
        public Cloth()
        {
            FixtureDef boxFix = new FixtureDef(new CircleShape(ClothBodySize), 0.2f);
            BodyDef    boxBod = new BodyDef(BodyType.Dynamic, Vec2.Empty);

            boxFix.Filter.GroupIndex = -1;
            boxBod.Position          = new Vec2(-ClothTotalWidth / 2, 30);

            Body bar;

            {
                bar = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(-ClothBodySpacingWidth / 2, 30)));

                var fd = new FixtureDef(new PolygonShape((ClothTotalWidth / 2) + ClothBodySpacingWidth, 0.25f));
                fd.Filter.GroupIndex = -1;
                bar.CreateFixture(fd);
            }

            for (int y = 0; y < ClothSegmentsHeight; ++y)
            {
                for (int x = 0; x < ClothSegmentsWidth; ++x)
                {
                    Body body = m_world.CreateBody(boxBod);
                    boxBod.Position += new Vec2(ClothBodySpacingWidth, 0);

                    body.CreateFixture(boxFix);

                    if (y == 0)
                    {
                        WeldJointDef wjd = new WeldJointDef();
                        wjd.Initialize(body, bar, body.WorldCenter);
                        m_world.CreateJoint(wjd);
                    }

                    cloth[x, y] = body;
                }

                boxBod.Position = new Vec2(-ClothTotalWidth / 2, boxBod.Position.Y - ClothBodySpacingWidth);
            }

            for (int y = 0; y < ClothSegmentsHeight; ++y)
            {
                for (int x = 0; x < ClothSegmentsWidth; ++x)
                {
                    Body leftBody, rightBody;

                    DistanceJointDef djd = new DistanceJointDef();
                    djd.FrequencyHz  = 15 + Rand.RandomFloat(0, 6);
                    djd.DampingRatio = 0.11f + Rand.RandomFloat(0.01f, 0.15f);

                    // connect to right
                    if (x != ClothSegmentsWidth - 1)
                    {
                        leftBody  = cloth[x, y];
                        rightBody = cloth[x + 1, y];

                        djd.Initialize(leftBody, rightBody, leftBody.WorldCenter, rightBody.WorldCenter);
                        m_world.CreateJoint(djd);
                    }

                    // connect to up
                    if (y != 0)
                    {
                        leftBody  = cloth[x, y];
                        rightBody = cloth[x, y - 1];

                        djd.Initialize(leftBody, rightBody, leftBody.WorldCenter, rightBody.WorldCenter);
                        m_world.CreateJoint(djd);
                    }
                }
            }
        }
Example #10
0
        public APERipOff()
        {
            Body ground = m_world.CreateBody(new BodyDef());

            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-26, 40), new Vec2(32, 40)), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-26, 40), new Vec2(-26 - 5, 40 - 4)), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-26 - 5, 40 - 4), new Vec2(-26 - 5, 40 - 44)), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(32, 40), new Vec2(32, 40 - 44)), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new CircleShape(new Vec2(27, 40 - 58), 25), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(24, 2), new Vec2(-3 - 5, 19)), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new CircleShape(new Vec2(-7.25f - 5, 14.75f), 6), 0.0f, 0.0f, 0.65f));

            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-12 - 5, 18), new Vec2(-26 - 5 + 5, 11)), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-26 - 5 + 5, 11), new Vec2(-26 - 5 + 5, 40 - 44)), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-26 - 5, 40 - 44), new Vec2(-26 - 5 + 5, 40 - 44)), 0.0f, 2.0f, 0.65f));

            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-26 + 5, 40 - 5), new Vec2(-26 - 5 + 5, 40 - 4 - 5)), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-26 - 5 + 5, 40 - 4 - 5), new Vec2(-26 - 5 + 5, 40 - 22)), 0.0f, 0.0f, 0.65f));

            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-26 + 5, 40 - 5), new Vec2(-26 + 15, 40 - 5)), 0.0f, 0.0f, 0.65f));
            ground.CreateFixture(new FixtureDef(new PolygonShape(new Vec2(-26 + 35, 40 - 5), new Vec2(-26 + 35 + 12, 40 - 5)), 0.0f, 0.0f, 0.65f));

            {
                Body _oldBody = null;

                for (int i = 0; i < 5; ++i)
                {
                    Body thing = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-26 + 15 + 2 + (4.0f * i), 40 - 6 + 0.75f)));
                    var  fix   = thing.CreateFixture(new PolygonShape(2, 0.25f), 8.0f);

                    if (i == 0)
                    {
                        RevoluteJointDef rjd = new RevoluteJointDef();
                        rjd.Initialize(thing, ground, thing.WorldCenter - new Vec2(2, 0));
                        m_world.CreateJoint(rjd);
                    }
                    else if (i == 4)
                    {
                        RevoluteJointDef rjd = new RevoluteJointDef();
                        rjd.Initialize(thing, ground, thing.WorldCenter + new Vec2(2, 0));
                        m_world.CreateJoint(rjd);
                    }

                    if (_oldBody != null)
                    {
                        RevoluteJointDef rjd = new RevoluteJointDef();
                        rjd.Initialize(_oldBody, thing, _oldBody.WorldCenter + new Vec2(2, 0));
                        m_world.CreateJoint(rjd);
                    }

                    _oldBody = thing;
                }
            }

            BodyDef bd         = new BodyDef(BodyType.Dynamic, Vec2.Empty);
            var     cantilever = m_world.CreateBody(bd);
            var     cantpos    = new Vec2(-26 + 52.8f, 40 - 5 - (1.40f / 2));

            {
                PolygonShape poly = APERipOff.MakeShape(cantpos.X, cantpos.Y, 8.8f, 1.40f, 0);
                cantilever.CreateFixture(new FixtureDef(poly, 0.05f));
            }

            {
                var         p        = cantpos + new Vec2(8.8f / 2, 0);
                CircleShape circle   = APERipOff.MakeCircle(p.X, p.Y, 1.40f / 2);
                var         tempbody = m_world.CreateBody(bd);
                tempbody.CreateFixture(new FixtureDef(circle, 0.05f));

                p      = cantpos - new Vec2(8.8f / 2, 0);
                circle = APERipOff.MakeCircle(p.X, p.Y, 1.40f / 2);
                cantilever.CreateFixture(new FixtureDef(circle, 0.05f));

                WeldJointDef wjd = new WeldJointDef();
                wjd.Initialize(tempbody, ground, tempbody.WorldCenter);
                wjd.CollideConnected = false;
                m_world.CreateJoint(wjd);

                WeldJointDef rjd = new WeldJointDef();
                rjd.Initialize(tempbody, cantilever, tempbody.WorldCenter);
                rjd.CollideConnected = true;
                m_world.CreateJoint(rjd);
            }

            new Capsule(m_world, new Vec2(1.5f, 37.5f), 5, 4, 0.35f);

            {
                Body squareThing;
                bd = new BodyDef(BodyType.Kinematic, new Vec2(23, 17));

                squareThing = m_world.CreateBody(bd);

                squareThing.CreateFixture(new FixtureDef(new CircleShape(new Vec2(-1, 4), 0.35f), 1));
                squareThing.CreateFixture(new FixtureDef(new CircleShape(new Vec2(1, 4), 0.35f), 1));
                squareThing.CreateFixture(new FixtureDef(new CircleShape(new Vec2(-1, -4.5f), 0.35f), 1));
                squareThing.CreateFixture(new FixtureDef(new CircleShape(new Vec2(1, -4.5f), 0.35f), 1));

                squareThing.CreateFixture(new FixtureDef(new PolygonShape(1, 0.35f, new Vec2(0, -4.5f), 0), 1));
                squareThing.CreateFixture(new FixtureDef(new PolygonShape(1, 0.35f, new Vec2(0, 4.0f), 0), 1));
                squareThing.CreateFixture(new FixtureDef(new PolygonShape(0.35f, 4.25f, new Vec2(-1, -0.25f), 0), 1));
                squareThing.CreateFixture(new FixtureDef(new PolygonShape(0.35f, 4.25f, new Vec2(1, -0.25f), 0), 1));

                squareThing.AngularVelocity = -0.50f;

                m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(23, 19)))
                .CreateFixture(new FixtureDef(new CircleShape(0.625f), 1));

                Body squareOne = m_world.CreateBody(new BodyDef(BodyType.Dynamic, squareThing.WorldCenter + new Vec2(1, 8.0f)));
                squareOne.CreateFixture(new PolygonShape(0.50f, 0.50f), 500);

                RevoluteJointDef rjd = new RevoluteJointDef();
                rjd.Initialize(squareThing, squareOne, squareThing.WorldCenter + new Vec2(1, 4));
                rjd.CollideConnected = true;
                m_world.CreateJoint(rjd);

                Body squareTwo = m_world.CreateBody(new BodyDef(BodyType.Dynamic, squareThing.WorldCenter + new Vec2(-1, -8.5f)));
                squareTwo.CreateFixture(new PolygonShape(0.50f, 0.50f), 500);

                rjd = new RevoluteJointDef();
                rjd.Initialize(squareThing, squareTwo, squareThing.WorldCenter + new Vec2(-1, -4.5f));
                rjd.CollideConnected = true;
                m_world.CreateJoint(rjd);
            }

            {
                Vec2 carPos    = new Vec2(-11.5f, 37.5f);
                var  bodyShape = new PolygonShape(3.5f, 0.6f);
                bd = new BodyDef(BodyType.Dynamic, carPos);

                var body = m_world.CreateBody(bd);
                body.CreateFixture(bodyShape, 20.0f);

                {
                    var wheel     = new CircleShape(2.0f);
                    var leftWheel = m_world.CreateBody(new BodyDef(BodyType.Dynamic, carPos - new Vec2(3.5f, 0)));
                    leftWheel.CreateFixture(new FixtureDef(wheel, 20.0f, 0.0f, 0.65f));

                    RevoluteJointDef rjd = new RevoluteJointDef();
                    rjd.Initialize(leftWheel, body, leftWheel.WorldCenter);
                    wheelL       = (RevoluteJoint)m_world.CreateJoint(rjd);
                    rjd.UserData = "lwheel";
                }

                {
                    var wheel     = new CircleShape(2.0f);
                    var leftWheel = m_world.CreateBody(new BodyDef(BodyType.Dynamic, carPos + new Vec2(3.5f, 0)));
                    leftWheel.CreateFixture(new FixtureDef(wheel, 20.0f, 0.0f, 0.65f));

                    RevoluteJointDef rjd = new RevoluteJointDef();
                    rjd.Initialize(leftWheel, body, leftWheel.WorldCenter);
                    wheelR       = (RevoluteJoint)m_world.CreateJoint(rjd);
                    rjd.UserData = "rwheel";
                }
            }
        }
Example #11
0
        Cantilever()
        {
            Body ground = null;

            {
                BodyDef bd = new BodyDef();
                ground = m_world.CreateBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.Set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));
                shape.Density = 0;
                ground.CreateFixture(shape);
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.Density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType._dynamicBody;
                    bd.Position.Set(-14.5f + 1.0f * i, 5.0f);
                    Body body = m_world.CreateBody(bd);
                    body.CreateFixture(fd);

                    Vec2 anchor = new Vec2(-15.0f + 1.0f * i, 5.0f);
                    jd.Initialize(prevBody, body, anchor);
                    m_world.CreateJoint(jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(1.0f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.Density = 20.0f;

                WeldJointDef jd = new WeldJointDef();
                jd.frequencyHz  = 5.0f;
                jd.dampingRatio = 0.7f;

                Body prevBody = ground;
                for (int i = 0; i < 3; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType._dynamicBody;
                    bd.Position.Set(-14.0f + 2.0f * i, 15.0f);
                    Body body = m_world.CreateBody(bd);
                    body.CreateFixture(fd);

                    Vec2 anchor = new Vec2(-15.0f + 2.0f * i, 15.0f);
                    jd.Initialize(prevBody, body, anchor);
                    m_world.CreateJoint(jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.Density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType._dynamicBody;
                    bd.Position.Set(-4.5f + 1.0f * i, 5.0f);
                    Body body = m_world.CreateBody(bd);
                    body.CreateFixture(fd);

                    if (i > 0)
                    {
                        Vec2 anchor = new Vec2(-5.0f + 1.0f * i, 5.0f);
                        jd.Initialize(prevBody, body, anchor);
                        m_world.CreateJoint(jd);
                    }

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.Density = 20.0f;

                WeldJointDef jd = new WeldJointDef();
                jd.frequencyHz  = 8.0f;
                jd.dampingRatio = 0.7f;

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType._dynamicBody;
                    bd.Position.Set(5.5f + 1.0f * i, 10.0f);
                    Body body = m_world.CreateBody(bd);
                    body.CreateFixture(fd);

                    if (i > 0)
                    {
                        Vec2 anchor = new Vec2(5.0f + 1.0f * i, 10.0f);
                        jd.Initialize(prevBody, body, anchor);
                        m_world.CreateJoint(jd);
                    }

                    prevBody = body;
                }
            }

            for (int i = 0; i < 2; ++i)
            {
                Vec2[] vertices = new Vec2[3];
                vertices[0].Set(-0.5f, 0.0f);
                vertices[1].Set(0.5f, 0.0f);
                vertices[2].Set(0.0f, 1.5f);

                PolygonShape shape = new PolygonShape();
                shape.Set(vertices, 3);

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.Density = 1.0f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType._dynamicBody;
                bd.Position.Set(-8.0f + 8.0f * i, 12.0f);
                Body body = m_world.CreateBody(bd);
                body.CreateFixture(fd);
            }

            for (int i = 0; i < 2; ++i)
            {
                CircleShape shape = new CircleShape();
                shape.m_radius = 0.5f;

                FixtureDef fd = new FixtureDef();
                fd.shape   = shape;
                fd.Density = 1.0f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType._dynamicBody;
                bd.Position.Set(-6.0f + 6.0f * i, 10.0f);
                Body body = m_world.CreateBody(bd);
                body.CreateFixture(fd);
            }
        }
Example #12
0
        public WorldData Deserialize(Stream stream)
        {
            XMLFragmentElement root = XMLFragmentParser.LoadFromStream(stream);

            if (root.Name.ToLower() != "world")
                throw new Exception();

            WorldData data = new WorldData();

            if (root.Attributes.Count == 0)
                throw new Exception("No version");
            else if (int.Parse(root.Attributes[0].Value) != WorldXmlSerializer.XmlVersion)
                throw new Exception("Wrong version XML file");

            data.Version = int.Parse(root.Attributes[0].Value);

            foreach (var main in root.Elements)
            {
                switch (main.Name.ToLower())
                {
                case "gravity":
                    {
                        data.Gravity = ReadVector(main);
                    }
                    break;

                case "shapes":
                    {
                        foreach (var n in main.Elements)
                        {
                            if (n.Name.ToLower() != "shape")
                                throw new Exception();

                            ShapeType type = (ShapeType)Enum.Parse(typeof(ShapeType), n.Attributes[0].Value, true);
                            string name = "";

                            switch (type)
                            {
                            case ShapeType.Circle:
                                {
                                    CircleShape shape = new CircleShape();

                                    foreach (var sn in n.Elements)
                                    {
                                        switch (sn.Name.ToLower())
                                        {
                                        case "name":
                                            name = sn.Value;
                                            break;
                                        case "radius":
                                            shape.Radius = float.Parse(sn.Value);
                                            break;
                                        case "position":
                                            shape.Position = ReadVector(sn);
                                            break;
                                        default:
                                            throw new Exception();
                                        }
                                    }

                                    _shapes.Add(new ShapeSerialized(shape, name));
                                }
                                break;
                            case ShapeType.Polygon:
                                {
                                    PolygonShape shape = new PolygonShape();

                                    foreach (var sn in n.Elements)
                                    {
                                        switch (sn.Name.ToLower())
                                        {
                                        case "name":
                                            name = sn.Value;
                                            break;
                                        case "vertices":
                                            {
                                                List<Vec2> verts = new List<Vec2>();

                                                foreach (var vert in sn.Elements)
                                                    verts.Add(ReadVector(vert));

                                                shape.Vertices = verts.ToArray();
                                            }
                                            break;
                                        case "centroid":
                                            shape.Centroid = ReadVector(sn);
                                            break;
                                        }
                                    }

                                    _shapes.Add(new ShapeSerialized(shape, name));
                                }
                                break;
                            }
                        }
                    }
                    break;
                case "fixtures":
                    {
                        foreach (var n in main.Elements)
                        {
                            FixtureDef fixture = new FixtureDef();

                            if (n.Name.ToLower() != "fixture")
                                throw new Exception();

                            string name = "";
                            int id = 0;

                            foreach (var sn in n.Elements)
                            {
                                switch (sn.Name.ToLower())
                                {
                                case "name":
                                    name = sn.Value;
                                    break;
                                case "shape":
                                    id = int.Parse(sn.Value);
                                    break;
                                case "density":
                                    fixture.Density = float.Parse(sn.Value);
                                    break;
                                case "filterdata":
                                    fixture.Filter = (FilterData)ReadSimpleType(sn, typeof(FilterData), true);
                                    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;
                                }
                            }

                            fixture.Shape = _shapes[id].Shape;

                            _fixtures.Add(new FixtureDefSerialized(fixture, id, name));
                        }
                    }
                    break;
                case "bodies":
                    {
                        foreach (var n in main.Elements)
                        {
                            BodyDef body = new BodyDef();

                            if (n.Name.ToLower() != "body")
                                throw new Exception();

                            body.BodyType = (BodyType)Enum.Parse(typeof(BodyType), n.Attributes[0].Value, true);
                            List<int> fixtures = new List<int>();
                            string name = "";

                            foreach (var sn in n.Elements)
                            {
                                switch (sn.Name.ToLower())
                                {
                                case "name":
                                    name = sn.Value;
                                    break;
                                case "active":
                                    body.Active = bool.Parse(sn.Value);
                                    break;
                                case "allowsleep":
                                    body.AllowSleep = bool.Parse(sn.Value);
                                    break;
                                case "angle":
                                    body.Angle = 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.Bullet = bool.Parse(sn.Value);
                                    break;
                                case "fixedrotation":
                                    body.FixedRotation = bool.Parse(sn.Value);
                                    break;
                                case "inertiascale":
                                    body.InertiaScale = float.Parse(sn.Value);
                                    break;
                                case "lineardamping":
                                    body.LinearDamping = float.Parse(sn.Value);
                                    break;
                                case "linearvelocity":
                                    body.LinearVelocity = ReadVector(sn);
                                    break;
                                case "position":
                                    body.Position = ReadVector(sn);
                                    break;
                                case "userdata":
                                    body.UserData = ReadSimpleType(sn, null, false);
                                    break;
                                case "fixtures":
                                    {
                                        foreach (var v in sn.Elements)
                                            fixtures.Add(int.Parse(v.Value));
                                        break;
                                    }
                                }
                            }

                            _bodies.Add(new BodyDefSerialized(null, body, fixtures, name));
                        }
                    }
                    break;
                case "joints":
                    {
                        foreach (var n in main.Elements)
                        {
                            JointDef mainDef = null;

                            if (n.Name.ToLower() != "joint")
                                throw new Exception();

                            JointType type = (JointType)Enum.Parse(typeof(JointType), n.Attributes[0].Value, true);

                            int bodyA = -1, bodyB = -1;
                            bool collideConnected = false;
                            object userData = null;
                            string name = "";

                            switch (type)
                            {
                            case JointType.Distance:
                                mainDef = new DistanceJointDef();
                                break;
                            case JointType.Friction:
                                mainDef = new FrictionJointDef();
                                break;
                            case JointType.Line:
                                mainDef = new LineJointDef();
                                break;
                            case JointType.Prismatic:
                                mainDef = new PrismaticJointDef();
                                break;
                            case JointType.Pulley:
                                mainDef = new PulleyJointDef();
                                break;
                            case JointType.Revolute:
                                mainDef = new RevoluteJointDef();
                                break;
                            case JointType.Weld:
                                mainDef = new WeldJointDef();
                                break;
                            default:
                                throw new Exception("Invalid or unsupported joint");
                            }

                            foreach (var sn in n.Elements)
                            {
                                // check for specific nodes
                                switch (type)
                                {
                                case JointType.Distance:
                                    {
                                        switch (sn.Name.ToLower())
                                        {
                                        case "dampingratio":
                                            ((DistanceJointDef)mainDef).DampingRatio = float.Parse(sn.Value);
                                            break;
                                        case "frequencyhz":
                                            ((DistanceJointDef)mainDef).FrequencyHz = float.Parse(sn.Value);
                                            break;
                                        case "length":
                                            ((DistanceJointDef)mainDef).Length = float.Parse(sn.Value);
                                            break;
                                        case "localanchora":
                                            ((DistanceJointDef)mainDef).LocalAnchorA = ReadVector(sn);
                                            break;
                                        case "localanchorb":
                                            ((DistanceJointDef)mainDef).LocalAnchorB = ReadVector(sn);
                                            break;
                                        }
                                    }
                                    break;
                                case JointType.Friction:
                                    {
                                        switch (sn.Name.ToLower())
                                        {
                                        case "localanchora":
                                            ((FrictionJointDef)mainDef).LocalAnchorA = ReadVector(sn);
                                            break;
                                        case "localanchorb":
                                            ((FrictionJointDef)mainDef).LocalAnchorB = ReadVector(sn);
                                            break;
                                        case "maxforce":
                                            ((FrictionJointDef)mainDef).MaxForce = float.Parse(sn.Value);
                                            break;
                                        case "maxtorque":
                                            ((FrictionJointDef)mainDef).MaxTorque = float.Parse(sn.Value);
                                            break;
                                        }
                                    }
                                    break;
                                case JointType.Line:
                                    {
                                        switch (sn.Name.ToLower())
                                        {
                                        case "enablelimit":
                                            ((LineJointDef)mainDef).EnableLimit = bool.Parse(sn.Value);
                                            break;
                                        case "enablemotor":
                                            ((LineJointDef)mainDef).EnableMotor = bool.Parse(sn.Value);
                                            break;
                                        case "localanchora":
                                            ((LineJointDef)mainDef).LocalAnchorA = ReadVector(sn);
                                            break;
                                        case "localanchorb":
                                            ((LineJointDef)mainDef).LocalAnchorB = ReadVector(sn);
                                            break;
                                        case "localaxisa":
                                            ((LineJointDef)mainDef).LocalAxisA = ReadVector(sn);
                                            break;
                                        case "maxmotorforce":
                                            ((LineJointDef)mainDef).MaxMotorForce = float.Parse(sn.Value);
                                            break;
                                        case "motorspeed":
                                            ((LineJointDef)mainDef).MotorSpeed = float.Parse(sn.Value);
                                            break;
                                        case "lowertranslation":
                                            ((LineJointDef)mainDef).LowerTranslation = float.Parse(sn.Value);
                                            break;
                                        case "uppertranslation":
                                            ((LineJointDef)mainDef).UpperTranslation = float.Parse(sn.Value);
                                            break;
                                        }
                                    }
                                    break;
                                case JointType.Prismatic:
                                    {
                                        switch (sn.Name.ToLower())
                                        {
                                        case "enablelimit":
                                            ((PrismaticJointDef)mainDef).EnableLimit = bool.Parse(sn.Value);
                                            break;
                                        case "enablemotor":
                                            ((PrismaticJointDef)mainDef).EnableMotor = bool.Parse(sn.Value);
                                            break;
                                        case "localanchora":
                                            ((PrismaticJointDef)mainDef).LocalAnchorA = ReadVector(sn);
                                            break;
                                        case "localanchorb":
                                            ((PrismaticJointDef)mainDef).LocalAnchorB = ReadVector(sn);
                                            break;
                                        case "localaxisa":
                                            ((PrismaticJointDef)mainDef).LocalAxis = ReadVector(sn);
                                            break;
                                        case "maxmotorforce":
                                            ((PrismaticJointDef)mainDef).MaxMotorForce = float.Parse(sn.Value);
                                            break;
                                        case "motorspeed":
                                            ((PrismaticJointDef)mainDef).MotorSpeed = float.Parse(sn.Value);
                                            break;
                                        case "lowertranslation":
                                            ((PrismaticJointDef)mainDef).LowerTranslation = float.Parse(sn.Value);
                                            break;
                                        case "uppertranslation":
                                            ((PrismaticJointDef)mainDef).UpperTranslation = float.Parse(sn.Value);
                                            break;
                                        case "referenceangle":
                                            ((PrismaticJointDef)mainDef).ReferenceAngle = float.Parse(sn.Value);
                                            break;
                                        }
                                    }
                                    break;
                                case JointType.Pulley:
                                    {
                                        switch (sn.Name.ToLower())
                                        {
                                        case "groundanchora":
                                            ((PulleyJointDef)mainDef).GroundAnchorA = ReadVector(sn);
                                            break;
                                        case "groundanchorb":
                                            ((PulleyJointDef)mainDef).GroundAnchorB = ReadVector(sn);
                                            break;
                                        case "lengtha":
                                            ((PulleyJointDef)mainDef).LengthA = float.Parse(sn.Value);
                                            break;
                                        case "lengthb":
                                            ((PulleyJointDef)mainDef).LengthB = float.Parse(sn.Value);
                                            break;
                                        case "localanchora":
                                            ((PulleyJointDef)mainDef).LocalAnchorA = ReadVector(sn);
                                            break;
                                        case "localanchorb":
                                            ((PulleyJointDef)mainDef).LocalAnchorB = ReadVector(sn);
                                            break;
                                        case "maxlengtha":
                                            ((PulleyJointDef)mainDef).MaxLengthA = float.Parse(sn.Value);
                                            break;
                                        case "maxlengthb":
                                            ((PulleyJointDef)mainDef).MaxLengthB = float.Parse(sn.Value);
                                            break;
                                        case "ratio":
                                            ((PulleyJointDef)mainDef).Ratio = float.Parse(sn.Value);
                                            break;
                                        }
                                    }
                                    break;
                                case JointType.Revolute:
                                    {
                                        switch (sn.Name.ToLower())
                                        {
                                        case "enablelimit":
                                            ((RevoluteJointDef)mainDef).EnableLimit = bool.Parse(sn.Value);
                                            break;
                                        case "enablemotor":
                                            ((RevoluteJointDef)mainDef).EnableMotor = bool.Parse(sn.Value);
                                            break;
                                        case "localanchora":
                                            ((RevoluteJointDef)mainDef).LocalAnchorA = ReadVector(sn);
                                            break;
                                        case "localanchorb":
                                            ((RevoluteJointDef)mainDef).LocalAnchorB = ReadVector(sn);
                                            break;
                                        case "maxmotortorque":
                                            ((RevoluteJointDef)mainDef).MaxMotorTorque = float.Parse(sn.Value);
                                            break;
                                        case "motorspeed":
                                            ((RevoluteJointDef)mainDef).MotorSpeed = float.Parse(sn.Value);
                                            break;
                                        case "lowerangle":
                                            ((RevoluteJointDef)mainDef).LowerAngle = float.Parse(sn.Value);
                                            break;
                                        case "upperangle":
                                            ((RevoluteJointDef)mainDef).UpperAngle = float.Parse(sn.Value);
                                            break;
                                        case "referenceangle":
                                            ((RevoluteJointDef)mainDef).ReferenceAngle = float.Parse(sn.Value);
                                            break;
                                        }
                                    }
                                    break;
                                case JointType.Weld:
                                    {
                                        switch (sn.Name.ToLower())
                                        {
                                        case "localanchora":
                                            ((WeldJointDef)mainDef).LocalAnchorA = ReadVector(sn);
                                            break;
                                        case "localanchorb":
                                            ((WeldJointDef)mainDef).LocalAnchorB = ReadVector(sn);
                                            break;
                                        }
                                    }
                                    break;
                                case JointType.Gear:
                                    throw new Exception("Gear joint is unsupported");
                                }

                                switch (sn.Name.ToLower())
                                {
                                case "name":
                                    name = sn.Value;
                                    break;
                                case "bodya":
                                    bodyA = int.Parse(sn.Value);
                                    break;
                                case "bodyb":
                                    bodyB = int.Parse(sn.Value);
                                    break;
                                case "collideconnected":
                                    collideConnected = bool.Parse(sn.Value);
                                    break;
                                case "userdata":
                                    userData = ReadSimpleType(sn, null, false);
                                    break;
                                }
                            }

                            mainDef.CollideConnected = collideConnected;
                            mainDef.UserData = userData;
                            _joints.Add(new JointDefSerialized(mainDef, bodyA, bodyB, name));
                        }
                    }
                    break;
                }
            }

            return data;
        }
Example #13
0
        public Breakable()
        {
            // Ground body
            {
                BodyDef bd     = new BodyDef();
                Body    ground = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));
                ground.CreateFixture(shape, 0.0f);
            }

            // Breakable dynamic body

            /*{
             *      BodyDef bd = new BodyDef();
             *      bd.BodyType = BodyType.Dynamic;
             *      bd.Position = new Vec2(0.0f, 40.0f);
             *      bd.Angle = (float)(0.25 * Math.PI);
             *      var m_body1 = m_world.CreateBody(bd);
             *
             *      m_shape1.SetAsBox(0.5f, 0.5f, new Vec2(-0.5f, 0.0f), 0.0f);
             *      var m_piece1 = m_body1.CreateFixture(m_shape1, 1.0f);
             *
             *      m_shape2.SetAsBox(0.5f, 0.5f, new Vec2(0.5f, 0.0f), 0.0f);
             *      var m_piece2 = m_body1.CreateFixture(m_shape2, 1.0f);
             *
             *      m_breaks.Add(new BodyBreaker(m_world, m_body1, m_piece1, m_piece2));
             * }*/
            float y = 2.0f;

            for (int i = 0; i < 3; ++i)
            {
                PolygonShape bottom = new PolygonShape();
                bottom.SetAsBox(1.5f, 0.15f);

                PolygonShape left = new PolygonShape();
                left.SetAsBox(0.15f, 2.7f, new Vec2(-1.45f, 2.35f), 0.2f);

                PolygonShape right = new PolygonShape();
                right.SetAsBox(0.15f, 2.7f, new Vec2(1.45f, 2.35f), -0.2f);

                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(0.0f, y += 3.5f);
                Body bottom_body = m_world.CreateBody(bd);
                var  bf          = bottom_body.CreateFixture(bottom, 4.0f);
                Body left_body   = m_world.CreateBody(bd);
                var  lf          = left_body.CreateFixture(left, 4.0f);
                Body right_body  = m_world.CreateBody(bd);
                var  rf          = right_body.CreateFixture(right, 4.0f);

                WeldJointDef wjd = new WeldJointDef();
                wjd.Initialize(bottom_body, left_body, bd.Position);
                wjd.CollideConnected = false;

                WeldJoint wj1 = (WeldJoint)m_world.CreateJoint(wjd);

                wjd.Initialize(bottom_body, right_body, bd.Position);
                WeldJoint wj2 = (WeldJoint)m_world.CreateJoint(wjd);

                m_breaks.Add(new BreakableJoint(wj1, 100));
                m_breaks.Add(new BreakableJoint(wj2, 100));
            }
        }
Example #14
0
        private CantileverTest()
        {
            Body ground = BodyFactory.CreateEdge(World, new Vector2(-40, 0), new Vector2(40, 0));

            {
                PolygonShape shape = new PolygonShape(20);
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < _count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(-14.5f + 1.0f * i, 5.0f);
                    Body body = BodyFactory.CreateFromDef(World, bd);
                    body.AddFixture(fd);

                    Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 5.0f);
                    jd.Initialize(prevBody, body, anchor);
                    JointFactory.CreateFromDef(World, jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape(20.0f);
                shape.SetAsBox(1.0f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;

                WeldJointDef jd = new WeldJointDef();

                float frequencyHz  = 5.0f;
                float dampingRatio = 0.7f;

                Body prevBody = ground;
                for (int i = 0; i < 3; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(-14.0f + 2.0f * i, 15.0f);
                    Body body = BodyFactory.CreateFromDef(World, bd);
                    body.AddFixture(fd);

                    Vector2 anchor = new Vector2(-15.0f + 2.0f * i, 15.0f);
                    jd.Initialize(prevBody, body, anchor);
                    JointHelper.AngularStiffness(frequencyHz, dampingRatio, jd.BodyA, jd.BodyB, out float stiffness, out float damping);
                    jd.Stiffness = stiffness;
                    jd.Damping   = damping;

                    JointFactory.CreateFromDef(World, jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape(20.0f);
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < _count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(-4.5f + 1.0f * i, 5.0f);
                    Body body = BodyFactory.CreateFromDef(World, bd);
                    body.AddFixture(fd);

                    if (i > 0)
                    {
                        Vector2 anchor = new Vector2(-5.0f + 1.0f * i, 5.0f);
                        jd.Initialize(prevBody, body, anchor);
                        JointFactory.CreateFromDef(World, jd);
                    }

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape(20.0f);
                shape.SetAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;

                WeldJointDef jd           = new WeldJointDef();
                float        frequencyHz  = 8.0f;
                float        dampingRatio = 0.7f;

                Body prevBody = ground;
                for (int i = 0; i < _count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(5.5f + 1.0f * i, 10.0f);
                    Body body = BodyFactory.CreateFromDef(World, bd);
                    body.AddFixture(fd);

                    if (i > 0)
                    {
                        Vector2 anchor = new Vector2(5.0f + 1.0f * i, 10.0f);
                        jd.Initialize(prevBody, body, anchor);

                        JointHelper.AngularStiffness(frequencyHz, dampingRatio, jd.BodyA, jd.BodyB, out float stiffness, out float damping);
                        jd.Stiffness = stiffness;
                        jd.Damping   = damping;

                        JointFactory.CreateFromDef(World, jd);
                    }

                    prevBody = body;
                }
            }

            for (int i = 0; i < 2; ++i)
            {
                Vertices vertices = new Vertices(3);
                vertices.Add(new Vector2(-0.5f, 0.0f));
                vertices.Add(new Vector2(0.5f, 0.0f));
                vertices.Add(new Vector2(0.0f, 1.5f));

                PolygonShape shape = new PolygonShape(vertices, 1.0f);

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;

                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(-8.0f + 8.0f * i, 12.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(fd);
            }

            for (int i = 0; i < 2; ++i)
            {
                CircleShape shape = new CircleShape(0.5f, 1.0f);

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;

                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(-6.0f + 6.0f * i, 10.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(fd);
            }
        }