Ejemplo n.º 1
0
        /// <summary>
        /// Creates a new jump component
        /// </summary>
        /// <param name="world">The Box2D world that will hold this component</param>
        /// <param name="content">Used ContentManager</param>
        /// <param name="pos">The position of this component</param>
        /// <param name="angle">The rotation angle of this component</param>
        /// <param name="width">The width of this component</param>
        /// <param name="height">The height of this component</param>
        public Jump(World world, ContentManager content, Vector2 pos,
                    float angle, float width, float height) :
            base(world, content, pos, angle, width, height)

        {
            Name       = "jump";
            texture    = content.Load <Texture2D>("Images/" + Name);
            origin     = new Vector2(texture.Width * 0.5f, texture.Height * 0.5f);
            sourceRect = new Rectangle(1, 1, texture.Width, texture.Height);
            PolygonShape shape = new PolygonShape();

            Vector2[] vertices = { new Vector2(-width * 0.5f / Level.FACTOR,
                                               height * 0.5f / Level.FACTOR),
                                   new Vector2(width * 0.5f / Level.FACTOR,
                                               -height * 0.5f / Level.FACTOR),
                                   new Vector2(width * 0.5f / Level.FACTOR,
                                               height * 0.5f / Level.FACTOR) };
            shape.Set(vertices, 3);
            body.CreateFixture(shape, 1.0f);
        }
Ejemplo n.º 2
0
        public Body CreateStaticBox(Vector2 position, Vector2 size, string param = null)
        {
            BodyDef bd = new BodyDef();

            bd.type          = BodyType.Static;
            bd.position      = new System.Numerics.Vector2(position.X / 100, position.Y / 100);
            bd.fixedRotation = false;
            bd.gravityScale  = 1.000000000000000e+00f;
            var body = b2DWorld.CreateBody(bd);

            FixtureDef fd = new FixtureDef();

            fd.friction    = 2.000000029802322e-01f;
            fd.restitution = 2.000000029802322e-01f;
            fd.density     = 1.000000000000000e+00f;
            fd.isSensor    = false;
            fd.userData    = param;
            if (param == "floor")
            {
                fd.filter.categoryBits = (ushort)_entityCategory.Floor;
                fd.filter.maskBits     = (ushort)(_entityCategory.Player | _entityCategory.Ball);
            }
            PolygonShape shape = new PolygonShape();

            System.Numerics.Vector2[] vs = new System.Numerics.Vector2[4];

            vs[0] = new Vector2(-(size.X / 2) / 100, -(size.Y / 2) / 100);
            vs[1] = new Vector2((size.X / 2) / 100, -(size.Y / 2) / 100);
            vs[2] = new Vector2((size.X / 2) / 100, (size.Y / 2) / 100);
            vs[3] = new Vector2(-(size.X / 2) / 100, (size.Y / 2) / 100);

            shape.Set(vs);

            fd.shape = shape;

            body.CreateFixture(fd);

            Bodies.Add(body);

            return(body);
        }
Ejemplo n.º 3
0
        void addTri(Vector2 pos)
        {
            var tempBody = new BodyDef();

            tempBody.position = pos - new Vector2(100, 40);
            tempBody.type     = BodyType.Dynamic;
            var tempShape = new PolygonShape();

            Vector2[] triVertices = new Vector2[3];
            triVertices[0] = new Vector2(0, 80);
            triVertices[1] = new Vector2(100, 0);
            triVertices[2] = new Vector2(200, 80);
            tempShape.Set(triVertices, 3);
            var tempFixture = new FixtureDef();

            tempFixture.shape   = tempShape;
            tempFixture.density = 1;
            Body tempFloor = physicsWorld.CreateBody(tempBody);

            tempFloor.CreateFixture(tempFixture);
        }
Ejemplo n.º 4
0
        private EdgeShapeBenchmark()
        {
            // Ground body
            {
                Body ground = BodyFactory.CreateBody(World);

                float x1 = -20.0f;
                float y1 = 2.0f * (float)Math.Cos(x1 / 10.0f * (float)Math.PI);
                for (int i = 0; i < 80; ++i)
                {
                    float x2 = x1 + 0.5f;
                    float y2 = 2.0f * (float)Math.Cos(x2 / 10.0f * (float)Math.PI);

                    EdgeShape shape = new EdgeShape(new Vector2(x1, y1), new Vector2(x2, y2));
                    ground.CreateFixture(shape);

                    x1 = x2;
                    y1 = y2;
                }
            }

            const float w = 1.0f;
            const float t = 2.0f;
            float       b = w / (2.0f + (float)Math.Sqrt(t));
            float       s = (float)Math.Sqrt(t) * b;

            Vertices vertices = new Vertices(8);

            vertices.Add(new Vector2(0.5f * s, 0.0f));
            vertices.Add(new Vector2(0.5f * w, b));
            vertices.Add(new Vector2(0.5f * w, b + s));
            vertices.Add(new Vector2(0.5f * s, w));
            vertices.Add(new Vector2(-0.5f * s, w));
            vertices.Add(new Vector2(-0.5f * w, b + s));
            vertices.Add(new Vector2(-0.5f * w, b));
            vertices.Add(new Vector2(-0.5f * s, 0.0f));

            _polyShape = new PolygonShape(20);
            _polyShape.Set(vertices);
        }
Ejemplo n.º 5
0
        /// <inheritdoc />
        protected override void PostStep()
        {
            //            Shape.Set(m_points);
            DrawString("Press g to generate a new random convex hull");

            // Todo
            var shape = new PolygonShape();

            shape.Set(m_points);
            var drawLine = new Vector2[shape.Count + 1];

            Array.Copy(shape.Vertices, drawLine, shape.Count);
            drawLine[drawLine.Length - 1] = shape.Vertices[0];
            Drawer.DrawPolygon(drawLine, drawLine.Length, Color.FromArgb(230, 230, 230));
            _contents.Clear();

            var points = m_points.Select(e => MainCamera.WorldToScreenPoint(e.ToUnityVector2()))
                         .Select(e => new UnityEngine.Vector2(e.x, Screen.height - e.y))
                         .ToArray();

            for (var i = 0; i < m_count; ++i)
            {
                Drawer.DrawPoint(m_points[i], 10.0f, Color.FromArgb(77, 230, 77));

                WriteString(points[i] + new UnityEngine.Vector2(0.5f, 0.5f), $"{i}");
            }

            Drawer.DrawPoint(Vector2.Zero, 5f, Color.Yellow);

            //
            // if (shape.Validate() == false)
            // {
            //     //m_textLine += 0;
            // }

            if (m_auto)
            {
                Generate();
            }
        }
Ejemplo n.º 6
0
        public Body CreateStaticBoxSensor(Vector2 position, Vector2 size, string param = null)
        {
            BodyDef bd = new BodyDef();

            bd.type          = BodyType.Static;
            bd.position      = new System.Numerics.Vector2(position.X / 100, position.Y / 100);
            bd.fixedRotation = false;
            bd.gravityScale  = 1.000000000000000e+00f;
            var body = b2DWorld.CreateBody(bd);

            FixtureDef fd = new FixtureDef();

            fd.friction    = 2.000000029802322e-01f;
            fd.restitution = 2.000000029802322e-01f;
            fd.density     = 1.000000000000000e+00f;
            fd.isSensor    = true;
            fd.userData    = param;

            PolygonShape shape = new PolygonShape();

            System.Numerics.Vector2[] vs = new System.Numerics.Vector2[4];

            vs[0] = new System.Numerics.Vector2(-(size.X / 2) / 100, -(size.Y / 2) / 100);
            vs[1] = new System.Numerics.Vector2((size.X / 2) / 100, -(size.Y / 2) / 100);
            vs[2] = new System.Numerics.Vector2((size.X / 2) / 100, (size.Y / 2) / 100);
            vs[3] = new System.Numerics.Vector2(-(size.X / 2) / 100, (size.Y / 2) / 100);

            shape.Set(vs);

            fd.shape = shape;

            fd.shape = shape;

            body.CreateFixture(fd);

            Bodies.Add(body);

            return(body);
        }
Ejemplo n.º 7
0
        public Body CreateStaticTriangle(Vector2 position)
        {
            BodyDef bd = new BodyDef();

            bd.type          = BodyType.Static;
            bd.position      = new System.Numerics.Vector2(position.X / 100, position.Y / 100);
            bd.fixedRotation = false;

            bd.gravityScale = 1.000000000000000e+00f;
            var body = b2DWorld.CreateBody(bd);

            FixtureDef fd = new FixtureDef();

            fd.friction    = 2.000000029802322e-01f;
            fd.restitution = 2.000000029802322e-01f;
            fd.density     = 1.000000000000000e+00f;
            fd.isSensor    = false;


            PolygonShape shape = new PolygonShape();

            System.Numerics.Vector2[] vs = new System.Numerics.Vector2[3];

            vs[0] = new System.Numerics.Vector2(0, -(33f / 2f) / 100f);
            vs[1] = new System.Numerics.Vector2(-(33f / 2f) / 100f, (33f / 2f) / 100f);
            vs[2] = new System.Numerics.Vector2((33f / 2f) / 100f, (33f / 2f) / 100f);

            shape.Set(vs);

            fd.shape = shape;

            fd.shape = shape;
            body.CreateFixture(fd);
            Bodies.Add(body);

            return(body);
        }
Ejemplo n.º 8
0
        public ApplyForce()
        {
            World.Gravity = new Vector2(0.0f, 0.0f);

            const float restitution = 0.4f;

            Body ground;
            {
                var bd = new BodyDef();
                bd.Position.Set(0.0f, 20.0f);
                ground = World.CreateBody(bd);

                var shape = new EdgeShape();

                var sd = new FixtureDef();
                sd.Shape       = shape;
                sd.Density     = 0.0f;
                sd.Restitution = restitution;

                // Left vertical
                shape.Set(new Vector2(-20.0f, -20.0f), new Vector2(-20.0f, 20.0f));
                ground.CreateFixture(sd);

                // Right vertical
                shape.Set(new Vector2(20.0f, -20.0f), new Vector2(20.0f, 20.0f));
                ground.CreateFixture(sd);

                // Top horizontal
                shape.Set(new Vector2(-20.0f, 20.0f), new Vector2(20.0f, 20.0f));
                ground.CreateFixture(sd);

                // Bottom horizontal
                shape.Set(new Vector2(-20.0f, -20.0f), new Vector2(20.0f, -20.0f));
                ground.CreateFixture(sd);
            }

            {
                var xf1 = new Transform();
                xf1.Rotation.Set(0.3524f * Settings.Pi);
                xf1.Position = xf1.Rotation.GetXAxis();

                var vertices = new Vector2[3];
                vertices[0] = MathUtils.Mul(xf1, new Vector2(-1.0f, 0.0f));
                vertices[1] = MathUtils.Mul(xf1, new Vector2(1.0f, 0.0f));
                vertices[2] = MathUtils.Mul(xf1, new Vector2(0.0f, 0.5f));

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

                var sd1 = new FixtureDef();
                sd1.Shape   = poly1;
                sd1.Density = 2.0f;

                var xf2 = new Transform();
                xf2.Rotation.Set(-0.3524f * Settings.Pi);
                xf2.Position = -xf2.Rotation.GetXAxis();

                vertices[0] = MathUtils.Mul(xf2, new Vector2(-1.0f, 0.0f));
                vertices[1] = MathUtils.Mul(xf2, new Vector2(1.0f, 0.0f));
                vertices[2] = MathUtils.Mul(xf2, new Vector2(0.0f, 0.5f));

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

                var sd2 = new FixtureDef();
                sd2.Shape   = poly2;
                sd2.Density = 2.0f;

                var bd = new BodyDef();
                bd.BodyType   = BodyType.DynamicBody;
                bd.Position   = new Vector2(0.0f, 3.0f);
                bd.Angle      = Settings.Pi;
                bd.AllowSleep = false;
                _body         = World.CreateBody(bd);
                _body.CreateFixture(sd1);
                _body.CreateFixture(sd2);

                var gravity = 10.0f;
                var I       = _body.Inertia;
                var mass    = _body.Mass;

                // Compute an effective radius that can be used to
                // set the max torque for a friction joint
                // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m)
                var radius = (float)Math.Sqrt(2.0f * I / mass);

                FrictionJointDef jd = new FrictionJointDef();
                jd.BodyA = ground;
                jd.BodyB = _body;
                jd.LocalAnchorA.SetZero();
                jd.LocalAnchorB     = _body.GetLocalCenter();
                jd.CollideConnected = true;
                jd.MaxForce         = 0.5f * mass * gravity;
                jd.MaxTorque        = 0.2f * mass * radius * gravity;

                World.CreateJoint(jd);
            }

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

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

                for (var i = 0; i < 10; ++i)
                {
                    var bd = new BodyDef();
                    bd.BodyType = BodyType.DynamicBody;

                    bd.Position.Set(0.0f, 7.0f + 1.54f * i);
                    var body = World.CreateBody(bd);

                    body.CreateFixture(fd);

                    var gravity = 10.0f;
                    var I       = body.Inertia;
                    var mass    = body.Mass;

                    // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m)
                    var radius = (float)Math.Sqrt(2.0f * I / mass);

                    var jd = new FrictionJointDef();
                    jd.LocalAnchorA.SetZero();
                    jd.LocalAnchorB.SetZero();
                    jd.BodyA            = ground;
                    jd.BodyB            = body;
                    jd.CollideConnected = true;
                    jd.MaxForce         = mass * gravity;
                    jd.MaxTorque        = 0.1f * mass * radius * gravity;

                    World.CreateJoint(jd);
                }
            }
        }
Ejemplo n.º 9
0
        public Bridge()
        {
            Body ground;

            {
                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);
            }

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

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

                var jd = new RevoluteJointDef();

                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);

                    if (i == Count >> 1)
                    {
                        _middle = body;
                    }

                    prevBody = body;
                }

                {
                    var anchor = new Vector2(-15.0f + 1.0f * Count, 5.0f);
                    jd.Initialize(prevBody, ground, anchor);
                    World.CreateJoint(jd);
                }
            }

            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 < 3; ++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);
            }
        }
