Пример #1
0
        private ContinuousTest()
        {
            {
                BodyDef bd = new BodyDef();
                bd.Position = new Vector2(0.0f, 0.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);

                EdgeShape edge = new EdgeShape();

                edge.SetTwoSided(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f));
                body.AddFixture(edge);

                PolygonShape shape = new PolygonShape(0.0f);
                shape.SetAsBox(0.2f, 1.0f, new Vector2(0.5f, 1.0f), 0.0f);
                body.AddFixture(shape);
            }

#if true
            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(0.0f, 20.0f);

                PolygonShape shape = new PolygonShape(1.0f);
                shape.SetAsBox(2.0f, 0.1f);

                _body = BodyFactory.CreateFromDef(World, bd);
                _body.AddFixture(shape);

                _angularVelocity      = Rand.RandomFloat(-50.0f, 50.0f);
                _body.LinearVelocity  = new Vector2(0.0f, -100.0f);
                _body.AngularVelocity = _angularVelocity;
            }
#else
            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(0.0f, 2.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);

                CircleShape shape = new CircleShape(0.5f, 1.0f);
                shape.Position = Vector2.Zero;
                body.AddFixture(shape);

                bd.IsBullet = true;
                bd.Position = new Vector2(0.0f, 10.0f);
                body        = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(shape);
                body.LinearVelocity = new Vector2(0.0f, -100.0f);
            }
#endif

            DistanceGJK.GJKCalls         = 0;
            DistanceGJK.GJKIters         = 0;
            DistanceGJK.GJKMaxIters      = 0;
            TimeOfImpact.TOICalls        = 0;
            TimeOfImpact.TOIIters        = 0;
            TimeOfImpact.TOIRootIters    = 0;
            TimeOfImpact.TOIMaxRootIters = 0;
        }
Пример #2
0
        private Heavy1Test()
        {
            {
                BodyDef bd     = new BodyDef();
                Body    ground = BodyFactory.CreateFromDef(World, bd);

                EdgeShape shape = new EdgeShape();
                shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                ground.AddFixture(shape);
            }

            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(0.0f, 0.5f);
                Body body = BodyFactory.CreateFromDef(World, bd);

                CircleShape shape = new CircleShape(10.0f);
                shape.Radius = 0.5f;
                body.AddFixture(shape);

                bd.Position  = new Vector2(0.0f, 6.0f);
                body         = BodyFactory.CreateFromDef(World, bd);
                shape.Radius = 5.0f;
                body.AddFixture(shape);
            }
        }
Пример #3
0
        private BreakableTest()
        {
            // Ground body
            {
                BodyDef bd     = new BodyDef();
                Body    ground = BodyFactory.CreateFromDef(World, bd);

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

            // Breakable dynamic body
            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(0.0f, 40.0f);
                bd.Angle    = 0.25f * MathConstants.Pi;
                _body1      = BodyFactory.CreateFromDef(World, bd);

                _shape1 = new PolygonShape(1.0f);
                _shape1.SetAsBox(0.5f, 0.5f, new Vector2(-0.5f, 0.0f), 0.0f);
                _piece1 = _body1.AddFixture(_shape1);

                _shape2 = new PolygonShape(1.0f);
                _shape2.SetAsBox(0.5f, 0.5f, new Vector2(0.5f, 0.0f), 0.0f);
                _piece2 = _body1.AddFixture(_shape2);
            }

            _break = false;
            _broke = false;
        }
Пример #4
0
        private CircleBenchmarkTest()
        {
            Body ground = BodyFactory.CreateBody(World);

            // Floor
            EdgeShape ashape = new EdgeShape(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));

            ground.AddFixture(ashape);

            // Left wall
            ashape = new EdgeShape(new Vector2(-40.0f, 0.0f), new Vector2(-40.0f, 45.0f));
            ground.AddFixture(ashape);

            // Right wall
            ashape = new EdgeShape(new Vector2(40.0f, 0.0f), new Vector2(40.0f, 45.0f));
            ground.AddFixture(ashape);

            // Roof
            ashape = new EdgeShape(new Vector2(-40.0f, 45.0f), new Vector2(40.0f, 45.0f));
            ground.AddFixture(ashape);

            CircleShape shape = new CircleShape(1.0f, 1);

            for (int i = 0; i < XCount; i++)
            {
                for (int j = 0; j < YCount; ++j)
                {
                    Body body = BodyFactory.CreateBody(World);
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(-38f + 2.1f * i, 2.0f + 2.0f * j);

                    body.AddFixture(shape);
                }
            }
        }