Ejemplo n.º 10
0
        public DumpLoader()
        {
            //Source code dump of Box2D scene: issue304-minimal-case.rube
            //
            //  Created by R.U.B.E 1.3.0
            //  Using Box2D version 2.3.0
            //  Wed April 3 2013 04:33:28
            //
            //  This code is originally intended for use in the Box2D testbed,
            //  but you can easily use it in other applications by providing
            //  a World for use as the 'World' variable in the code below.

            Vector2 g = new Vector2(0.000000000000000e+00f, -1.000000000000000e+01f);

            World.Gravity = g;
            Body[]  bodies = new Body[3];
            Joint[] joints = new Joint[0];
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = (BodyType)0;
                bd.Position.Set(2.587699890136719e-02f, 5.515012264251709e+00f);
                bd.Angle = 0.000000000000000e+00f;
                bd.LinearVelocity.Set(0.000000000000000e+00f, 0.000000000000000e+00f);
                bd.AngularVelocity = 0.000000000000000e+00f;
                bd.LinearDamping   = 0.000000000000000e+00f;
                bd.AngularDamping  = 0.000000000000000e+00f;
                bd.AllowSleep      = true;
                bd.Awake           = true;
                bd.FixedRotation   = false;
                bd.Bullet          = false;
                bd.Enabled         = true;
                bd.GravityScale    = 1.000000000000000e+00f;
                bodies[0]          = World.CreateBody(bd);

                {
                    FixtureDef fd = new FixtureDef();
                    fd.Friction            = 2.000000029802322e-01f;
                    fd.Restitution         = 0.000000000000000e+00f;
                    fd.Density             = 1.000000000000000e+00f;
                    fd.IsSensor            = false;
                    fd.Filter.CategoryBits = (1);
                    fd.Filter.MaskBits     = (65535);
                    fd.Filter.GroupIndex   = (0);
                    PolygonShape shape = new PolygonShape();
                    Vector2[]    vs    = new Vector2[8];
                    vs[0].Set(7.733039855957031e-01f, -1.497260034084320e-01f);
                    vs[1].Set(-4.487270116806030e-01f, 1.138330027461052e-01f);
                    vs[2].Set(-1.880589962005615e+00f, -1.365900039672852e-01f);
                    vs[3].Set(3.972740173339844e-01f, -3.897832870483398e+00f);
                    shape.Set(vs, 4);

                    fd.Shape = shape;

                    bodies[0].CreateFixture(fd);
                }
            }
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = (BodyType)(2);
                bd.Position.Set(-3.122138977050781e-02f, 7.535382270812988e+00f);
                bd.Angle = -1.313644275069237e-02f;
                bd.LinearVelocity.Set(8.230687379837036e-01f, 7.775862514972687e-02f);
                bd.AngularVelocity = 3.705333173274994e-02f;
                bd.LinearDamping   = 0.000000000000000e+00f;
                bd.AngularDamping  = 0.000000000000000e+00f;
                bd.AllowSleep      = true;
                bd.Awake           = true;
                bd.FixedRotation   = false;
                bd.Bullet          = false;
                bd.Enabled         = true;
                bd.GravityScale    = 1.000000000000000e+00f;
                bodies[1]          = World.CreateBody(bd);

                {
                    FixtureDef fd = new FixtureDef();
                    fd.Friction            = 5.000000000000000e-01f;
                    fd.Restitution         = 0.000000000000000e+00f;
                    fd.Density             = 5.000000000000000e+00f;
                    fd.IsSensor            = false;
                    fd.Filter.CategoryBits = (1);
                    fd.Filter.MaskBits     = (65535);
                    fd.Filter.GroupIndex   = (0);
                    PolygonShape shape = new PolygonShape();
                    Vector2[]    vs    = new Vector2[8];
                    vs[0].Set(3.473900079727173e+00f, -2.009889930486679e-01f);
                    vs[1].Set(3.457079887390137e+00f, 3.694039955735207e-02f);
                    vs[2].Set(-3.116359949111938e+00f, 2.348500071093440e-03f);
                    vs[3].Set(-3.109960079193115e+00f, -3.581250011920929e-01f);
                    vs[4].Set(-2.590820074081421e+00f, -5.472509860992432e-01f);
                    vs[5].Set(2.819370031356812e+00f, -5.402340292930603e-01f);
                    shape.Set(vs, 6);

                    fd.Shape = shape;

                    bodies[1].CreateFixture(fd);
                }
            }
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = (BodyType)(2);
                bd.Position.Set(-7.438077926635742e-01f, 6.626811981201172e+00f);
                bd.Angle = -1.884713363647461e+01f;
                bd.LinearVelocity.Set(1.785794943571091e-01f, 3.799796104431152e-07f);
                bd.AngularVelocity = -5.908820639888290e-06f;
                bd.LinearDamping   = 0.000000000000000e+00f;
                bd.AngularDamping  = 0.000000000000000e+00f;
                bd.AllowSleep      = true;
                bd.Awake           = true;
                bd.FixedRotation   = false;
                bd.Bullet          = false;
                bd.Enabled         = true;
                bd.GravityScale    = 1.000000000000000e+00f;
                bodies[2]          = World.CreateBody(bd);

                {
                    FixtureDef fd = new FixtureDef();
                    fd.Friction            = 9.499999880790710e-01f;
                    fd.Restitution         = 0.000000000000000e+00f;
                    fd.Density             = 1.000000000000000e+01f;
                    fd.IsSensor            = false;
                    fd.Filter.CategoryBits = (1);
                    fd.Filter.MaskBits     = (65535);
                    fd.Filter.GroupIndex   = (-3);
                    PolygonShape shape = new PolygonShape();
                    Vector2[]    vs    = new Vector2[8];
                    vs[0].Set(1.639146506786346e-01f, 4.428443685173988e-02f);
                    vs[1].Set(-1.639146655797958e-01f, 4.428443685173988e-02f);
                    vs[2].Set(-1.639146655797958e-01f, -4.428443312644958e-02f);
                    vs[3].Set(1.639146357774734e-01f, -4.428444057703018e-02f);
                    shape.Set(vs, 4);

                    fd.Shape = shape;

                    bodies[2].CreateFixture(fd);
                }
            }

            joints = null;
            bodies = null;
        }