Пример #5
0
        private RockBreakTest()
        {
            // Ground body
            BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));

            // Breakable dynamic body
            _body1          = BodyFactory.CreateBody(World);
            _body1.BodyType = BodyType.Dynamic;
            _body1.Position = new Vector2(0.0f, 40.0f);
            _body1.Rotation = 0.25f * MathConstants.Pi;

            Vertices box = PolygonUtils.CreateRectangle(0.5f, 0.5f, new Vector2(-0.5f, 0.0f), 0.0f);

            PolygonShape shape1 = new PolygonShape(box, 1);

            _piece1 = _body1.AddFixture(shape1);

            box     = PolygonUtils.CreateRectangle(0.5f, 0.5f, new Vector2(0.5f, 0.0f), 0.0f);
            _shape2 = new PolygonShape(box, 1);

            _piece2 = _body1.AddFixture(_shape2);

            _break = false;
            _broke = false;
        }
Пример #6
0
        private SensorsTest()
        {
            {
                BodyDef bd     = new BodyDef();
                Body    ground = BodyFactory.CreateFromDef(World, bd);

                {
                    EdgeShape shape = new EdgeShape();
                    shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                    ground.AddFixture(shape);
                }

#if false
                {
                    FixtureDef sd;
                    sd.SetAsBox(10.0f, 2.0f, b2Vec2(0.0f, 20.0f), 0.0f);
                    sd.isSensor = true;
                    _sensor     = ground.CreateFixture(sd);
                }
#else
                {
                    CircleShape shape = new CircleShape(0.0f);
                    shape.Radius   = 5.0f;
                    shape.Position = new Vector2(0.0f, 10.0f);

                    FixtureDef fd = new FixtureDef();
                    fd.Shape    = shape;
                    fd.IsSensor = true;
                    _sensor     = ground.AddFixture(fd);
                }
#endif
            }

            {
                CircleShape shape = new CircleShape(1.0f);
                shape.Radius = 1.0f;

                for (int i = 0; i < _count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(-10.0f + 3.0f * i, 20.0f);
                    bd.UserData = i;

                    _touching[i] = false;
                    _bodies[i]   = BodyFactory.CreateFromDef(World, bd);

                    _bodies[i].AddFixture(shape);
                }
            }

            _force = 100.0f;

            World.ContactManager.BeginContact += BeginContact;
            World.ContactManager.EndContact   += EndContact;
        }
Пример #7
0
        private ConfinedTest()
        {
            {
                BodyDef bd     = new BodyDef();
                Body    ground = BodyFactory.CreateFromDef(World, bd);

                EdgeShape shape = new EdgeShape();

                // Floor
                shape.SetTwoSided(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f));
                ground.AddFixture(shape);

                // Left wall
                shape.SetTwoSided(new Vector2(-10.0f, 0.0f), new Vector2(-10.0f, 20.0f));
                ground.AddFixture(shape);

                // Right wall
                shape.SetTwoSided(new Vector2(10.0f, 0.0f), new Vector2(10.0f, 20.0f));
                ground.AddFixture(shape);

                // Roof
                shape.SetTwoSided(new Vector2(-10.0f, 20.0f), new Vector2(10.0f, 20.0f));
                ground.AddFixture(shape);
            }

            {
                float       radius = 0.5f;
                CircleShape shape  = new CircleShape(1.0f);
                shape.Position = Vector2.Zero;
                shape.Radius   = radius;

                FixtureDef fd = new FixtureDef();
                fd.Shape    = shape;
                fd.Friction = 0.1f;

                for (int j = 0; j < _columnCount; ++j)
                {
                    for (int i = 0; i < _rowCount; ++i)
                    {
                        BodyDef bd = new BodyDef();
                        bd.Type     = BodyType.Dynamic;
                        bd.Position = new Vector2(-10.0f + (2.1f * j + 1.0f + 0.01f * i) * radius, (2.0f * i + 1.0f) * radius);
                        Body body = BodyFactory.CreateFromDef(World, bd);

                        body.AddFixture(fd);
                    }
                }

                World.Gravity = new Vector2(0.0f, 0.0f);
            }
        }
Пример #8
0
        private CircleStackTest()
        {
            {
                BodyDef bd     = new BodyDef();
                Body    ground = BodyFactory.CreateFromDef(World, bd);

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

            {
                CircleShape shape = new CircleShape(1.0f, 1.0f);

                for (int i = 0; i < _count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(0.0f, 4.0f + 3.0f * i);

                    _bodies[i] = BodyFactory.CreateFromDef(World, bd);

                    _bodies[i].AddFixture(shape);

                    _bodies[i].LinearVelocity = new Vector2(0.0f, -50.0f);
                }
            }
        }
Пример #9
0
        private CuttingTest()
        {
            //Ground
            BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));

            Vertices     box   = PolygonUtils.CreateRectangle(0.5f, 0.5f);
            PolygonShape shape = new PolygonShape(box, 5);

            Vector2 x      = new Vector2(-7.0f, 0.75f);
            Vector2 deltaX = new Vector2(0.5625f, 1.25f);
            Vector2 deltaY = new Vector2(1.125f, 0.0f);

            for (int i = 0; i < Count; ++i)
            {
                Vector2 y = x;

                for (int j = i; j < Count; ++j)
                {
                    Body body = BodyFactory.CreateBody(World);
                    body.BodyType = BodyType.Dynamic;
                    body.Position = y;
                    body.AddFixture(shape);

                    y += deltaY;
                }

                x += deltaX;
            }
        }
Пример #10
0
        public override void Keyboard(KeyboardManager keyboard)
        {
            if (keyboard.IsNewKeyPress(Keys.C))
            {
                if (_fixture2 == null)
                {
                    CircleShape shape = new CircleShape(10.0f);
                    shape.Radius   = 3.0f;
                    shape.Position = new Vector2(0.5f, -4.0f);
                    _fixture2      = _body.AddFixture(shape);
                    _body.Awake    = true;
                }
            }
            else if (keyboard.IsNewKeyPress(Keys.D))
            {
                if (_fixture2 != null)
                {
                    _body.RemoveFixture(_fixture2);
                    _fixture2   = null;
                    _body.Awake = true;
                }
            }
            else if (keyboard.IsNewKeyPress(Keys.S))
            {
                if (_fixture2 != null)
                {
                    _sensor            = !_sensor;
                    _fixture2.IsSensor = _sensor;
                }
            }

            base.Keyboard(keyboard);
        }
Пример #11
0
        private void Break()
        {
            // Create two bodies from one.
            Body    body1  = _piece1.Body;
            Vector2 center = body1.WorldCenter;

            body1.RemoveFixture(_piece2);
            _piece2 = null;

            Body body2 = BodyFactory.CreateBody(World);

            body2.BodyType = BodyType.Dynamic;
            body2.Position = body1.Position;
            body2.Rotation = body1.Rotation;

            _piece2 = body2.AddFixture(_shape2);

            // Compute consistent velocities for new bodies based on
            // cached velocity.
            Vector2 center1 = body1.WorldCenter;
            Vector2 center2 = body2.WorldCenter;

            Vector2 velocity1 = _velocity + MathUtils.Cross(_angularVelocity, center1 - center);
            Vector2 velocity2 = _velocity + MathUtils.Cross(_angularVelocity, center2 - center);

            body1.AngularVelocity = _angularVelocity;
            body1.LinearVelocity  = velocity1;

            body2.AngularVelocity = _angularVelocity;
            body2.LinearVelocity  = velocity2;
        }
Пример #12
0
        public override void Keyboard(KeyboardManager keyboard)
        {
            if (keyboard.IsNewKeyPress(Keys.OemComma))
            {
                if (_bullet != null)
                {
                    World.RemoveBody(_bullet);
                    _bullet = null;
                }

                {
                    CircleShape shape = new CircleShape(0.25f, 20);

                    FixtureDef fd = new FixtureDef();
                    fd.Shape       = shape;
                    fd.Restitution = 0.05f;

                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.IsBullet = true;
                    bd.Position = new Vector2(-31.0f, 5.0f);

                    _bullet = BodyFactory.CreateFromDef(World, bd);
                    _bullet.AddFixture(fd);

                    _bullet.LinearVelocity = new Vector2(400.0f, 0.0f);
                }
            }

            base.Keyboard(keyboard);
        }