Ejemplo n.º 11
0
        public CharacterCollision()
        {
            // Ground body
            {
                var bd     = new BodyDef();
                var ground = World.CreateBody(bd);

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

            // Collinear edges with no adjacency information.
            // This shows the problematic case where a box shape can hit
            // an internal vertex.
            {
                var bd     = new BodyDef();
                var ground = World.CreateBody(bd);

                var shape = new EdgeShape();
                shape.Set(new Vector2(-8.0f, 1.0f), new Vector2(-6.0f, 1.0f));
                ground.CreateFixture(shape, 0.0f);
                shape.Set(new Vector2(-6.0f, 1.0f), new Vector2(-4.0f, 1.0f));
                ground.CreateFixture(shape, 0.0f);
                shape.Set(new Vector2(-4.0f, 1.0f), new Vector2(-2.0f, 1.0f));
                ground.CreateFixture(shape, 0.0f);
            }

            // Chain shape
            {
                var bd = new BodyDef {
                    Angle = 0.25f * Settings.Pi
                };
                var ground = World.CreateBody(bd);

                var vs = new Vector2[4]
                {
                    new Vector2(5.0f, 7.0f),
                    new Vector2(6.0f, 8.0f),
                    new Vector2(7.0f, 8.0f),
                    new Vector2(8.0f, 7.0f)
                };
                var shape = new ChainShape();
                shape.CreateChain(vs);
                ground.CreateFixture(shape, 0.0f);
            }

            // Square tiles. This shows that adjacency shapes may
            // have non-smooth collision. There is no solution
            // to this problem.
            {
                var bd     = new BodyDef();
                var ground = World.CreateBody(bd);

                var shape = new PolygonShape();
                shape.SetAsBox(1.0f, 1.0f, new Vector2(4.0f, 3.0f), 0.0f);
                ground.CreateFixture(shape, 0.0f);
                shape.SetAsBox(1.0f, 1.0f, new Vector2(6.0f, 3.0f), 0.0f);
                ground.CreateFixture(shape, 0.0f);
                shape.SetAsBox(1.0f, 1.0f, new Vector2(8.0f, 3.0f), 0.0f);
                ground.CreateFixture(shape, 0.0f);
            }

            // Square made from an edge loop. Collision should be smooth.
            {
                var bd     = new BodyDef();
                var ground = World.CreateBody(bd);

                var vs = new Vector2[4]
                {
                    new Vector2(-1.0f, 3.0f),
                    new Vector2(1.0f, 3.0f),
                    new Vector2(1.0f, 5.0f),
                    new Vector2(-1.0f, 5.0f)
                };

                var shape = new ChainShape();
                shape.CreateLoop(vs);
                ground.CreateFixture(shape, 0.0f);
            }

            // Edge loop. Collision should be smooth.
            {
                var bd = new BodyDef {
                    Position = new Vector2(-10.0f, 4.0f)
                };
                var ground = World.CreateBody(bd);

                var vs = new Vector2[10]
                {
                    new Vector2(0.0f, 0.0f),
                    new Vector2(6.0f, 0.0f),
                    new Vector2(6.0f, 2.0f),
                    new Vector2(4.0f, 1.0f),
                    new Vector2(2.0f, 2.0f),
                    new Vector2(0.0f, 2.0f),
                    new Vector2(-2.0f, 2.0f),
                    new Vector2(-4.0f, 3.0f),
                    new Vector2(-6.0f, 2.0f),
                    new Vector2(-6.0f, 0.0f)
                };
                var shape = new ChainShape();
                shape.CreateLoop(vs);
                ground.CreateFixture(shape, 0.0f);
            }

            // Square character 1
            {
                var bd = new BodyDef
                {
                    Position      = new Vector2(-3.0f, 8.0f),
                    BodyType      = BodyType.DynamicBody,
                    FixedRotation = true,
                    AllowSleep    = false
                };

                var body = World.CreateBody(bd);

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

                var fd = new FixtureDef {
                    Shape = shape, Density = 20.0f
                };
                body.CreateFixture(fd);
            }

            // Square character 2
            {
                var bd = new BodyDef
                {
                    Position      = new Vector2(-5.0f, 5.0f),
                    BodyType      = BodyType.DynamicBody,
                    FixedRotation = true,
                    AllowSleep    = false
                };

                var body = World.CreateBody(bd);

                var shape = new PolygonShape();
                shape.SetAsBox(0.25f, 0.25f);

                var fd = new FixtureDef {
                    Shape = shape, Density = 20.0f
                };
                body.CreateFixture(fd);
            }

            // Hexagon character
            {
                var bd = new BodyDef
                {
                    Position      = new Vector2(-5.0f, 8.0f),
                    BodyType      = BodyType.DynamicBody,
                    FixedRotation = true,
                    AllowSleep    = false
                };

                var body = World.CreateBody(bd);

                var         angle    = 0.0f;
                const float delta    = Settings.Pi / 3.0f;
                var         vertices = new Vector2[6];
                for (var i = 0; i < 6; ++i)
                {
                    vertices[i].Set(0.5f * (float)Math.Cos(angle), 0.5f * (float)Math.Sin(angle));
                    angle += delta;
                }

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

                var fd = new FixtureDef {
                    Shape = shape, Density = 20.0f
                };
                body.CreateFixture(fd);
            }

            // Circle character
            {
                var bd = new BodyDef
                {
                    Position      = new Vector2(3.0f, 5.0f),
                    BodyType      = BodyType.DynamicBody,
                    FixedRotation = true,
                    AllowSleep    = false
                };

                var body = World.CreateBody(bd);

                var shape = new CircleShape {
                    Radius = 0.5f
                };

                var fd = new FixtureDef {
                    Shape = shape, Density = 20.0f
                };
                body.CreateFixture(fd);
            }

            // Circle character
            {
                var bd = new BodyDef
                {
                    Position   = new Vector2(-7.0f, 6.0f),
                    BodyType   = BodyType.DynamicBody,
                    AllowSleep = false
                };

                _character = World.CreateBody(bd);

                var shape = new CircleShape {
                    Radius = 0.25f
                };

                var fd = new FixtureDef
                {
                    Shape    = shape,
                    Density  = 20.0f,
                    Friction = 1.0f
                };
                _character.CreateFixture(fd);
            }
        }
Ejemplo n.º 12
0
        private CCDTest()
        {
            {
                Body body = BodyFactory.CreateBody(World);
                body.Position = new Vector2(0.0f, -0.2f);

                Vertices     box   = PolygonTools.CreateRectangle(10, 0.2f);
                PolygonShape shape = new PolygonShape(box, 0);

                body.CreateFixture(shape);

                box = PolygonTools.CreateRectangle(0.2f, 1.0f, new Vector2(0.5f, 1.2f), 0.0f);
                shape.Set(box);
                body.CreateFixture(shape);
            }

            {
                Vertices     box   = PolygonTools.CreateRectangle(2, 0.1f);
                PolygonShape shape = new PolygonShape(box, 1);

                _angularVelocity = Rand.RandomFloat(-50.0f, 50.0f);
                _angularVelocity = -30.669577f;

                Body body = BodyFactory.CreateBody(World);
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(0.0f, 20.0f);

                Fixture fixture = body.CreateFixture(shape);
                fixture.Restitution  = 0.0f;
                body.LinearVelocity  = new Vector2(0.0f, -100.0f);
                body.AngularVelocity = _angularVelocity;
            }
#if false
            {
                FixtureDef fd = new FixtureDef();
                fd.SetAsBox(10.0f, 0.1f);
                fd.density = 0.0f;


                bd.BodyType = BodyDef.e_static;
                bd.position = new Vector2(0.0f, -0.2f);
                Body ground = _world.CreateBody();
                ground.CreateFixture(fd);
            }

            {
                FixtureDef fd = new FixtureDef();
                fd.SetAsBox(2.0f, 0.1f);
                fd.density     = 1.0f;
                fd.restitution = 0.0f;

                BodyDef bd1;
                bd1.type       = BodyDef.e_dynamic;
                bd1.bullet     = true;
                bd1.allowSleep = false;
                bd1.position   = new Vector2(0.0f, 20.0f);
                Body b1 = _world.Create(bd1);
                b1.CreateFixture(fd);
                b1.SetLinearVelocity(new Vector2(0.0f, -100.0f));

                fd.SetAsBox(1.0f, 0.1f);
                BodyDef bd2;
                bd2.type       = BodyDef.e_dynamic;
                bd2.bullet     = true;
                bd2.allowSleep = false;
                bd2.position   = new Vector2(0.0f, 20.2f);
                Body b2 = _world.Create(bd2);
                b2.CreateFixture(fd);
                b2.SetLinearVelocity(new Vector2(0.0f, -100.0f));

                fd.SetAsBox(0.25f, 0.25f);
                fd.density = 10.0f;
                BodyDef bd3;
                bd3.type       = BodyDef.e_dynamic;
                bd3.bullet     = true;
                bd3.allowSleep = false;
                bd3.position   = new Vector2(0.0f, 100.0f);
                Body b3 = _world.Create(bd3);
                b3.CreateFixture(fd);
                b3.SetLinearVelocity(new Vector2(0.0f, -150.0f));
            }
#elif false
            float k_restitution = 1.4f;

            {
                bd.position = new Vector2(0.0f, 20.0f);
                Body body = _world.CreateBody();

                FixtureDef fd = new FixtureDef();
                fd.density     = 0.0f;
                fd.restitution = k_restitution;

                fd.SetAsBox(0.1f, 10.0f, new Vector2(-10.0f, 0.0f), 0.0f);
                body.CreateFixture(fd);

                fd.SetAsBox(0.1f, 10.0f, new Vector2(10.0f, 0.0f), 0.0f);
                body.CreateFixture(fd);

                fd.SetAsBox(0.1f, 10.0f, new Vector2(0.0f, -10.0f), 0.5f * FarseerPhysics.Settings.b2_pi);
                body.CreateFixture(fd);

                fd.SetAsBox(0.1f, 10.0f, new Vector2(0.0f, 10.0f), -0.5f * FarseerPhysics.Settings.b2_pi);
                body.CreateFixture(fd);
            }

#if false
            {
                FixtureDef sd_bottom;
                sd_bottom.SetAsBox(1.0f, 0.1f, new Vector2(0.0f, -1.0f), 0.0f);
                sd_bottom.density = 4.0f;

                FixtureDef sd_top;
                sd_top.SetAsBox(1.0f, 0.1f, new Vector2(0.0f, 1.0f), 0.0f);
                sd_top.density = 4.0f;

                FixtureDef sd_left;
                sd_left.SetAsBox(0.1f, 1.0f, new Vector2(-1.0f, 0.0f), 0.0f);
                sd_left.density = 4.0f;

                FixtureDef sd_right;
                sd_right.SetAsBox(0.1f, 1.0f, new Vector2(1.0f, 0.0f), 0.0f);
                sd_right.density = 4.0f;


                bd.BodyType = BodyDef.e_dynamicBody;
                bd.position = new Vector2(0.0f, 15.0f);
                Body body = _world.CreateBody();
                body.CreateFixture(&sd_bottom);
                body.CreateFixture(&sd_top);
                body.CreateFixture(&sd_left);
                body.CreateFixture(&sd_right);
            }
#elif false
            {
                FixtureDef sd_bottom;
                sd_bottom.SetAsBox(1.5f, 0.15f);
                sd_bottom.density = 4.0f;

                FixtureDef sd_left;
                sd_left.SetAsBox(0.15f, 2.7f, new Vector2(-1.45f, 2.35f), 0.2f);
                sd_left.density = 4.0f;

                FixtureDef sd_right;
                sd_right.SetAsBox(0.15f, 2.7f, new Vector2(1.45f, 2.35f), -0.2f);
                sd_right.density = 4.0f;


                bd.position = new Vector2(0.0f, 15.0f);
                Body body = _world.CreateBody();
                body.CreateFixture(&sd_bottom);
                body.CreateFixture(&sd_left);
                body.CreateFixture(&sd_right);
            }
#else
            {
                bd.position = new Vector2(-5.0f, 20.0f);
                bd.bullet   = true;
                Body body = _world.CreateBody();
                body.SetAngularVelocity(Rand.RandomFloat(-50.0f, 50.0f));

                FixtureDef fd = new FixtureDef();
                fd.SetAsBox(0.1f, 4.0f);
                fd.density     = 1.0f;
                fd.restitution = 0.0f;
                body.CreateFixture(fd);
            }
#endif

            for (int i = 0; i < 0; ++i)
            {
                bd.position = new Vector2(0.0f, 15.0f + i);
                bd.bullet   = true;
                Body body = _world.CreateBody();
                body.SetAngularVelocity(Rand.RandomFloat(-50.0f, 50.0f));

                FixtureDef fd = new FixtureDef();
                fd.radius      = 0.25f;
                fd.density     = 1.0f;
                fd.restitution = 0.0f;
                body.CreateFixture(fd);
            }
#endif
        }
Ejemplo n.º 13
0
        public CompoundShapes()
        {
            {
                BodyDef bd = new BodyDef();
                bd.Position.Set(0.0f, 0.0f);
                Body body = World.CreateBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.SetTwoSided(new Vector2(50.0f, 0.0f), new Vector2(-50.0f, 0.0f));

                body.CreateFixture(shape, 0.0f);
            }

            // Table 1
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.DynamicBody;
                bd.Position.Set(-15.0f, 1.0f);
                m_table1 = World.CreateBody(bd);

                PolygonShape top = new PolygonShape();
                top.SetAsBox(3.0f, 0.5f, new Vector2(0.0f, 3.5f), 0.0f);

                PolygonShape leftLeg = new PolygonShape();
                leftLeg.SetAsBox(0.5f, 1.5f, new Vector2(-2.5f, 1.5f), 0.0f);

                PolygonShape rightLeg = new PolygonShape();
                rightLeg.SetAsBox(0.5f, 1.5f, new Vector2(2.5f, 1.5f), 0.0f);

                m_table1.CreateFixture(top, 2.0f);
                m_table1.CreateFixture(leftLeg, 2.0f);
                m_table1.CreateFixture(rightLeg, 2.0f);
            }

            // Table 2
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.DynamicBody;
                bd.Position.Set(-5.0f, 1.0f);
                m_table2 = World.CreateBody(bd);

                PolygonShape top = new PolygonShape();
                top.SetAsBox(3.0f, 0.5f, new Vector2(0.0f, 3.5f), 0.0f);

                PolygonShape leftLeg = new PolygonShape();
                leftLeg.SetAsBox(0.5f, 2.0f, new Vector2(-2.5f, 2.0f), 0.0f);

                PolygonShape rightLeg = new PolygonShape();
                rightLeg.SetAsBox(0.5f, 2.0f, new Vector2(2.5f, 2.0f), 0.0f);

                m_table2.CreateFixture(top, 2.0f);
                m_table2.CreateFixture(leftLeg, 2.0f);
                m_table2.CreateFixture(rightLeg, 2.0f);
            }

            // Spaceship 1
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.DynamicBody;
                bd.Position.Set(5.0f, 1.0f);
                m_ship1 = World.CreateBody(bd);

                Vector2[] vertices = new Vector2[3];

                PolygonShape left = new PolygonShape();
                vertices[0].Set(-2.0f, 0.0f);
                vertices[1].Set(0.0f, 4.0f / 3.0f);
                vertices[2].Set(0.0f, 4.0f);
                left.Set(vertices, 3);

                PolygonShape right = new PolygonShape();
                vertices[0].Set(2.0f, 0.0f);
                vertices[1].Set(0.0f, 4.0f / 3.0f);
                vertices[2].Set(0.0f, 4.0f);
                right.Set(vertices, 3);

                m_ship1.CreateFixture(left, 2.0f);
                m_ship1.CreateFixture(right, 2.0f);
            }

            // Spaceship 2
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.DynamicBody;
                bd.Position.Set(15.0f, 1.0f);
                m_ship2 = World.CreateBody(bd);

                Vector2[] vertices = new Vector2[3];

                PolygonShape left = new PolygonShape();
                vertices[0].Set(-2.0f, 0.0f);
                vertices[1].Set(1.0f, 2.0f);
                vertices[2].Set(0.0f, 4.0f);
                left.Set(vertices, 3);

                PolygonShape right = new PolygonShape();
                vertices[0].Set(2.0f, 0.0f);
                vertices[1].Set(-1.0f, 2.0f);
                vertices[2].Set(0.0f, 4.0f);
                right.Set(vertices, 3);

                m_ship2.CreateFixture(left, 2.0f);
                m_ship2.CreateFixture(right, 2.0f);
            }
        }
Ejemplo n.º 14
0
        void CreateLeg(float s, Vector2 wheelAnchor)
        {
            Vector2 p1 = new Vector2(5.4f * s, -6.1f);
            Vector2 p2 = new Vector2(7.2f * s, -1.2f);
            Vector2 p3 = new Vector2(4.3f * s, -1.9f);
            Vector2 p4 = new Vector2(3.1f * s, 0.8f);
            Vector2 p5 = new Vector2(6.0f * s, 1.5f);
            Vector2 p6 = new Vector2(2.5f * s, 3.7f);

            FixtureDef fd1 = new FixtureDef();
            FixtureDef fd2 = new FixtureDef();

            fd1.filter.groupIndex = -1;
            fd2.filter.groupIndex = -1;
            fd1.density = 1.0f;
            fd2.density = 1.0f;

            PolygonShape poly1 = new PolygonShape();
            PolygonShape poly2 = new PolygonShape();

            Vector2[] vertices = new Vector2[3];

            if (s > 0.0f)
            {
                vertices[0] = p1;
                vertices[1] = p2;
                vertices[2] = p3;
                poly1.Set(vertices, 3);

                vertices[0] = Vector2.Zero;
                vertices[1] = p5 - p4;
                vertices[2] = p6 - p4;
                poly2.Set(vertices, 3);
            }
            else
            {
                vertices[0] = p1;
                vertices[1] = p3;
                vertices[2] = p2;
                poly1.Set(vertices, 3);

                vertices[0] = Vector2.Zero;
                vertices[1] = p6 - p4;
                vertices[2] = p5 - p4;
                poly2.Set(vertices, 3);
            }

            fd1.shape = poly1;
            fd2.shape = poly2;

            BodyDef bd1 = new BodyDef();
            BodyDef bd2 = new BodyDef();
            bd1.type = BodyType.Dynamic;
            bd2.type = BodyType.Dynamic;

            bd1.position = _offset;
            bd2.position = p4 + _offset;

            bd1.angularDamping = 10.0f;
            bd2.angularDamping = 10.0f;

            Body body1 = _world.CreateBody(bd1);
            Body body2 = _world.CreateBody(bd2);

            body1.CreateFixture(fd1);
            body2.CreateFixture(fd2);

            DistanceJointDef djd = new DistanceJointDef();

            // Using a soft distanceraint can reduce some jitter.
            // It also makes the structure seem a bit more fluid by
            // acting like a suspension system.
            djd.dampingRatio = 0.5f;
            djd.frequencyHz = 10.0f;

            djd.Initialize(body1, body2, p2 + _offset, p5 + _offset);
            _world.CreateJoint(djd);

            djd.Initialize(body1, body2, p3 + _offset, p4 + _offset);
            _world.CreateJoint(djd);

            djd.Initialize(body1, _wheel, p3 + _offset, wheelAnchor + _offset);
            _world.CreateJoint(djd);

            djd.Initialize(body2, _wheel, p6 + _offset, wheelAnchor + _offset);
            _world.CreateJoint(djd);

            RevoluteJointDef rjd = new RevoluteJointDef();

            rjd.Initialize(body2, _chassis, p4 + _offset);
            _world.CreateJoint(rjd);
        }
Ejemplo n.º 15
0
        public ApplyForce()
        {
            _world.Gravity = new Vector2(0.0, 0.0);

            const double k_restitution = 0.4;

            Body ground;
            {
                BodyDef bd = new BodyDef();
                bd.position = new Vector2(0.0f, 20.0f);
                ground      = _world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();

                FixtureDef sd = new FixtureDef();
                sd.shape       = shape;
                sd.density     = 0.0f;
                sd.restitution = k_restitution;

                // Left vertical
                shape.SetAsEdge(new Vector2(-20.0f, -20.0f), new Vector2(-20.0f, 20.0f));
                ground.CreateFixture(sd);

                // Right vertical
                shape.SetAsEdge(new Vector2(20.0f, -20.0f), new Vector2(20.0f, 20.0f));
                ground.CreateFixture(sd);

                // Top horizontal
                shape.SetAsEdge(new Vector2(-20.0f, 20.0f), new Vector2(20.0f, 20.0f));
                ground.CreateFixture(sd);

                // Bottom horizontal
                shape.SetAsEdge(new Vector2(-20.0f, -20.0f), new Vector2(20.0f, -20.0f));
                ground.CreateFixture(sd);
            }

            {
                Alt.Box2D.Transform xf1 = new Alt.Box2D.Transform();
                xf1.R.Set(0.3524 * Alt.Box2D.Settings.b2_pi);
                xf1.Position = MathUtils.Multiply(ref xf1.R, new Vector2(1.0f, 0.0f));

                Vector2[] vertices = new Vector2[3];
                vertices[0] = MathUtils.Multiply(ref xf1, new Vector2(-1.0f, 0.0f));
                vertices[1] = MathUtils.Multiply(ref xf1, new Vector2(1.0f, 0.0f));
                vertices[2] = MathUtils.Multiply(ref xf1, new Vector2(0.0f, 0.5f));

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

                FixtureDef sd1 = new FixtureDef();
                sd1.shape   = poly1;
                sd1.density = 4.0f;

                Alt.Box2D.Transform xf2 = new Alt.Box2D.Transform();
                xf2.R.Set(-0.3524 * Alt.Box2D.Settings.b2_pi);
                xf2.Position = MathUtils.Multiply(ref xf2.R, new Vector2(-1.0f, 0.0f));

                vertices[0] = MathUtils.Multiply(ref xf2, new Vector2(-1.0f, 0.0f));
                vertices[1] = MathUtils.Multiply(ref xf2, new Vector2(1.0f, 0.0f));
                vertices[2] = MathUtils.Multiply(ref xf2, new Vector2(0.0f, 0.5f));

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

                FixtureDef sd2 = new FixtureDef();
                sd2.shape   = poly2;
                sd2.density = 2.0f;

                BodyDef bd = new BodyDef();
                bd.type           = BodyType.Dynamic;
                bd.angularDamping = 5.0f;
                bd.linearDamping  = 0.1f;

                bd.position   = new Vector2(0.0f, 2.0f);
                bd.angle      = Alt.Box2D.Settings.b2_pi;
                bd.allowSleep = false;
                _body         = _world.CreateBody(bd);
                _body.CreateFixture(sd1);
                _body.CreateFixture(sd2);
            }

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

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

                for (int i = 0; i < 10; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.Dynamic;

                    bd.position = new Vector2(0.0f, 5.0f + 1.54f * i);
                    Body body = _world.CreateBody(bd);

                    body.CreateFixture(fd);

                    double gravity = 10.0f;
                    double I       = body.GetInertia();
                    double mass    = body.GetMass();

                    // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m)
                    double radius = (double)Math.Sqrt(2.0 * (double)(I / mass));

                    FrictionJointDef jd = new FrictionJointDef();
                    jd.localAnchorA     = Vector2.Zero;
                    jd.localAnchorB     = Vector2.Zero;
                    jd.bodyA            = ground;
                    jd.bodyB            = body;
                    jd.collideConnected = true;
                    jd.maxForce         = mass * gravity;
                    jd.maxTorque        = mass * radius * gravity;

                    _world.CreateJoint(jd);
                }
            }
        }