Пример #13
0
        private ShapeEditingTest()
        {
            {
                BodyDef bd     = new BodyDef();
                Body    ground = BodyFactory.CreateFromDef(World, bd);

                EdgeShape shape = new EdgeShape();
                shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                ground.AddFixture(shape);
            }

            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(0.0f, 10.0f);
                _body       = BodyFactory.CreateFromDef(World, bd);

                PolygonShape shape = new PolygonShape(10.0f);
                shape.SetAsBox(4.0f, 4.0f, new Vector2(0.0f, 0.0f), 0.0f);
                _fixture1 = _body.AddFixture(shape);

                _fixture2 = null;

                _sensor = false;
            }
        }
        private Body AddNode(Body parent, Vector2 localAnchor, int depth, float offset, float a)
        {
            float   density = 20.0f;
            Vector2 h       = new Vector2(0.0f, a);

            Vector2 p = parent.Position + localAnchor - h;

            BodyDef bodyDef = new BodyDef();

            bodyDef.Type     = BodyType.Dynamic;
            bodyDef.Position = p;
            Body body = BodyFactory.CreateFromDef(World, bodyDef);

            PolygonShape shape = new PolygonShape(density);

            shape.SetAsBox(0.25f * a, a);
            body.AddFixture(shape);

            if (depth == _depth)
            {
                return(body);
            }

            shape.SetAsBox(offset, 0.25f * a, new Vector2(0, -a), 0.0f);
            body.AddFixture(shape);

            Vector2 a1    = new Vector2(offset, -a);
            Vector2 a2    = new Vector2(-offset, -a);
            Body    body1 = AddNode(body, a1, depth + 1, 0.5f * offset, a);
            Body    body2 = AddNode(body, a2, depth + 1, 0.5f * offset, a);

            RevoluteJointDef jointDef = new RevoluteJointDef();

            jointDef.BodyA        = body;
            jointDef.LocalAnchorB = h;

            jointDef.LocalAnchorA = a1;
            jointDef.BodyB        = body1;
            JointFactory.CreateFromDef(World, jointDef);

            jointDef.LocalAnchorA = a2;
            jointDef.BodyB        = body2;
            JointFactory.CreateFromDef(World, jointDef);

            return(body);
        }
Пример #15
0
        //Contributed by Matthew Bettcher

        /// <summary>Convert a path into a set of edges and attaches them to the specified body. Note: use only for static edges.</summary>
        /// <param name="path">The path.</param>
        /// <param name="body">The body.</param>
        /// <param name="subdivisions">The subdivisions.</param>
        public static void ConvertPathToEdges(Path path, Body body, int subdivisions)
        {
            Vertices verts = path.GetVertices(subdivisions);

            if (path.Closed)
            {
                ChainShape chain = new ChainShape(verts, true);
                body.AddFixture(chain);
            }
            else
            {
                for (int i = 1; i < verts.Count; i++)
                {
                    body.AddFixture(new EdgeShape(verts[i], verts[i - 1]));
                }
            }
        }
Пример #16
0
        public static Fixture AttachLoopShape(Vertices vertices, Body body, object?userData = null)
        {
            ChainShape shape = new ChainShape(vertices, true);
            Fixture    f     = body.AddFixture(shape);

            f.UserData = userData;
            return(f);
        }
Пример #17
0
        public static Fixture AttachEdge(Vector2 start, Vector2 end, Body body, object?userData = null)
        {
            EdgeShape edgeShape = new EdgeShape(start, end);
            Fixture   f         = body.AddFixture(edgeShape);

            f.UserData = userData;
            return(f);
        }
        private PolygonShapesTest()
        {
            // Ground body
            {
                BodyDef bd     = new BodyDef();
                Body    ground = BodyFactory.CreateFromDef(World, bd);

                EdgeShape shape = new EdgeShape();
                shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                ground.AddFixture(shape);
            }

            {
                Vertices vertices = new Vertices(3);
                vertices.Add(new Vector2(-0.5f, 0.0f));
                vertices.Add(new Vector2(0.5f, 0.0f));
                vertices.Add(new Vector2(0.0f, 1.5f));
                _polygons[0] = new PolygonShape(vertices, 1.0f);
            }

            {
                Vertices vertices = new Vertices(3);
                vertices.Add(new Vector2(-0.1f, 0.0f));
                vertices.Add(new Vector2(0.1f, 0.0f));
                vertices.Add(new Vector2(0.0f, 1.5f));
                _polygons[1] = new PolygonShape(vertices, 1.0f);
            }

            {
                float w = 1.0f;
                float b = w / (2.0f + MathUtils.Sqrt(2.0f));
                float s = MathUtils.Sqrt(2.0f) * 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));

                _polygons[2] = new PolygonShape(vertices, 1.0f);
            }

            {
                _polygons[3] = new PolygonShape(1.0f);
                _polygons[3].SetAsBox(0.5f, 0.5f);
            }

            {
                _circle        = new CircleShape(1.0f);
                _circle.Radius = 0.5f;
            }

            _bodyIndex = 0;
        }