Ejemplo n.º 16
0
        public CollisionFiltering()
        {
            // Ground body
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));

                FixtureDef sd = new FixtureDef();
                sd.shape = shape;
                sd.friction = 0.3f;

                BodyDef bd = new BodyDef();
                Body ground = _world.CreateBody(bd);
                ground.CreateFixture(sd);
            }

            // Small triangle
            Vector2[] vertices = new Vector2[3];
            vertices[0] = new Vector2(-1.0f, 0.0f);
            vertices[1] = new Vector2(1.0f, 0.0f);
            vertices[2] = new Vector2(0.0f, 2.0f);
            PolygonShape polygon = new PolygonShape();
            polygon.Set(vertices, 3);

            FixtureDef triangleShapeDef = new FixtureDef();
            triangleShapeDef.shape = polygon;
            triangleShapeDef.density = 1.0f;

            triangleShapeDef.filter.groupIndex = k_smallGroup;
            triangleShapeDef.filter.categoryBits = k_triangleCategory;
            triangleShapeDef.filter.maskBits = k_triangleMask;

            BodyDef triangleBodyDef = new BodyDef();
            triangleBodyDef.type = BodyType.Dynamic;
            triangleBodyDef.position = new Vector2(-5.0f, 2.0f);

            Body body1 = _world.CreateBody(triangleBodyDef);
            body1.CreateFixture(triangleShapeDef);

            // Large triangle (recycle definitions)
            vertices[0] *= 2.0f;
            vertices[1] *= 2.0f;
            vertices[2] *= 2.0f;
            polygon.Set(vertices, 3);
            triangleShapeDef.filter.groupIndex = k_largeGroup;
            triangleBodyDef.position = new Vector2(-5.0f, 6.0f);
            triangleBodyDef.fixedRotation = true; // look at me!

            Body body2 = _world.CreateBody(triangleBodyDef);
            body2.CreateFixture(triangleShapeDef);

            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.Dynamic;
                bd.position = new Vector2(-5.0f, 10.0f);
                Body body = _world.CreateBody(bd);

                PolygonShape p = new PolygonShape();
                p.SetAsBox(0.5f, 1.0f);
                body.CreateFixture(p, 1.0f);

                PrismaticJointDef jd = new PrismaticJointDef();
                jd.bodyA = body2;
                jd.bodyB = body;
                jd.enableLimit = true;
                jd.localAnchorA = new Vector2(0.0f, 4.0f);
                jd.localAnchorB = Vector2.Zero;
                jd.localAxis1 = new Vector2(0.0f, 1.0f);
                jd.lowerTranslation = -1.0f;
                jd.upperTranslation = 1.0f;

                _world.CreateJoint(jd);
            }

            // Small box
            polygon.SetAsBox(1.0f, 0.5f);
            FixtureDef boxShapeDef = new FixtureDef();
            boxShapeDef.shape = polygon;
            boxShapeDef.density = 1.0f;
            boxShapeDef.restitution = 0.1f;

            boxShapeDef.filter.groupIndex = k_smallGroup;
            boxShapeDef.filter.categoryBits = k_boxCategory;
            boxShapeDef.filter.maskBits = k_boxMask;

            BodyDef boxBodyDef = new BodyDef();
            boxBodyDef.type = BodyType.Dynamic;
            boxBodyDef.position = new Vector2(0.0f, 2.0f);

            Body body3 = _world.CreateBody(boxBodyDef);
            body3.CreateFixture(boxShapeDef);

            // Large box (recycle definitions)
            polygon.SetAsBox(2.0f, 1.0f);
            boxShapeDef.filter.groupIndex = k_largeGroup;
            boxBodyDef.position = new Vector2(0.0f, 6.0f);

            Body body4 = _world.CreateBody(boxBodyDef);
            body4.CreateFixture(boxShapeDef);

            // Small circle
            CircleShape circle = new CircleShape();
            circle._radius = 1.0f;

            FixtureDef circleShapeDef = new FixtureDef();
            circleShapeDef.shape = circle;
            circleShapeDef.density = 1.0f;

            circleShapeDef.filter.groupIndex = k_smallGroup;
            circleShapeDef.filter.categoryBits = k_circleCategory;
            circleShapeDef.filter.maskBits = k_circleMask;

            BodyDef circleBodyDef = new BodyDef();
            circleBodyDef.type = BodyType.Dynamic;
            circleBodyDef.position = new Vector2(5.0f, 2.0f);

            Body body5 = _world.CreateBody(circleBodyDef);
            body5.CreateFixture(circleShapeDef);

            // Large circle
            circle._radius *= 2.0f;
            circleShapeDef.filter.groupIndex = k_largeGroup;
            circleBodyDef.position = new Vector2(5.0f, 6.0f);

            Body body6 = _world.CreateBody(circleBodyDef);
            body6.CreateFixture(circleShapeDef);
        }
Ejemplo n.º 17
0
        public CompoundShapes()
        {
            {
                BodyDef bd = new BodyDef();
                bd.position = new Vector2(0.0f, 0.0f);
                Body body = _world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vector2(50.0f, 0.0f), new Vector2(-50.0f, 0.0f));

                body.CreateFixture(shape, 0.0f);
            }

            {
                CircleShape circle1 = new CircleShape();
                circle1._radius = 0.5f;
                circle1._p = new Vector2(-0.5f, 0.5f);

                CircleShape circle2 = new CircleShape();
                circle2._radius = 0.5f;
                circle2._p = new Vector2(0.5f, 0.5f);

                for (int i = 0; i < 10; ++i)
                {
                    float x = Rand.RandomFloat(-0.1f, 0.1f);
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.Dynamic;
                    bd.position = new Vector2(x + 5.0f, 1.05f + 2.5f * i);
                    bd.angle = Rand.RandomFloat(-(float)Settings.b2_pi, (float)Settings.b2_pi);
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(circle1, 2.0f);
                    body.CreateFixture(circle2, 0.0f);
                }
            }

            {
                PolygonShape polygon1 = new PolygonShape();
                polygon1.SetAsBox(0.25f, 0.5f);

                PolygonShape polygon2 = new PolygonShape();
                polygon2.SetAsBox(0.25f, 0.5f, new Vector2(0.0f, -0.5f), 0.5f * (float)Settings.b2_pi);

                for (int i = 0; i < 10; ++i)
                {
                    float x = Rand.RandomFloat(-0.1f, 0.1f);
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.Dynamic;
                    bd.position = new Vector2(x - 5.0f, 1.05f + 2.5f * i);
                    bd.angle = Rand.RandomFloat(-(float)Settings.b2_pi, (float)Settings.b2_pi);
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(polygon1, 2.0f);
                    body.CreateFixture(polygon2, 2.0f);
                }
            }

            {
                Transform xf1 = new Transform();
                xf1.R.Set(0.3524f * (float)Settings.b2_pi);
                xf1.Position = MathUtils.Multiply(ref xf1.R, new Vector2(1.0f, 0.0f));

                Vector2[] vertices = new Vector2[3];

                PolygonShape triangle1 = new PolygonShape();
                vertices[0] = MathUtils.Multiply(ref xf1, new Vector2(-1.0f, 0.0f));
                vertices[1] = MathUtils.Multiply(ref xf1, new Vector2(1.0f, 0.0f));
                vertices[2] = MathUtils.Multiply(ref xf1, new Vector2(0.0f, 0.5f));
                triangle1.Set(vertices, 3);

                Transform xf2 = new Transform();
                xf2.R.Set(-0.3524f * (float)Settings.b2_pi);
                xf2.Position = MathUtils.Multiply(ref xf2.R, new Vector2(-1.0f, 0.0f));

                PolygonShape triangle2 = new PolygonShape();
                vertices[0] = MathUtils.Multiply(ref xf2, new Vector2(-1.0f, 0.0f));
                vertices[1] = MathUtils.Multiply(ref xf2, new Vector2(1.0f, 0.0f));
                vertices[2] = MathUtils.Multiply(ref xf2, new Vector2(0.0f, 0.5f));
                triangle2.Set(vertices, 3);

                for (int i = 0; i < 10; ++i)
                {
                    float x = Rand.RandomFloat(-0.1f, 0.1f);
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.Dynamic;
                    bd.position = new Vector2(x, 2.05f + 2.5f * i);
                    bd.angle = 0.0f;
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(triangle1, 2.0f);
                    body.CreateFixture(triangle2, 2.0f);
                }
            }

            {
                PolygonShape bottom = new PolygonShape();
                bottom.SetAsBox( 1.5f, 0.15f );

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

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

                BodyDef bd = new BodyDef();
                bd.type = BodyType.Dynamic;
                bd.position = new Vector2( 0.0f, 2.0f );
                Body body = _world.CreateBody(bd);
                body.CreateFixture(bottom, 4.0f);
                body.CreateFixture(left, 4.0f);
                body.CreateFixture(right, 4.0f);
            }
        }
Ejemplo n.º 18
0
        public ApplyForce()
        {
            _world.Gravity = new Vector2(0.0f, 0.0f);

		    const float k_restitution = 0.4f;

            Body ground;
		    {
			    BodyDef bd = new BodyDef();
			    bd.position = new Vector2(0.0f, 20.0f);
			    ground = _world.CreateBody(bd);

			    PolygonShape shape = new PolygonShape();

			    FixtureDef sd = new FixtureDef();
			    sd.shape = shape;
			    sd.density = 0.0f;
			    sd.restitution = k_restitution;

			    // Left vertical
			    shape.SetAsEdge(new Vector2(-20.0f, -20.0f), new Vector2(-20.0f, 20.0f));
			    ground.CreateFixture(sd);

			    // Right vertical
			    shape.SetAsEdge(new Vector2(20.0f, -20.0f), new Vector2(20.0f, 20.0f));
			    ground.CreateFixture(sd);

			    // Top horizontal
			    shape.SetAsEdge(new Vector2(-20.0f, 20.0f), new Vector2(20.0f, 20.0f));
			    ground.CreateFixture(sd);

			    // Bottom horizontal
			    shape.SetAsEdge(new Vector2(-20.0f, -20.0f), new Vector2(20.0f, -20.0f));
			    ground.CreateFixture(sd);
		    }

		    {
                Transform xf1 = new Transform();
			    xf1.R.Set(0.3524f * (float)Settings.b2_pi);
			    xf1.Position = MathUtils.Multiply(ref xf1.R, new Vector2(1.0f, 0.0f));

			    Vector2[] vertices = new Vector2[3];
			    vertices[0] = MathUtils.Multiply(ref xf1, new Vector2(-1.0f, 0.0f));
			    vertices[1] = MathUtils.Multiply(ref xf1, new Vector2(1.0f, 0.0f));
			    vertices[2] = MathUtils.Multiply(ref xf1, new Vector2(0.0f, 0.5f));
    			
			    PolygonShape poly1 = new PolygonShape();
			    poly1.Set(vertices, 3);

			    FixtureDef sd1 = new FixtureDef();
			    sd1.shape = poly1;
			    sd1.density = 4.0f;

                Transform xf2 = new Transform();
                xf2.R.Set(-0.3524f * (float)Settings.b2_pi);
			    xf2.Position = MathUtils.Multiply(ref xf2.R, new Vector2(-1.0f, 0.0f));

			    vertices[0] = MathUtils.Multiply(ref xf2, new Vector2(-1.0f, 0.0f));
			    vertices[1] = MathUtils.Multiply(ref xf2, new Vector2(1.0f, 0.0f));
			    vertices[2] = MathUtils.Multiply(ref xf2, new Vector2(0.0f, 0.5f));
    			
			    PolygonShape poly2 = new PolygonShape();
			    poly2.Set(vertices, 3);

                FixtureDef sd2 = new FixtureDef();
			    sd2.shape = poly2;
			    sd2.density = 2.0f;

			    BodyDef bd = new BodyDef();
                bd.type = BodyType.Dynamic;
			    bd.angularDamping = 5.0f;
			    bd.linearDamping = 0.1f;

			    bd.position = new Vector2(0.0f, 2.0f);
                bd.angle = (float)Settings.b2_pi;
                bd.allowSleep = false;
			    _body = _world.CreateBody(bd);
			    _body.CreateFixture(sd1);
			    _body.CreateFixture(sd2);
		    }

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

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

                for (int i = 0; i < 10; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.Dynamic;

                    bd.position = new Vector2(0.0f, 5.0f + 1.54f * i);
                    Body body = _world.CreateBody(bd);

                    body.CreateFixture(fd);

                    float gravity = 10.0f;
                    float I = body.GetInertia();
                    float mass = body.GetMass();

                    // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m)
                    float radius = (float)Math.Sqrt(2.0 * (double)(I / mass));

                    FrictionJointDef jd = new FrictionJointDef();
                    jd.localAnchorA = Vector2.Zero;
                    jd.localAnchorB = Vector2.Zero;
                    jd.bodyA = ground;
                    jd.bodyB = body;
                    jd.collideConnected = true;
                    jd.maxForce = mass * gravity;
                    jd.maxTorque = mass * radius * gravity;

                    _world.CreateJoint(jd);
                }
            }
        }