Пример #19
0
        public static Fixture AttachRectangle(float width, float height, float density, Vector2 offset, Body body, object?userData = null)
        {
            Vertices rectangleVertices = PolygonUtils.CreateRectangle(width / 2, height / 2);

            rectangleVertices.Translate(ref offset);
            PolygonShape rectangleShape = new PolygonShape(rectangleVertices, density);
            Fixture      f = body.AddFixture(rectangleShape);

            f.UserData = userData;
            return(f);
        }
Пример #20
0
        private PathTest()
        {
            //Single body that moves around path
            _movingBody          = BodyFactory.CreateBody(World);
            _movingBody.Position = new Vector2(-25, 25);
            _movingBody.BodyType = BodyType.Dynamic;
            _movingBody.AddFixture(new PolygonShape(PolygonUtils.CreateRectangle(0.5f, 0.5f), 1));

            //Static shape made up of bodies
            _path = new Path();
            _path.Add(new Vector2(0, 20));
            _path.Add(new Vector2(5, 15));
            _path.Add(new Vector2(20, 18));
            _path.Add(new Vector2(15, 1));
            _path.Add(new Vector2(-5, 14));
            _path.Closed = true;

            CircleShape shape = new CircleShape(0.25f, 1);

            PathManager.EvenlyDistributeShapesAlongPath(World, _path, shape, BodyType.Static, 100);

            //Smaller shape that is movable. Created from small rectangles and circles.
            Vector2 xform = new Vector2(0.5f, 0.5f);

            _path.Scale(ref xform);
            xform = new Vector2(5, 5);
            _path.Translate(ref xform);

            List <Shape> shapes = new List <Shape>(2);

            shapes.Add(new PolygonShape(PolygonUtils.CreateRectangle(0.5f, 0.5f, new Vector2(-0.1f, 0), 0), 1));
            shapes.Add(new CircleShape(0.5f, 1));

            List <Body> bodies = PathManager.EvenlyDistributeShapesAlongPath(World, _path, shapes, BodyType.Dynamic, 20);

            //Attach the bodies together with revolute joints
            PathManager.AttachBodiesWithRevoluteJoint(World, bodies, new Vector2(0, 0.5f), new Vector2(0, -0.5f), true, true);

            xform = new Vector2(-25, 0);
            _path.Translate(ref xform);

            Body body = BodyFactory.CreateBody(World);

            body.BodyType = BodyType.Static;

            //Static shape made up of edges
            PathManager.ConvertPathToEdges(_path, body, 25);
            body.Position -= new Vector2(0, 10);

            xform = new Vector2(0, 15);
            _path.Translate(ref xform);

            PathManager.ConvertPathToPolygon(_path, body, 1, 50);
        }
Пример #21
0
        public static List <Fixture> AttachCompoundPolygon(List <Vertices> list, float density, Body body)
        {
            List <Fixture> res = new List <Fixture>(list.Count);

            //Then we create several fixtures using the body
            foreach (Vertices vertices in list)
            {
                if (vertices.Count == 2)
                {
                    EdgeShape shape = new EdgeShape(vertices[0], vertices[1]);
                    res.Add(body.AddFixture(shape));
                }
                else
                {
                    PolygonShape shape = new PolygonShape(vertices, density);
                    res.Add(body.AddFixture(shape));
                }
            }

            return(res);
        }
Пример #22
0
        private TumblerTest()
        {
            Body ground;

            {
                BodyDef bd = new BodyDef();
                ground = BodyFactory.CreateFromDef(World, bd);
            }

            {
                BodyDef bd = new BodyDef();
                bd.Type       = BodyType.Dynamic;
                bd.AllowSleep = false;
                bd.Position   = new Vector2(0.0f, 10.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);

                PolygonShape shape = new PolygonShape(5.0f);
                shape.SetAsBox(0.5f, 10.0f, new Vector2(10.0f, 0.0f), 0.0f);
                body.AddFixture(shape);
                shape.SetAsBox(0.5f, 10.0f, new Vector2(-10.0f, 0.0f), 0.0f);
                body.AddFixture(shape);
                shape.SetAsBox(10.0f, 0.5f, new Vector2(0.0f, 10.0f), 0.0f);
                body.AddFixture(shape);
                shape.SetAsBox(10.0f, 0.5f, new Vector2(0.0f, -10.0f), 0.0f);
                body.AddFixture(shape);

                RevoluteJointDef jd = new RevoluteJointDef();
                jd.BodyA          = ground;
                jd.BodyB          = body;
                jd.LocalAnchorA   = new Vector2(0.0f, 10.0f);
                jd.LocalAnchorB   = new Vector2(0.0f, 0.0f);
                jd.ReferenceAngle = 0.0f;
                jd.MotorSpeed     = 0.05f * MathConstants.Pi;
                jd.MaxMotorTorque = 1e8f;
                jd.EnableMotor    = true;
                _joint            = (RevoluteJoint)JointFactory.CreateFromDef(World, jd);
            }

            _count2 = 0;
        }
Пример #23
0
        private BulletTest()
        {
            {
                BodyDef bd = new BodyDef();
                bd.Position = new Vector2(0.0f, 0.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);

                EdgeShape edge = new EdgeShape(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f));
                body.AddFixture(edge);

                PolygonShape shape = new PolygonShape(0.0f);
                shape.SetAsBox(0.2f, 1.0f, new Vector2(0.5f, 1.0f), 0.0f);
                body.AddFixture(shape);
            }

            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(0.0f, 4.0f);

                PolygonShape box = new PolygonShape(1.0f);
                box.SetAsBox(2.0f, 0.1f);

                _body = BodyFactory.CreateFromDef(World, bd);
                _body.AddFixture(box);

                box.SetAsBox(0.25f, 0.25f);

                _x          = 0.20352793f;
                bd.Position = new Vector2(_x, 10.0f);
                bd.IsBullet = true;

                box.Density = 100;

                _bullet = BodyFactory.CreateFromDef(World, bd);
                _bullet.AddFixture(box);

                _bullet.LinearVelocity = new Vector2(0.0f, -50.0f);
            }
        }
Пример #24
0
        public static Fixture AttachPolygon(Vertices vertices, float density, Body body, object?userData = null)
        {
            if (vertices.Count <= 1)
            {
                throw new ArgumentOutOfRangeException(nameof(vertices), "Too few points to be a polygon");
            }

            PolygonShape polygon = new PolygonShape(vertices, density);
            Fixture      f       = body.AddFixture(polygon);

            f.UserData = userData;
            return(f);
        }
Пример #25
0
        public static Fixture AttachCircle(float radius, float density, Body body, object?userData = null)
        {
            if (radius <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(radius), "Radius must be more than 0 meters");
            }

            CircleShape circleShape = new CircleShape(radius, density);
            Fixture     f           = body.AddFixture(circleShape);

            f.UserData = userData;
            return(f);
        }
Пример #26
0
        private WheelJointTest()
        {
            Body ground;

            {
                BodyDef bd = new BodyDef();
                ground = BodyFactory.CreateFromDef(World, bd);

                EdgeShape shape = new EdgeShape();
                shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                ground.AddFixture(shape);
            }

            _enableLimit = true;
            _enableMotor = false;
            _motorSpeed  = 10.0f;

            {
                CircleShape shape = new CircleShape(5.0f);
                shape.Radius = 2.0f;

                BodyDef bd = new BodyDef();
                bd.Type       = BodyType.Dynamic;
                bd.Position   = new Vector2(0.0f, 10.0f);
                bd.AllowSleep = false;
                Body body = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(shape);

                WheelJointDef jd = new WheelJointDef();

                // Horizontal
                jd.Initialize(ground, body, bd.Position, new Vector2(0.0f, 1.0f));

                jd.MotorSpeed       = _motorSpeed;
                jd.MaxMotorTorque   = 10000.0f;
                jd.EnableMotor      = _enableMotor;
                jd.LowerTranslation = -3.0f;
                jd.UpperTranslation = 3.0f;
                jd.EnableLimit      = _enableLimit;

                float hertz        = 1.0f;
                float dampingRatio = 0.7f;
                JointHelper.LinearStiffness(hertz, dampingRatio, ground, body, out float stiffness, out float damping);
                jd.Stiffness = stiffness;
                jd.Damping   = damping;

                _joint = (WheelJoint)JointFactory.CreateFromDef(World, jd);
            }
        }