Ejemplo n.º 19
0
        public Bridge()
        {
            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;
			    fd.friction = 0.2f;

			    RevoluteJointDef jd = new RevoluteJointDef();

			    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);

                    if (i == (e_count >> 1))
                    {
                        _middle = body;
                    }

				    prevBody = body;
			    }

                Vector2 anchor2 = new Vector2(-15.0f + 1.0f * e_count, 5.0f);
			    jd.Initialize(prevBody, ground, anchor2);
			    _world.CreateJoint(jd);
		    }

            Vector2[] vertices = new Vector2[3];
		    for (int i = 0; i < 2; ++i)
		    {
			    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 < 3; ++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);
		    }
        }
Ejemplo n.º 20
0
        public void createShip1(Vector2 pos, float _rot)
        {
            World world = Game1.GameInstance.getWorld();

            ////////////////  For Sprite System use ///////////////
            Sprite       shipSprite = (Sprite)DisplayManager.Instance().getDisplayObj(SpriteEnum.Ship);
            Sprite_Proxy proxyShip  = new Sprite_Proxy(shipSprite, pos.X, pos.Y, shipScale, Color.Blue);
            Ship         p1         = new Ship(GameObjType.p1ship, proxyShip);


            SBNode shipBatch = SpriteBatchManager.Instance().getBatch(batchEnum.ships);

            shipBatch.addDisplayObject(proxyShip);

            //////////////////////////////////////


            // Box2D Body Setup/////////////////////////
            var shipShape = new PolygonShape();

            Vector2[] verts = new Vector2[5];


            verts[0] = new Vector2(-5.0f, -5.0f);
            verts[1] = new Vector2(4.8f, -0.10f);
            verts[2] = new Vector2(5.0f, 0.00f);
            verts[3] = new Vector2(4.8f, 0.10f);
            verts[4] = new Vector2(-5.0f, 5.0f);

            shipShape.Set(verts, 5);
            shipShape._centroid = new Vector2(0, 0);


            var fd = new FixtureDef();

            fd.shape       = shipShape;
            fd.restitution = 0.9f;
            fd.friction    = 0.0f;
            fd.density     = 1.0f;
            fd.userData    = p1;

            BodyDef bd = new BodyDef();

            bd.allowSleep    = false;
            bd.fixedRotation = true;
            bd.type          = BodyType.Dynamic;
            bd.position      = p1.spriteRef.pos;


            var body = world.CreateBody(bd);

            body.CreateFixture(fd);
            body.SetUserData(p1);
            body.Rotation = _rot;
            ///////////////////////////////////////

            // Set sprite body reference


            PhysicsMan.Instance().addPhysicsObj(p1, body);
            //////////////////

            // Set Player's ship and add it to the GameObjManager //////////////
            PlayerManager.getPlayer(PlayerID.one).setShip(p1);

            GameObjManager.Instance().addGameObj(p1);
        }
Ejemplo n.º 21
0
        void addStuff()
        {
            var floorBody = new BodyDef();

            floorBody.position = new Vector2(0, 450);
            var floorShape = new PolygonShape();

            floorShape.SetAsBox((float)800, 30);
            var floorFixture = new FixtureDef();

            floorFixture.shape = floorShape;
            Body worldFloor = physicsWorld.CreateBody(floorBody);

            worldFloor.CreateFixture(floorFixture);
            //
            var squareBody = new BodyDef();

            squareBody.type     = BodyType.Dynamic;
            squareBody.position = new Vector2(400, 100);
            var squareShape = new PolygonShape();

            squareShape.SetAsBox(100, 80);
            var squareFixture = new FixtureDef();

            squareFixture.shape   = squareShape;
            squareFixture.density = 1;
            Body worldSquare = physicsWorld.CreateBody(squareBody);

            worldSquare.CreateFixture(squareFixture);
            //
            int circleSteps = 8;

            Vector2[] circleList   = new Vector2[circleSteps];
            var       circleRadius = 50;

            for (int i = 0; i < circleSteps; i++)
            {
                circleList[i] = new Vector2((float)(circleRadius * Math.Cos(2 * Math.PI / circleSteps * i)), (float)(circleRadius * Math.Sin(2 * Math.PI / circleSteps * i)));
            }

            var circleBody = new BodyDef();

            circleBody.type     = BodyType.Dynamic;
            circleBody.position = new Vector2(200, 120);
            var circleShape = new PolygonShape();

            circleShape.Set(circleList, circleSteps);
            var circleFixture = new FixtureDef();

            circleFixture.shape = circleShape;
            Body worldCircle = physicsWorld.CreateBody(circleBody);

            worldCircle.CreateFixture(circleFixture);
            //
            var triAngleBody = new BodyDef();

            triAngleBody.position = new Vector2(600, 80);
            triAngleBody.type     = BodyType.Dynamic;
            var triAngleShape = new PolygonShape();

            Vector2[] triVertices = new Vector2[3];
            triVertices[0] = new Vector2(0, 0);
            triVertices[1] = new Vector2(120, 0);
            triVertices[2] = new Vector2(120, 120);
            triAngleShape.Set(triVertices, 3);
            var triAngleFixture = new FixtureDef();

            triAngleFixture.shape   = triAngleShape;
            triAngleFixture.density = 1;
            Body worldTriAngle = physicsWorld.CreateBody(triAngleBody);

            worldTriAngle.CreateFixture(triAngleFixture);
            //var circleBody1 = new BodyDef();
            //circleBody1.position = new Vector2(600, 180);
            //var circleShape1 = new CircleShape();
            ////circleShape1._p = new Vector2(600, 180);
            //circleShape1._radius = 40;
            //var circleFixture1 = new FixtureDef();
            //circleFixture1.shape = circleShape1;
            //Body worldCircle1 = physicsWorld.CreateBody(circleBody1);
            //worldCircle1.CreateFixture(circleFixture1);
        }
Ejemplo n.º 22
0
        public static World CreateWorld()
        {
            var gravity = new Vector2(0.000000000000000e+00f, -1.000000000000000e+01f);
            var world   = new World(gravity);
            var bodies  = new Body[2];

            {
                BodyDef bd = new BodyDef();
                bd.type            = BodyType.Static;
                bd.position        = new Vector2(0.000000000000000e+00f, 0.000000000000000e+00f);
                bd.angle           = 0.000000000000000e+00f;
                bd.linearVelocity  = new Vector2(0.000000000000000e+00f, 0.000000000000000e+00f);
                bd.angularVelocity = 0.000000000000000e+00f;
                bd.linearDamping   = 0.000000000000000e+00f;
                bd.angularDamping  = 0.000000000000000e+00f;
                bd.allowSleep      = true;
                bd.awake           = true;
                bd.fixedRotation   = false;
                bd.bullet          = false;
                //bd.active          = true;
                bd.gravityScale = 1.000000000000000e+00f;
                bodies[0]       = world.CreateBody(bd);

                {
                    FixtureDef fd = new FixtureDef();
                    fd.friction            = 2.000000029802322e-01f;
                    fd.restitution         = 2.000000029802322e-01f;
                    fd.density             = 1.000000000000000e+00f;
                    fd.isSensor            = false;
                    fd.filter.categoryBits = (1);
                    fd.filter.maskBits     = (65535);
                    fd.filter.groupIndex   = (0);
                    PolygonShape shape = new PolygonShape();
                    Vector2[]    vs    = new Vector2[4];
                    vs[0] = new Vector2(1.622321891784668e+01f, 4.735573291778564e+00f);
                    vs[1] = new Vector2(1.601119422912598e+01f, 4.735989570617676e+00f);
                    vs[2] = new Vector2(1.602764320373535e+01f, 3.814474105834961e+00f);
                    vs[3] = new Vector2(1.621816253662109e+01f, 3.825283050537109e+00f);
                    shape.Set(vs);

                    fd.shape = shape;

                    bodies[0].CreateFixture(fd);
                }
                {
                    FixtureDef fd = new FixtureDef();
                    fd.friction            = 2.000000029802322e-01f;
                    fd.restitution         = 0.000000000000000e+00f;
                    fd.density             = 0.000000000000000e+00f;
                    fd.isSensor            = false;
                    fd.filter.categoryBits = (1);
                    fd.filter.maskBits     = (65535);
                    fd.filter.groupIndex   = (0);
                    EdgeShape shape = new EdgeShape();
                    Vector2[] vs    = new Vector2[4];
                    ;
                    vs[0] = new Vector2(1.918307685852051e+01f, 3.306496143341064e+00f);
                    vs[1] = new Vector2(1.703903770446777e+01f, 2.196289300918579e+00f);

                    vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f);
                    vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f);

                    shape.SetTwoSided(vs[0], vs[1]);
                    ;

                    fd.shape = shape;

                    bodies[0].CreateFixture(fd);
                }
                {
                    FixtureDef fd = new FixtureDef();
                    fd.friction            = 2.000000029802322e-01f;
                    fd.restitution         = 0.000000000000000e+00f;
                    fd.density             = 0.000000000000000e+00f;
                    fd.isSensor            = false;
                    fd.filter.categoryBits = (1);
                    fd.filter.maskBits     = (65535);
                    fd.filter.groupIndex   = (0);
                    EdgeShape shape = new EdgeShape();
                    Vector2[] vs    = new Vector2[4];
                    ;
                    vs[0] = new Vector2(2.044397354125977e+01f, 4.096230506896973e+00f);
                    vs[1] = new Vector2(1.918307685852051e+01f, 3.306496143341064e+00f);

                    vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f);
                    vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f);

                    shape.SetTwoSided(vs[0], vs[1]);
                    ;

                    fd.shape = shape;

                    bodies[0].CreateFixture(fd);
                }
                {
                    FixtureDef fd = new FixtureDef();
                    fd.friction            = 2.000000029802322e-01f;
                    fd.restitution         = 0.000000000000000e+00f;
                    fd.density             = 0.000000000000000e+00f;
                    fd.isSensor            = false;
                    fd.filter.categoryBits = (1);
                    fd.filter.maskBits     = (65535);
                    fd.filter.groupIndex   = (0);
                    EdgeShape shape = new EdgeShape();
                    Vector2[] vs    = new Vector2[4];
                    ;
                    vs[0] = new Vector2(2.176111412048340e+01f, 5.379695892333984e+00f);
                    vs[1] = new Vector2(2.115560913085938e+01f, 4.700156211853027e+00f);

                    vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f);
                    vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f);

                    shape.SetTwoSided(vs[0], vs[1]);
                    ;

                    fd.shape = shape;

                    bodies[0].CreateFixture(fd);
                }
                {
                    FixtureDef fd = new FixtureDef();
                    fd.friction            = 2.000000029802322e-01f;
                    fd.restitution         = 0.000000000000000e+00f;
                    fd.density             = 0.000000000000000e+00f;
                    fd.isSensor            = false;
                    fd.filter.categoryBits = (1);
                    fd.filter.maskBits     = (65535);
                    fd.filter.groupIndex   = (0);
                    EdgeShape shape = new EdgeShape();
                    Vector2[] vs    = new Vector2[4];
                    ;
                    vs[0] = new Vector2(2.206690788269043e+01f, 5.190674781799316e+00f);
                    vs[1] = new Vector2(2.176111412048340e+01f, 5.379695892333984e+00f);

                    vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f);
                    vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f);

                    shape.SetTwoSided(vs[0], vs[1]);
                    ;

                    fd.shape = shape;

                    bodies[0].CreateFixture(fd);
                }
                {
                    FixtureDef fd = new FixtureDef();
                    fd.friction            = 2.000000029802322e-01f;
                    fd.restitution         = 0.000000000000000e+00f;
                    fd.density             = 0.000000000000000e+00f;
                    fd.isSensor            = false;
                    fd.filter.categoryBits = (1);
                    fd.filter.maskBits     = (65535);
                    fd.filter.groupIndex   = (0);
                    EdgeShape shape = new EdgeShape();
                    Vector2[] vs    = new Vector2[4];
                    ;
                    vs[0] = new Vector2(1.703903770446777e+01f, 2.196289300918579e+00f);
                    vs[1] = new Vector2(1.560352897644043e+01f, 1.560027003288269e+00f);

                    vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f);
                    vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f);

                    shape.SetTwoSided(vs[0], vs[1]);
                    ;

                    fd.shape = shape;

                    bodies[0].CreateFixture(fd);
                }
                {
                    FixtureDef fd = new FixtureDef();
                    fd.friction            = 2.000000029802322e-01f;
                    fd.restitution         = 0.000000000000000e+00f;
                    fd.density             = 0.000000000000000e+00f;
                    fd.isSensor            = false;
                    fd.filter.categoryBits = (1);
                    fd.filter.maskBits     = (65535);
                    fd.filter.groupIndex   = (0);
                    EdgeShape shape = new EdgeShape();
                    Vector2[] vs    = new Vector2[4];
                    ;
                    vs[0] = new Vector2(1.560352897644043e+01f, 1.560027003288269e+00f);
                    vs[1] = new Vector2(1.428396320343018e+01f, 1.043329477310181e+00f);

                    vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f);
                    vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f);

                    shape.SetTwoSided(vs[0], vs[1]);
                    ;

                    fd.shape = shape;

                    bodies[0].CreateFixture(fd);
                }
                {
                    FixtureDef fd = new FixtureDef();
                    fd.friction            = 2.000000029802322e-01f;
                    fd.restitution         = 0.000000000000000e+00f;
                    fd.density             = 0.000000000000000e+00f;
                    fd.isSensor            = false;
                    fd.filter.categoryBits = (1);
                    fd.filter.maskBits     = (65535);
                    fd.filter.groupIndex   = (0);
                    EdgeShape shape = new EdgeShape();
                    Vector2[] vs    = new Vector2[4];
                    ;
                    vs[0] = new Vector2(2.115560913085938e+01f, 4.700156211853027e+00f);
                    vs[1] = new Vector2(2.044397354125977e+01f, 4.096230506896973e+00f);

                    vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f);
                    vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f);

                    shape.SetTwoSided(vs[0], vs[1]);
                    ;

                    fd.shape = shape;

                    bodies[0].CreateFixture(fd);
                }
            }
            {
                BodyDef bd = new BodyDef();
                bd.type            = BodyType.Dynamic;
                bd.position        = new Vector2(2.079453659057617e+01f, 7.627632617950439e+00f);
                bd.angle           = 4.814267158508301e-03f;
                bd.linearVelocity  = new Vector2(0.000000000000000e+00f, 0.000000000000000e+00f);
                bd.angularVelocity = 0.000000000000000e+00f;
                bd.linearDamping   = 0.000000000000000e+00f;
                bd.angularDamping  = 0.000000000000000e+00f;
                bd.allowSleep      = true;
                bd.awake           = true;
                bd.fixedRotation   = false;
                bd.bullet          = true;
                //bd.active          = true;
                bd.gravityScale = 1.000000000000000e+00f;
                bodies[1]       = world.CreateBody(bd);

                {
                    FixtureDef fd = new FixtureDef();
                    fd.friction            = 5.000000000000000e-01f;
                    fd.restitution         = 6.999999880790710e-01f;
                    fd.density             = 5.000000074505806e-02f;
                    fd.isSensor            = false;
                    fd.filter.categoryBits = (1);
                    fd.filter.maskBits     = (65535);
                    fd.filter.groupIndex   = (0);
                    PolygonShape shape = new PolygonShape();
                    Vector2[]    vs    = new Vector2[4];
                    vs[0] = new Vector2(1.193307399749756e+00f, -7.795047014951706e-02f);
                    vs[1] = new Vector2(1.193307399749756e+00f, 9.368468075990677e-02f);
                    vs[2] = new Vector2(-1.108393430709839e+00f, 1.137156039476395e-01f);
                    vs[3] = new Vector2(-1.108393430709839e+00f, -9.785395860671997e-02f);
                    shape.Set(vs);

                    fd.shape = shape;

                    bodies[1].CreateFixture(fd);
                }
            }

            return(world);
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Components initialization of the actor. Override this method with actor-specific components initialization code.
        /// </summary>
        /// <remarks>
        /// Makes children bodies as the part of this body.
        /// Also calls <see cref="InitializeComponents"/> for its children.
        /// </remarks>
        public virtual void InitializeComponents()
        {
            foreach (Actor child in Children)
            {
                if (Body != null && child.Body != null)
                {
                    // make child body as the part of the parent body
                    // originally was used WeldJoint to make two bodies together
                    // but the joint constraint sometimes produces strange behaviour (and also crashes)
                    // FarseerPhysics.Factories.JointFactory.CreateWeldJoint(Screen.World, Body, child.Body, new Vector2());

                    // new child angle, relative to the actor body
                    float newChildAngle = child.Body.Rotation - Body.Rotation;
                    // vector to make child shapes relative to the actor body
                    Vector2 moveToParent = Vector2.Transform(child.Body.Position,
                                                             Matrix.CreateTranslation(-Body.Position.X, -Body.Position.Y, 0f) *
                                                             Matrix.CreateRotationZ(-Body.Rotation) *
                                                             Matrix.CreateTranslation(Body.Position.X, Body.Position.Y, 0f))
                                           - Body.Position;

                    foreach (Fixture fixture in child.Body.FixtureList)
                    {
                        Shape shape = null;

                        // move shape according to the parent body
                        // move polygon shape
                        if (fixture.ShapeType == ShapeType.Polygon)
                        {
                            PolygonShape polygon = fixture.Shape as PolygonShape;

                            polygon.Vertices.Rotate(newChildAngle);
                            polygon.Vertices.Translate(moveToParent);

                            Debug.Assert(polygon.Vertices.IsCounterClockWise());
                            Debug.Assert(!polygon.Vertices.CheckPolygon());

                            // reset polygon
                            polygon.Set(polygon.Vertices);
                            shape = polygon;
                        }
                        // move circle shape
                        else if (fixture.ShapeType == ShapeType.Circle)
                        {
                            CircleShape circle = fixture.Shape as CircleShape;

                            circle.Position += moveToParent;

                            shape = circle;
                        }
                        // move edge shape
                        else if (fixture.ShapeType == ShapeType.Edge)
                        {
                            EdgeShape edge = fixture.Shape as EdgeShape;

                            Matrix rotationMatrix = Matrix.CreateRotationZ(newChildAngle);

                            if (edge.HasVertex0)
                            {
                                edge.Vertex0 = Vector2.Transform(edge.Vertex0, rotationMatrix) + moveToParent;
                            }
                            if (edge.HasVertex3)
                            {
                                edge.Vertex3 = Vector2.Transform(edge.Vertex3, rotationMatrix) + moveToParent;
                            }

                            edge.Vertex1 = Vector2.Transform(edge.Vertex1, rotationMatrix) + moveToParent;
                            edge.Vertex2 = Vector2.Transform(edge.Vertex2, rotationMatrix) + moveToParent;

                            shape = edge;
                        }

                        // create new fixture
                        if (shape != null)
                        {
                            Fixture newFixture = Body.CreateFixture(shape, child);

                            // copy all settings from original fixture
                            newFixture.Restitution         = fixture.Restitution;
                            newFixture.Friction            = fixture.Friction;
                            newFixture.IsSensor            = fixture.IsSensor;
                            newFixture.CollisionGroup      = fixture.CollisionGroup;
                            newFixture.CollisionCategories = fixture.CollisionCategories;
                            newFixture.CollidesWith        = fixture.CollidesWith;

                            // connect collision events to child events
                            newFixture.OnCollision  += child.OnBodyCollision;
                            newFixture.OnSeparation += child.OnBodySeparation;
                        }
                    }

                    // reset child angle and position
                    child.Angle    = child.Body.Rotation;
                    child.Position = child.Body.Position;

                    // remove original body
                    Screen.World.RemoveBody(child.Body);
                    // set child body as parent body
                    child._body = Body;
                }

                child.InitializeComponents();
            }
        }