Пример #27
0
        private PulleyJointTest()
        {
            float y = 16.0f;
            float L = 12.0f;
            float a = 1.0f;
            float b = 2.0f;

            Body ground;
            {
                BodyDef bd = new BodyDef();
                ground = BodyFactory.CreateFromDef(World, bd);

                CircleShape circle = new CircleShape(0.0f);
                circle.Radius = 2.0f;

                circle.Position = new Vector2(-10.0f, y + b + L);
                ground.AddFixture(circle);

                circle.Position = new Vector2(10.0f, y + b + L);
                ground.AddFixture(circle);
            }

            {
                PolygonShape shape = new PolygonShape(5.0f);
                shape.SetAsBox(a, b);

                BodyDef bd = new BodyDef();
                bd.Type = BodyType.Dynamic;

                //bd.FixedRotation = true;
                bd.Position = new Vector2(-10.0f, y);
                Body body1 = BodyFactory.CreateFromDef(World, bd);
                body1.AddFixture(shape);

                bd.Position = new Vector2(10.0f, y);
                Body body2 = BodyFactory.CreateFromDef(World, bd);
                body2.AddFixture(shape);

                PulleyJointDef pulleyDef     = new PulleyJointDef();
                Vector2        anchor1       = new Vector2(-10.0f, y + b);
                Vector2        anchor2       = new Vector2(10.0f, y + b);
                Vector2        groundAnchor1 = new Vector2(-10.0f, y + b + L);
                Vector2        groundAnchor2 = new Vector2(10.0f, y + b + L);
                pulleyDef.Initialize(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, 1.5f);

                _joint1 = (PulleyJoint)JointFactory.CreateFromDef(World, pulleyDef);
            }
        }
Пример #28
0
        /// <summary>Convert a closed path into a polygon. Convex decomposition is automatically performed.</summary>
        /// <param name="path">The path.</param>
        /// <param name="body">The body.</param>
        /// <param name="density">The density.</param>
        /// <param name="subdivisions">The subdivisions.</param>
        public static void ConvertPathToPolygon(Path path, Body body, float density, int subdivisions)
        {
            if (!path.Closed)
            {
                throw new Exception("The path must be closed to convert to a polygon.");
            }

            List <Vector2> verts = path.GetVertices(subdivisions);

            List <Vertices> decomposedVerts = Triangulate.ConvexPartition(new Vertices(verts), TriangulationAlgorithm.Bayazit);

            foreach (Vertices item in decomposedVerts)
            {
                body.AddFixture(new PolygonShape(item, density));
            }
        }
Пример #29
0
        public override void Update(GameSettings settings, GameTime gameTime)
        {
            base.Update(settings, gameTime);

            if (_count2 < _eCount)
            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(0.0f, 10.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);

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

                ++_count2;
            }
        }
Пример #30
0
        private PrismaticJointTest()
        {
            Body ground;

            {
                BodyDef bd = new BodyDef();
                ground = BodyFactory.CreateFromDef(World, bd);

                EdgeShape shape = new EdgeShape();
                shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                ground.AddFixture(shape);
            }

            _enableLimit = true;
            _enableMotor = false;
            _motorSpeed  = 10.0f;

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

                BodyDef bd = new BodyDef();
                bd.Type       = BodyType.Dynamic;
                bd.Position   = new Vector2(0.0f, 10.0f);
                bd.Angle      = 0.5f * MathConstants.Pi;
                bd.AllowSleep = false;
                Body body = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(shape);

                PrismaticJointDef pjd = new PrismaticJointDef();

                // Horizontal
                pjd.Initialize(ground, body, bd.Position, new Vector2(1.0f, 0.0f));

                pjd.MotorSpeed       = _motorSpeed;
                pjd.MaxMotorForce    = 10000.0f;
                pjd.EnableMotor      = _enableMotor;
                pjd.LowerTranslation = -10.0f;
                pjd.UpperTranslation = 10.0f;
                pjd.EnableLimit      = _enableLimit;

                _joint = (PrismaticJoint)JointFactory.CreateFromDef(World, pjd);
            }
        }