Ejemplo n.º 24
0
        public CompoundShapes()
        {
            {
                BodyDef bd = new BodyDef();
                bd.position = new Vector2(0.0, 0.0);
                Body body = _world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vector2(50.0, 0.0), new Vector2(-50.0, 0.0));

                body.CreateFixture(shape, 0.0);
            }

            {
                CircleShape circle1 = new CircleShape();
                circle1._radius = 0.5f;
                circle1._p      = new Vector2(-0.5f, 0.5f);

                CircleShape circle2 = new CircleShape();
                circle2._radius = 0.5f;
                circle2._p      = new Vector2(0.5f, 0.5f);

                for (int i = 0; i < 10; ++i)
                {
                    double  x  = Rand.RandomFloat(-0.1f, 0.1f);
                    BodyDef bd = new BodyDef();
                    bd.type     = BodyType.Dynamic;
                    bd.position = new Vector2(x + 5.0f, 1.05f + 2.5f * i);
                    bd.angle    = Rand.RandomFloat(-Alt.Box2D.Settings.b2_pi, Alt.Box2D.Settings.b2_pi);
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(circle1, 2.0f);
                    body.CreateFixture(circle2, 0.0f);
                }
            }

            {
                PolygonShape polygon1 = new PolygonShape();
                polygon1.SetAsBox(0.25f, 0.5f);

                PolygonShape polygon2 = new PolygonShape();
                polygon2.SetAsBox(0.25f, 0.5f, new Vector2(0.0f, -0.5f), 0.5f * Alt.Box2D.Settings.b2_pi);

                for (int i = 0; i < 10; ++i)
                {
                    double  x  = Rand.RandomFloat(-0.1f, 0.1f);
                    BodyDef bd = new BodyDef();
                    bd.type     = BodyType.Dynamic;
                    bd.position = new Vector2(x - 5.0f, 1.05f + 2.5f * i);
                    bd.angle    = Rand.RandomFloat(-Alt.Box2D.Settings.b2_pi, Alt.Box2D.Settings.b2_pi);
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(polygon1, 2.0f);
                    body.CreateFixture(polygon2, 2.0f);
                }
            }

            {
                Alt.Box2D.Transform xf1 = new Alt.Box2D.Transform();
                xf1.R.Set(0.3524f * Alt.Box2D.Settings.b2_pi);
                xf1.Position = MathUtils.Multiply(ref xf1.R, new Vector2(1.0f, 0.0f));

                Vector2[] vertices = new Vector2[3];

                PolygonShape triangle1 = new PolygonShape();
                vertices[0] = MathUtils.Multiply(ref xf1, new Vector2(-1.0f, 0.0f));
                vertices[1] = MathUtils.Multiply(ref xf1, new Vector2(1.0f, 0.0f));
                vertices[2] = MathUtils.Multiply(ref xf1, new Vector2(0.0f, 0.5f));
                triangle1.Set(vertices, 3);

                Alt.Box2D.Transform xf2 = new Alt.Box2D.Transform();
                xf2.R.Set(-0.3524f * Alt.Box2D.Settings.b2_pi);
                xf2.Position = MathUtils.Multiply(ref xf2.R, new Vector2(-1.0f, 0.0f));

                PolygonShape triangle2 = new PolygonShape();
                vertices[0] = MathUtils.Multiply(ref xf2, new Vector2(-1.0f, 0.0f));
                vertices[1] = MathUtils.Multiply(ref xf2, new Vector2(1.0f, 0.0f));
                vertices[2] = MathUtils.Multiply(ref xf2, new Vector2(0.0f, 0.5f));
                triangle2.Set(vertices, 3);

                for (int i = 0; i < 10; ++i)
                {
                    double  x  = Rand.RandomFloat(-0.1f, 0.1f);
                    BodyDef bd = new BodyDef();
                    bd.type     = BodyType.Dynamic;
                    bd.position = new Vector2(x, 2.05f + 2.5f * i);
                    bd.angle    = 0.0f;
                    Body body = _world.CreateBody(bd);
                    body.CreateFixture(triangle1, 2.0f);
                    body.CreateFixture(triangle2, 2.0f);
                }
            }

            {
                PolygonShape bottom = new PolygonShape();
                bottom.SetAsBox(1.5f, 0.15f);

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

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

                BodyDef bd = new BodyDef();
                bd.type     = BodyType.Dynamic;
                bd.position = new Vector2(0.0f, 2.0f);
                Body body = _world.CreateBody(bd);
                body.CreateFixture(bottom, 4.0f);
                body.CreateFixture(left, 4.0f);
                body.CreateFixture(right, 4.0f);
            }
        }
Ejemplo n.º 25
0
        public Car()
        {
            m_hz    = 4.0f;
            m_zeta  = 0.7f;
            m_speed = 50.0f;

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

                EdgeShape shape = new EdgeShape();

                FixtureDef fd = new FixtureDef();
                fd.shape    = shape;
                fd.Density  = 0.0f;
                fd.friction = 0.6f;

                shape.Set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f));
                ground.CreateFixture(fd);

                float[] hs = new float[] { 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.Set(new Vec2(x, y1), new Vec2(x + dx, y2));
                    ground.CreateFixture(fd);
                    y1 = y2;
                    x += dx;
                }

                for (int i = 0; i < 10; ++i)
                {
                    float y2 = hs[i];
                    shape.Set(new Vec2(x, y1), new Vec2(x + dx, y2));
                    ground.CreateFixture(fd);
                    y1 = y2;
                    x += dx;
                }

                shape.Set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
                ground.CreateFixture(fd);

                x += 80.0f;
                shape.Set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
                ground.CreateFixture(fd);

                x += 40.0f;
                shape.Set(new Vec2(x, 0.0f), new Vec2(x + 10.0f, 5.0f));
                ground.CreateFixture(fd);

                x += 20.0f;
                shape.Set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
                ground.CreateFixture(fd);

                x += 40.0f;
                shape.Set(new Vec2(x, 0.0f), new Vec2(x, 20.0f));
                ground.CreateFixture(fd);
            }

            // Teeter
            {
                BodyDef bd = new BodyDef();
                bd.Position.Set(140.0f, 1.0f);
                bd.type = BodyType._dynamicBody;
                Body body = m_world.CreateBody(bd);

                PolygonShape box = new PolygonShape();
                box.SetAsBox(10.0f, 0.25f);
                box.Density = 1;
                body.CreateFixture(box);

                RevoluteJointDef jd = new RevoluteJointDef();
                jd.Initialize(ground, body, body.GetPosition());
                jd.lowerAngle  = -8.0f * (float)Math.PI / 180.0f;
                jd.upperAngle  = 8.0f * (float)Math.PI / 180.0f;
                jd.enableLimit = true;
                m_world.CreateJoint(jd);

                body.ApplyAngularImpulse(100.0f, true);
            }

            // Bridge
            {
                int          N     = 20;
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(1.0f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape    = shape;
                fd.Density  = 1.0f;
                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._dynamicBody;
                    bd.Position.Set(161.0f + 2.0f * i, -0.125f);
                    Body body = m_world.CreateBody(bd);
                    body.CreateFixture(fd);

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

                    prevBody = body;
                }

                Vec2 anchor2 = new Vec2(160.0f + 2.0f * N, -0.125f);
                jd.Initialize(prevBody, ground, anchor2);
                m_world.CreateJoint(jd);
            }

            // Boxes
            {
                PolygonShape box = new PolygonShape();
                box.SetAsBox(0.5f, 0.5f);
                box.Density = 0.5f;

                Body    body = null;
                BodyDef bd   = new BodyDef();
                bd.type = BodyType._dynamicBody;

                bd.Position.Set(230.0f, 0.5f);
                body = m_world.CreateBody(bd);
                body.CreateFixture(box);

                bd.Position.Set(230.0f, 1.5f);
                body = m_world.CreateBody(bd);
                body.CreateFixture(box);

                bd.Position.Set(230.0f, 2.5f);
                body = m_world.CreateBody(bd);
                body.CreateFixture(box);

                bd.Position.Set(230.0f, 3.5f);
                body = m_world.CreateBody(bd);
                body.CreateFixture(box);

                bd.Position.Set(230.0f, 4.5f);
                body = m_world.CreateBody(bd);
                body.CreateFixture(box);
            }

            // Car
            {
                PolygonShape chassis  = new PolygonShape();
                Vec2[]       vertices = new Vec2[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, 6);

                CircleShape circle = new CircleShape();
                circle.m_radius = 0.4f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType._dynamicBody;
                bd.Position.Set(0.0f, 1.0f);
                m_car = m_world.CreateBody(bd);
                m_car.CreateFixture(chassis);

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

                bd.Position.Set(-1.0f, 0.35f);
                m_wheel1 = m_world.CreateBody(bd);
                m_wheel1.CreateFixture(fd);

                bd.Position.Set(1.0f, 0.4f);
                m_wheel2 = m_world.CreateBody(bd);
                m_wheel2.CreateFixture(fd);

                WheelJointDef jd   = new WheelJointDef();
                Vec2          axis = new Vec2(0.0f, 1.0f);

                jd.Initialize(m_car, m_wheel1, m_wheel1.GetPosition(), axis);
                jd.motorSpeed     = 0.0f;
                jd.maxMotorTorque = 20.0f;
                jd.enableMotor    = true;
                jd.frequencyHz    = m_hz;
                jd.dampingRatio   = m_zeta;
                m_spring1         = (WheelJoint)m_world.CreateJoint(jd);

                jd.Initialize(m_car, m_wheel2, m_wheel2.GetPosition(), axis);
                jd.motorSpeed     = 0.0f;
                jd.maxMotorTorque = 10.0f;
                jd.enableMotor    = false;
                jd.frequencyHz    = m_hz;
                jd.dampingRatio   = m_zeta;
                m_spring2         = (WheelJoint)m_world.CreateJoint(jd);
            }
        }
Ejemplo n.º 26
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);
            }
        }
Ejemplo n.º 27
0
        private CollisionProcessingTest()
        {
            //Ground
            BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));

            const float xLo = -5.0f;
            const float xHi = 5.0f;
            const float yLo = 2.0f;
            const float yHi = 35.0f;

            // Small triangle
            Vertices vertices = new Vertices(3);

            vertices.Add(new Vector2(-1.0f, 0.0f));
            vertices.Add(new Vector2(1.0f, 0.0f));
            vertices.Add(new Vector2(0.0f, 2.0f));

            PolygonShape polygon = new PolygonShape(vertices, 1);

            Body body1 = BodyFactory.CreateBody(World);

            body1.BodyType = BodyType.Dynamic;
            body1.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));

            Fixture fixture = body1.CreateFixture(polygon);

            fixture.OnCollision += OnCollision;

            // Large triangle (recycle definitions)
            vertices[0] *= 2.0f;
            vertices[1] *= 2.0f;
            vertices[2] *= 2.0f;
            polygon.Set(vertices);

            Body body2 = BodyFactory.CreateBody(World);

            body2.BodyType       = BodyType.Dynamic;
            body2.Position       = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));
            fixture              = body2.CreateFixture(polygon);
            fixture.OnCollision += OnCollision;

            // Small box
            Vertices smallBox = PolygonTools.CreateRectangle(1.0f, 0.5f);

            polygon.Set(smallBox);

            Body body3 = BodyFactory.CreateBody(World);

            body3.BodyType       = BodyType.Dynamic;
            body3.Position       = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));
            fixture              = body3.CreateFixture(polygon);
            fixture.OnCollision += OnCollision;

            // Large box (recycle definitions)
            Vertices largeBox = PolygonTools.CreateRectangle(2.0f, 1.0f);

            polygon.Set(largeBox);

            Body body4 = BodyFactory.CreateBody(World);

            body4.BodyType       = BodyType.Dynamic;
            body4.Position       = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));
            fixture              = body4.CreateFixture(polygon);
            fixture.OnCollision += OnCollision;

            // Small circle
            CircleShape circle = new CircleShape(1.0f, 1);

            Body body5 = BodyFactory.CreateBody(World);

            body5.BodyType       = BodyType.Dynamic;
            body5.Position       = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));
            fixture              = body5.CreateFixture(circle);
            fixture.OnCollision += OnCollision;

            // Large circle
            circle.Radius *= 2.0f;

            Body body6 = BodyFactory.CreateBody(World);

            body6.BodyType       = BodyType.Dynamic;
            body6.Position       = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));
            fixture              = body6.CreateFixture(circle);
            fixture.OnCollision += OnCollision;
        }
Ejemplo n.º 28
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);
		    }
        }
Ejemplo n.º 29
0
        void CreateLeg(double s, Vector2 wheelAnchor)
        {
            Vector2 p1 = new Vector2(5.4f * s, -6.1f);
            Vector2 p2 = new Vector2(7.2f * s, -1.2f);
            Vector2 p3 = new Vector2(4.3f * s, -1.9f);
            Vector2 p4 = new Vector2(3.1f * s, 0.8f);
            Vector2 p5 = new Vector2(6.0f * s, 1.5f);
            Vector2 p6 = new Vector2(2.5f * s, 3.7f);

            FixtureDef fd1 = new FixtureDef();
            FixtureDef fd2 = new FixtureDef();

            fd1.filter.groupIndex = -1;
            fd2.filter.groupIndex = -1;
            fd1.density           = 1.0f;
            fd2.density           = 1.0f;

            PolygonShape poly1 = new PolygonShape();
            PolygonShape poly2 = new PolygonShape();

            Vector2[] vertices = new Vector2[3];

            if (s > 0.0f)
            {
                vertices[0] = p1;
                vertices[1] = p2;
                vertices[2] = p3;
                poly1.Set(vertices, 3);

                vertices[0] = Vector2.Zero;
                vertices[1] = p5 - p4;
                vertices[2] = p6 - p4;
                poly2.Set(vertices, 3);
            }
            else
            {
                vertices[0] = p1;
                vertices[1] = p3;
                vertices[2] = p2;
                poly1.Set(vertices, 3);

                vertices[0] = Vector2.Zero;
                vertices[1] = p6 - p4;
                vertices[2] = p5 - p4;
                poly2.Set(vertices, 3);
            }

            fd1.shape = poly1;
            fd2.shape = poly2;

            BodyDef bd1 = new BodyDef();
            BodyDef bd2 = new BodyDef();

            bd1.type = BodyType.Dynamic;
            bd2.type = BodyType.Dynamic;

            bd1.position = _offset;
            bd2.position = p4 + _offset;

            bd1.angularDamping = 10.0f;
            bd2.angularDamping = 10.0f;

            Body body1 = _world.CreateBody(bd1);
            Body body2 = _world.CreateBody(bd2);

            body1.CreateFixture(fd1);
            body2.CreateFixture(fd2);

            DistanceJointDef djd = new DistanceJointDef();

            // Using a soft distanceraint can reduce some jitter.
            // It also makes the structure seem a bit more fluid by
            // acting like a suspension system.
            djd.dampingRatio = 0.5f;
            djd.frequencyHz  = 10.0f;

            djd.Initialize(body1, body2, p2 + _offset, p5 + _offset);
            _world.CreateJoint(djd);

            djd.Initialize(body1, body2, p3 + _offset, p4 + _offset);
            _world.CreateJoint(djd);

            djd.Initialize(body1, _wheel, p3 + _offset, wheelAnchor + _offset);
            _world.CreateJoint(djd);

            djd.Initialize(body2, _wheel, p6 + _offset, wheelAnchor + _offset);
            _world.CreateJoint(djd);

            RevoluteJointDef rjd = new RevoluteJointDef();

            rjd.Initialize(body2, _chassis, p4 + _offset);
            _world.CreateJoint(rjd);
        }
Ejemplo n.º 30
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);
            }
        }
Ejemplo n.º 31
0
        private void CreateLeg(float s, Vector2 wheelAnchor)
        {
            var p1 = new Vector2(5.4f * s, -6.1f);
            var p2 = new Vector2(7.2f * s, -1.2f);
            var p3 = new Vector2(4.3f * s, -1.9f);
            var p4 = new Vector2(3.1f * s, 0.8f);
            var p5 = new Vector2(6.0f * s, 1.5f);
            var p6 = new Vector2(2.5f * s, 3.7f);

            var fd1 = new FixtureDef {
                Filter = { GroupIndex = -1 }, Density = 1.0f
            };
            var fd2 = new FixtureDef {
                Filter = { GroupIndex = -1 }, Density = 1.0f
            };

            var poly1 = new PolygonShape();
            var poly2 = new PolygonShape();

            if (s > 0.0f)
            {
                var vertices = new Vector2[3];

                vertices[0] = p1;
                vertices[1] = p2;
                vertices[2] = p3;
                poly1.Set(vertices);

                vertices[0] = Vector2.Zero;
                vertices[1] = p5 - p4;
                vertices[2] = p6 - p4;
                poly2.Set(vertices);
            }
            else
            {
                var vertices = new Vector2[3];

                vertices[0] = p1;
                vertices[1] = p3;
                vertices[2] = p2;
                poly1.Set(vertices);

                vertices[0] = Vector2.Zero;
                vertices[1] = p6 - p4;
                vertices[2] = p5 - p4;
                poly2.Set(vertices);
            }

            fd1.Shape = poly1;
            fd2.Shape = poly2;

            var bd1 = new BodyDef();
            var bd2 = new BodyDef();

            bd1.BodyType = BodyType.DynamicBody;
            bd2.BodyType = BodyType.DynamicBody;
            bd1.Position = _offset;
            bd2.Position = p4 + _offset;

            bd1.AngularDamping = 10.0f;
            bd2.AngularDamping = 10.0f;

            var body1 = World.CreateBody(bd1);
            var body2 = World.CreateBody(bd2);

            body1.CreateFixture(fd1);
            body2.CreateFixture(fd2);

            var djd = new DistanceJointDef();

            // Using a soft distance constraint can reduce some jitter.
            // It also makes the structure seem a bit more fluid by
            // acting like a suspension system.
            djd.DampingRatio = 0.5f;
            djd.FrequencyHz  = 10.0f;

            djd.Initialize(body1, body2, p2 + _offset, p5 + _offset);
            World.CreateJoint(djd);

            djd.Initialize(body1, body2, p3 + _offset, p4 + _offset);
            World.CreateJoint(djd);

            djd.Initialize(body1, _wheel, p3 + _offset, wheelAnchor + _offset);
            World.CreateJoint(djd);

            djd.Initialize(body2, _wheel, p6 + _offset, wheelAnchor + _offset);
            World.CreateJoint(djd);

            var rjd = new RevoluteJointDef();

            rjd.Initialize(body2, _chassis, p4 + _offset);
            World.CreateJoint(rjd);
        }
Ejemplo n.º 32
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);
            }
        }
Ejemplo n.º 33
0
        public CollisionProcessing()
        {
            // Ground body
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vector2(-50.0f, 0.0f), new Vector2(50.0f, 0.0f));

                FixtureDef sd = new FixtureDef();
                sd.shape = shape;

                BodyDef bd = new BodyDef();
                Body ground = _world.CreateBody(bd);
                ground.CreateFixture(sd);
            }

            float xLo = -5.0f, xHi = 5.0f;
            float yLo = 2.0f, yHi = 35.0f;

            // Small triangle
            Vector2[] vertices = new Vector2[3];
            vertices[0] = new Vector2(-1.0f, 0.0f);
            vertices[1] = new Vector2(1.0f, 0.0f);
            vertices[2] = new Vector2(0.0f, 2.0f);

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

            FixtureDef triangleShapeDef = new FixtureDef();
            triangleShapeDef.shape = polygon;
            triangleShapeDef.density = 1.0f;

            BodyDef triangleBodyDef = new BodyDef();
            triangleBodyDef.type = BodyType.Dynamic;
            triangleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));

            Body body1 = _world.CreateBody(triangleBodyDef);
            body1.CreateFixture(triangleShapeDef);

            // Large triangle (recycle definitions)
            vertices[0] *= 2.0f;
            vertices[1] *= 2.0f;
            vertices[2] *= 2.0f;
            polygon.Set(vertices, 3);

            triangleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));

            Body body2 = _world.CreateBody(triangleBodyDef);
            body2.CreateFixture(triangleShapeDef);

            // Small box
            polygon.SetAsBox(1.0f, 0.5f);

            FixtureDef boxShapeDef = new FixtureDef();
            boxShapeDef.shape = polygon;
            boxShapeDef.density = 1.0f;

            BodyDef boxBodyDef = new BodyDef();
            boxBodyDef.type = BodyType.Dynamic;
            boxBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));

            Body body3 = _world.CreateBody(boxBodyDef);
            body3.CreateFixture(boxShapeDef);

            // Large box (recycle definitions)
            polygon.SetAsBox(2.0f, 1.0f);
            boxBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));

            Body body4 = _world.CreateBody(boxBodyDef);
            body4.CreateFixture(boxShapeDef);

            // Small circle
            CircleShape circle = new CircleShape();
            circle._radius = 1.0f;

            FixtureDef circleShapeDef = new FixtureDef();
            circleShapeDef.shape = circle;
            circleShapeDef.density = 1.0f;

            BodyDef circleBodyDef = new BodyDef();
            circleBodyDef.type = BodyType.Dynamic;
            circleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));

            Body body5 = _world.CreateBody(circleBodyDef);
            body5.CreateFixture(circleShapeDef);

            // Large circle
            circle._radius *= 2.0f;
            circleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));

            Body body6 = _world.CreateBody(circleBodyDef);
            body6.CreateFixture(circleShapeDef);
        }
Ejemplo n.º 34
0
        public Revolute()
        {
            Body ground;
            {
                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));

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

                //fd.filter.categoryBits = 2;

                ground.CreateFixture(fd);
            }

            {
                var shape = new CircleShape();
                shape.Radius = 0.5f;

                var bd = new BodyDef();
                bd.BodyType = BodyType.DynamicBody;

                var rjd = new RevoluteJointDef();

                bd.Position.Set(-10.0f, 20.0f);
                var body = World.CreateBody(bd);
                body.CreateFixture(shape, 5.0f);

                var w = 100.0f;
                body.SetAngularVelocity(w);
                body.SetLinearVelocity(new Vector2(-8.0f * w, 0.0f));

                rjd.Initialize(ground, body, new Vector2(-10.0f, 12.0f));
                rjd.MotorSpeed       = 1.0f * Settings.Pi;
                rjd.MaxMotorTorque   = 10000.0f;
                rjd.EnableMotor      = false;
                rjd.LowerAngle       = -0.25f * Settings.Pi;
                rjd.UpperAngle       = 0.5f * Settings.Pi;
                rjd.EnableLimit      = true;
                rjd.CollideConnected = true;

                m_joint = (RevoluteJoint)World.CreateJoint(rjd);
            }

            {
                var circle_shape = new CircleShape();
                circle_shape.Radius = 3.0f;

                var circle_bd = new BodyDef();
                circle_bd.BodyType = BodyType.DynamicBody;
                circle_bd.Position.Set(5.0f, 30.0f);

                var fd = new FixtureDef();
                fd.Density = 5.0f;
                var filter = fd.Filter;
                filter.MaskBits = 1;
                fd.Filter       = filter;
                fd.Shape        = circle_shape;

                m_ball = World.CreateBody(circle_bd);
                m_ball.CreateFixture(fd);

                var polygon_shape = new PolygonShape();
                polygon_shape.SetAsBox(10.0f, 0.2f, new Vector2(-10.0f, 0.0f), 0.0f);

                var polygon_bd = new BodyDef();
                polygon_bd.Position.Set(20.0f, 10.0f);
                polygon_bd.BodyType = BodyType.DynamicBody;
                polygon_bd.Bullet   = true;
                var polygon_body = World.CreateBody(polygon_bd);
                polygon_body.CreateFixture(polygon_shape, 2.0f);

                var rjd = new RevoluteJointDef();
                rjd.Initialize(ground, polygon_body, new Vector2(20.0f, 10.0f));
                rjd.LowerAngle  = -0.25f * Settings.Pi;
                rjd.UpperAngle  = 0.0f * Settings.Pi;
                rjd.EnableLimit = true;
                World.CreateJoint(rjd);
            }

            // Tests mass computation of a small object far from the origin
            {
                var bodyDef = new BodyDef();
                bodyDef.BodyType = BodyType.DynamicBody;
                var body = World.CreateBody(bodyDef);

                var polyShape = new PolygonShape();
                var verts     = new Vector2[3];
                verts[0].Set(17.63f, 36.31f);
                verts[1].Set(17.52f, 36.69f);
                verts[2].Set(17.19f, 36.36f);
                polyShape.Set(verts);

                var polyFixtureDef = new FixtureDef();
                polyFixtureDef.Shape   = polyShape;
                polyFixtureDef.Density = 1;

                body.CreateFixture(polyFixtureDef); //assertion hits inside here
            }
        }
        private DominosTest()
        {
            //Ground
            BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));

            {
                Vertices     box   = PolygonTools.CreateRectangle(6.0f, 0.25f);
                PolygonShape shape = new PolygonShape(box, 0);

                Body ground = BodyFactory.CreateBody(World);
                ground.Position = new Vector2(-1.5f, 10.0f);

                ground.CreateFixture(shape);
            }

            {
                Vertices     box   = PolygonTools.CreateRectangle(0.1f, 1.0f);
                PolygonShape shape = new PolygonShape(box, 20);

                for (int i = 0; i < 10; ++i)
                {
                    Body body = BodyFactory.CreateBody(World);
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(-6.0f + 1.0f * i, 11.25f);

                    Fixture fixture = body.CreateFixture(shape);
                    fixture.Friction = 0.1f;
                }
            }

            {
                Vertices     box   = PolygonTools.CreateRectangle(7.0f, 0.25f, Vector2.Zero, 0.3f);
                PolygonShape shape = new PolygonShape(box, 0);

                Body ground = BodyFactory.CreateBody(World);
                ground.Position = new Vector2(1.0f, 6.0f);

                ground.CreateFixture(shape);
            }

            Body b2;
            {
                Vertices     box   = PolygonTools.CreateRectangle(0.25f, 1.5f);
                PolygonShape shape = new PolygonShape(box, 0);

                b2          = BodyFactory.CreateBody(World);
                b2.Position = new Vector2(-7.0f, 4.0f);

                b2.CreateFixture(shape);
            }

            Body b3;
            {
                Vertices     box   = PolygonTools.CreateRectangle(6.0f, 0.125f);
                PolygonShape shape = new PolygonShape(box, 10);

                b3          = BodyFactory.CreateBody(World);
                b3.BodyType = BodyType.Dynamic;
                b3.Position = new Vector2(-0.9f, 1.0f);
                b3.Rotation = -0.15f;

                b3.CreateFixture(shape);
            }

            Vector2 anchor = new Vector2(-2.0f, 1.0f);
            //FixedRevoluteJoint jd = new FixedRevoluteJoint(b3, b3.GetLocalPoint(anchor), anchor);
            //jd.CollideConnected = true;
            //World.AddJoint(jd);

            Body b4;

            {
                Vertices     box   = PolygonTools.CreateRectangle(0.25f, 0.25f);
                PolygonShape shape = new PolygonShape(box, 10);

                b4          = BodyFactory.CreateBody(World);
                b4.BodyType = BodyType.Dynamic;
                b4.Position = new Vector2(-10.0f, 15.0f);

                b4.CreateFixture(shape);
            }

            anchor = new Vector2(-7.0f, 15.0f);
            //FixedRevoluteJoint jd2 = new FixedRevoluteJoint(b4, b4.GetLocalPoint(anchor), anchor);
            //World.AddJoint(jd2);

            Body b5;

            {
                b5          = BodyFactory.CreateBody(World);
                b5.BodyType = BodyType.Dynamic;
                b5.Position = new Vector2(6.5f, 3.0f);

                Vertices     vertices = PolygonTools.CreateRectangle(1.0f, 0.1f, new Vector2(0.0f, -0.9f), 0.0f);
                PolygonShape shape    = new PolygonShape(vertices, 10);

                Fixture fix = b5.CreateFixture(shape);
                fix.Friction = 0.1f;

                vertices = PolygonTools.CreateRectangle(0.1f, 1.0f, new Vector2(-0.9f, 0.0f), 0.0f);

                shape.Set(vertices);
                fix          = b5.CreateFixture(shape);
                fix.Friction = 0.1f;

                vertices = PolygonTools.CreateRectangle(0.1f, 1.0f, new Vector2(0.9f, 0.0f), 0.0f);

                shape.Set(vertices);
                fix          = b5.CreateFixture(shape);
                fix.Friction = 0.1f;
            }

            anchor = new Vector2(6.0f, 2.0f);
            //FixedRevoluteJoint jd3 = new FixedRevoluteJoint(b5, b5.GetLocalPoint(anchor), anchor);
            //World.AddJoint(jd3);

            Body b6;

            {
                Vertices     box   = PolygonTools.CreateRectangle(1.0f, 0.1f);
                PolygonShape shape = new PolygonShape(box, 30);

                b6          = BodyFactory.CreateBody(World);
                b6.BodyType = BodyType.Dynamic;
                b6.Position = new Vector2(6.5f, 4.1f);

                b6.CreateFixture(shape);
            }

            anchor = new Vector2(1.0f, -0.1f);
            RevoluteJoint jd4 = new RevoluteJoint(b5, b6, b5.GetLocalPoint(b6.GetWorldPoint(anchor)), anchor);

            jd4.CollideConnected = true;
            World.AddJoint(jd4);

            Body b7;
            {
                Vertices     box   = PolygonTools.CreateRectangle(0.1f, 1.0f);
                PolygonShape shape = new PolygonShape(box, 10);

                b7          = BodyFactory.CreateBody(World);
                b7.BodyType = BodyType.Dynamic;
                b7.Position = new Vector2(7.4f, 1.0f);

                b7.CreateFixture(shape);
            }

            DistanceJoint djd = new DistanceJoint(b3, b7, new Vector2(6.0f, 0.0f), new Vector2(0.0f, -1.0f));
            Vector2       d   = djd.BodyB.GetWorldPoint(djd.LocalAnchorB) - djd.BodyA.GetWorldPoint(djd.LocalAnchorA);

            djd.Length = d.Length();
            World.AddJoint(djd);

            {
                const float radius = 0.2f;

                CircleShape shape = new CircleShape(radius, 10);

                for (int i = 0; i < 4; ++i)
                {
                    Body body = BodyFactory.CreateBody(World);
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(5.9f + 2.0f * radius * i, 2.4f);

                    Fixture fix = body.CreateFixture(shape);
                    fix.OnCollision += BallCollision;
                }
            }
        }
Ejemplo n.º 36
0
        public CollisionProcessing()
        {
            // Ground body
            {
                EdgeShape shape = new EdgeShape();
                shape.Set(new Vec2(-50.0f, 0.0f), new Vec2(50.0f, 0.0f));

                FixtureDef sd = new FixtureDef();
                sd.shape = shape;;

                BodyDef bd     = new BodyDef();
                Body    ground = m_world.CreateBody(bd);
                ground.CreateFixture(sd);
            }

            float xLo = -5.0f, xHi = 5.0f;
            float yLo = 2.0f, yHi = 35.0f;

            // Small triangle
            Vec2[] vertices = new Vec2[3];
            vertices[0].Set(-1.0f, 0.0f);
            vertices[1].Set(1.0f, 0.0f);
            vertices[2].Set(0.0f, 2.0f);

            PolygonShape polygon = new PolygonShape();

            polygon.Set(vertices, 3);

            FixtureDef triangleShapeDef = new FixtureDef();

            triangleShapeDef.shape   = polygon;
            triangleShapeDef.Density = 1.0f;

            BodyDef triangleBodyDef = new BodyDef();

            triangleBodyDef.type = BodyType._dynamicBody;
            triangleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi));

            Body body1 = m_world.CreateBody(triangleBodyDef);

            body1.CreateFixture(triangleShapeDef);

            // Large triangle (recycle definitions)
            vertices[0] *= 2.0f;
            vertices[1] *= 2.0f;
            vertices[2] *= 2.0f;
            polygon.Set(vertices, 3);

            triangleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi));

            Body body2 = m_world.CreateBody(triangleBodyDef);

            body2.CreateFixture(triangleShapeDef);

            // Small box
            polygon.SetAsBox(1.0f, 0.5f);

            FixtureDef boxShapeDef = new FixtureDef();

            boxShapeDef.shape   = polygon;
            boxShapeDef.Density = 1.0f;

            BodyDef boxBodyDef = new BodyDef();

            boxBodyDef.type = BodyType._dynamicBody;
            boxBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi));

            Body body3 = m_world.CreateBody(boxBodyDef);

            body3.CreateFixture(boxShapeDef);

            // Large box (recycle definitions)
            polygon.SetAsBox(2.0f, 1.0f);
            boxBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi));

            Body body4 = m_world.CreateBody(boxBodyDef);

            body4.CreateFixture(boxShapeDef);

            // Small circle
            CircleShape circle = new CircleShape();

            circle.m_radius = 1.0f;

            FixtureDef circleShapeDef = new FixtureDef();

            circleShapeDef.shape   = circle;
            circleShapeDef.Density = 1.0f;

            BodyDef circleBodyDef = new BodyDef();

            circleBodyDef.type = BodyType._dynamicBody;
            circleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi));

            Body body5 = m_world.CreateBody(circleBodyDef);

            body5.CreateFixture(circleShapeDef);

            // Large circle
            circle.m_radius *= 2.0f;
            circleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi));

            Body body6 = m_world.CreateBody(circleBodyDef);

            body6.CreateFixture(circleShapeDef);
        }
Ejemplo n.º 37
0
        public void Create(BroadPhase broadPhase, Body body, Transform xf, FixtureDef def)
        {
            UserData    = def.UserData;
            Friction    = def.Friction;
            Restitution = def.Restitution;
            Density     = def.Density;

            _body = body;
            _next = null;

            Filter = def.Filter;

            _isSensor = def.IsSensor;

            _type = def.Type;

            // Allocate and initialize the child shape.
            switch (_type)
            {
            case ShapeType.CircleShape:
            {
                CircleShape circle    = new CircleShape();
                CircleDef   circleDef = (CircleDef)def;
                circle._position = circleDef.LocalPosition;
                circle._radius   = circleDef.Radius;
                _shape           = circle;
            }
            break;

            case ShapeType.PolygonShape:
            {
                PolygonShape polygon    = new PolygonShape();
                PolygonDef   polygonDef = (PolygonDef)def;
                polygon.Set(polygonDef.Vertices, polygonDef.VertexCount);
                _shape = polygon;
            }
            break;

            case ShapeType.EdgeShape:
            {
                EdgeShape edge    = new EdgeShape();
                EdgeDef   edgeDef = (EdgeDef)def;
                edge.Set(edgeDef.Vertex1, edgeDef.Vertex2);
                _shape = edge;
            }
            break;

            default:
                Box2DNetDebug.Assert(false);
                break;
            }

            // Create proxy in the broad-phase.
            AABB aabb;

            _shape.ComputeAABB(out aabb, xf);

            bool inRange = broadPhase.InRange(aabb);

            // You are creating a shape outside the world box.
            Box2DNetDebug.Assert(inRange);

            if (inRange)
            {
                _proxyId = broadPhase.CreateProxy(aabb, this);
            }
            else
            {
                _proxyId = PairManager.NullProxy;
            }
        }