Esempio n. 1
0
        public VaryingRestitution()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

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

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

                float[] restitution = {0.0f, 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f};

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

                    Body body = m_world.CreateBody(bd);

                    fd.Restitution = restitution[i];
                    fd.UserData = i;
                    body.CreateFixture(fd);
                }
            }
        }
Esempio n. 2
0
        public LineJoint()
        {
            Body ground = null;
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));

                BodyDef bd = new BodyDef();
                ground = m_world.CreateBody(bd);
                ground.CreateFixture(shape, 0.0f);
            }

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

                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(0.0f, 7.0f);
                Body body = m_world.CreateBody(bd);
                body.CreateFixture(shape, 1.0f);

                LineJointDef jd = new LineJointDef();
                Vec2 axis = new Vec2(2.0f, 1.0f);
                axis.Normalize();
                jd.Initialize(ground, body, new Vec2(0.0f, 8.5f), axis);
                jd.MotorSpeed = 0.0f;
                jd.MaxMotorForce = 100.0f;
                jd.EnableMotor = true;
                jd.LowerTranslation = -4.0f;
                jd.UpperTranslation = 4.0f;
                jd.EnableLimit = true;
                m_world.CreateJoint(jd);
            }
        }
Esempio n. 3
0
        public SphereStack()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

            {
                CircleShape shape = new CircleShape();

                for (int i = 0; i < e_count; ++i)
                {
                    shape.Radius = Rand.RandomFloat(0.5f, 0.5f);
                    BodyDef bd = new BodyDef();
                    bd.BodyType = BodyType.Dynamic;
                    bd.Position = new Vec2(0.0f, 4.0f + 3.0f * i);

                    m_bodies[i] = m_world.CreateBody(bd);

                    m_bodies[i].CreateFixture(shape, 1.0f);
                }
            }
        }
Esempio n. 4
0
        public Confined()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();

                // Floor
                shape.SetAsEdge(new Vec2(-10.0f, 0.0f), new Vec2(10.0f, 0.0f));
                ground.CreateFixture(shape, 0.0f);

                // Left wall
                shape.SetAsEdge(new Vec2(-10.0f, 0.0f), new Vec2(-10.0f, 20.0f));
                ground.CreateFixture(shape, 0.0f);

                // Right wall
                shape.SetAsEdge(new Vec2(10.0f, 0.0f), new Vec2(10.0f, 20.0f));
                ground.CreateFixture(shape, 0.0f);

                // Roof
                shape.SetAsEdge(new Vec2(-10.0f, 20.0f), new Vec2(10.0f, 20.0f));
                ground.CreateFixture(shape, 0.0f);
            }

            m_world.Gravity = new Vec2(0.0f, 0.0f);
        }
Esempio n. 5
0
        public MovingJoint()
        {
            var capeFixture = new FixtureDef(new PolygonShape(0.08f, 0.4f, (float)(Math.PI)), 0.2f);
            var capeBody = new BodyDef(BodyType.Dynamic, new Vec2(0, 10));

            Body testbody = m_world.CreateBody(capeBody);
            testbody.CreateFixture(capeFixture);

            staticBody = m_world.CreateBody(new BodyDef(BodyType.Static, testbody.WorldCenter + new Vec2(-0.08f / 25, 0.4f)));
            staticBody.CreateFixture(new CircleShape(0.15f), 0);

            {
                RevoluteJointDef rjd = new RevoluteJointDef();
                rjd.Initialize(testbody, staticBody, testbody.WorldCenter + new Vec2(0.0f, 0.4f));
                joint = (RevoluteJoint)m_world.CreateJoint(rjd);
            }

            // build cape
            Body lastBody = testbody;
            for (int i = 0; i < 8; ++i)
            {
                capeBody.Position = new Vec2(capeBody.Position.X, capeBody.Position.Y - 0.8f);

                var nextBody = m_world.CreateBody(capeBody);
                nextBody.CreateFixture(capeFixture);

                var joint = new RevoluteJointDef();
                joint.Initialize(lastBody, nextBody, nextBody.WorldCenter + new Vec2(0.0f, 0.4f));
                m_world.CreateJoint(joint);

                lastBody = nextBody;
            }
        }
Esempio n. 6
0
        public Revolute()
        {
            System.Collections.Generic.List<JointDef> joints = new System.Collections.Generic.List<JointDef>();

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

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

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

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

                RevoluteJointDef rjd = new RevoluteJointDef();

                bd.Position = new Vec2(0.0f, 20.0f);
                Body body = m_world.CreateBody(bd);
                body.CreateFixture(shape, 5.0f);

                float w = 100.0f;
                body.AngularVelocity = w;
                body.LinearVelocity = new Vec2(-8.0f * w, 0.0f);

                rjd.Initialize(ground, body, new Vec2(0.0f, 12.0f));
                rjd.MotorSpeed = 1.0f * (float)Math.PI;
                rjd.MaxMotorTorque = 10000.0f;
                rjd.EnableMotor = false;
                rjd.LowerAngle = -0.25f * (float)Math.PI;
                rjd.UpperAngle = 0.5f * (float)Math.PI;
                rjd.EnableLimit = true;
                rjd.CollideConnected = true;

                m_joint = (RevoluteJoint)m_world.CreateJoint(rjd);
                joints.Add(rjd);
            }

            using (System.IO.FileStream fs = new System.IO.FileStream("out.xml", System.IO.FileMode.Create))
            {
                var serializer = Box2CS.Serialize.WorldSerializer.SerializeWorld(m_world, new Box2CS.Serialize.WorldXmlSerializer());

                foreach (var j in joints)
                    serializer.AddJoint(j);

                serializer.Serialize(fs);
            }
        }
Esempio n. 7
0
        /// Main...
        public ElasticBody()
        {
            Program.MainForm.ViewZoom = 0.25f;

            /// Bottom static body
            {
                PolygonShape sd = new PolygonShape();
                sd.SetAsBox(50.0f, 2.0f);
                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(-1.0f, -7.5f);

                m_ground = m_world.CreateBody(bd);
                m_ground.CreateFixture(new FixtureDef(sd, 0.0f, 0.1f, 0.1f));
            }

            /// "Elastic body" 64 bodies - something like a lin. elastic compound
            /// connected via dynamic forces (springs)
            {
                PolygonShape sd = new PolygonShape();
                sd.SetAsBox(width, height);

                FixtureDef sdf = new FixtureDef();
                sdf.Density    = 1.5f;
                sdf.Friction   = 0.01f;
                sdf.Filter.GroupIndex = -1;
                sdf.Shape = sd;
                Vec2 startpoint = new Vec2(0, 0);
                BodyDef    bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Bullet = false;
              	 			//bd.AllowSleep = false;
                for (int i = 0; i < BodyCountY; ++i)
                {
                    for (int j = 0; j < BodyCountX; ++j)
                    {
                        bd.Position = new Vec2(j*(width*2), 2.51f + (height*2) * i);
                        bd.Position  += startpoint;
                        Body body  = m_world.CreateBody(bd);
                        bodies[BodyCountX*i+j] = body;
                        body.CreateFixture(sdf);
                    }
                }
            }
        }
Esempio n. 8
0
        public Prismatic()
        {
            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = m_world.CreateBody(bd);

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

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

                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(-10.0f, 10.0f);
                bd.Angle = 0.5f * (float)Math.PI;
                bd.AllowSleep = false;
                Body body = m_world.CreateBody(bd);
                body.CreateFixture(shape, 5.0f);

                PrismaticJointDef pjd = new PrismaticJointDef();

                // Bouncy limit
                Vec2 axis = new Vec2(2.0f, 1.0f);
                axis.Normalize();
                pjd.Initialize(ground, body, new Vec2(0.0f, 0.0f), axis);

                // Non-bouncy limit
                //pjd.Initialize(ground, body, new Vec2(-10.0f, 10.0f), new Vec2(1.0f, 0.0f));

                pjd.MotorSpeed = 10.0f;
                pjd.MaxMotorForce = 10000.0f;
                pjd.EnableMotor = true;
                pjd.LowerTranslation = 0.0f;
                pjd.UpperTranslation = 20.0f;
                pjd.EnableLimit = false;

                m_joint = (PrismaticJoint)m_world.CreateJoint(pjd);
            }
        }
Esempio n. 9
0
        public SensorTest()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

                {
                    CircleShape shape = new CircleShape();
                    shape.Radius = 5.0f;
                    shape.Position = new Vec2(0.0f, 10.0f);

                    FixtureDef fd = new FixtureDef();
                    fd.Shape = shape;
                    fd.IsSensor = true;
                    m_sensor = ground.CreateFixture(fd);
                }
            }

            {
                CircleShape shape = new CircleShape();

                for (int i = 0; i < e_count; ++i)
                {
                    shape.Radius = Rand.RandomFloat(0.85f, 1.0f);

                    BodyDef bd = new BodyDef();
                    bd.BodyType = BodyType.Dynamic;
                    bd.Position = new Vec2(-10.0f + 3.0f * i, 20.0f);
                    bd.UserData = i;

                    m_touching[i] = false;
                    m_bodies[i] = m_world.CreateBody(bd);

                    m_bodies[i].CreateFixture(shape, 1.0f);
                }
            }
        }
Esempio n. 10
0
        public Body[] GenerateBodies(World world, Vec2 basePosition, FixtureDef def)
        {
            if (_vecs.Count <= 1)
                throw new ArgumentOutOfRangeException("Vecs");

            Body[] bodies = new Body[_vecs.Count - 1];

            for (int i = 0; i < _vecs.Count - 1; ++i)
            {
                PolygonShape edge = new PolygonShape(_vecs[i], _vecs[i + 1]);

                BodyDef bd = new BodyDef();
                bd.Position = basePosition;

                bodies[i] = world.CreateBody(bd);
                bodies[i].CreateFixture(new FixtureDef(edge, 0, def.Restitution, def.Friction, false, def.UserData));
            }

            return bodies;
        }
Esempio n. 11
0
        void CreateCircle()
        {
            float radius = 2.0f;
            CircleShape shape = new CircleShape();
            shape.Position = Vec2.Empty;
            shape.Radius = radius;

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

            Vec2 p = new Vec2(Rand.RandomFloat(), 3.0f + Rand.RandomFloat());
            BodyDef bd = new BodyDef();
            bd.BodyType = BodyType.Dynamic;
            bd.Position = p;
            //bd.allowSleep = false;
            Body body = m_world.CreateBody(bd);

            body.CreateFixture(fd);
        }
Esempio n. 12
0
        public OneSidedPlatform()
        {
            // Ground
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

            // Platform
            {
                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(0.0f, 10.0f);
                Body body = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(3.0f, 0.5f);
                m_platform = body.CreateFixture(shape, 0.0f);

                m_top = 10.0f + 0.5f;
            }

            // Actor
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(0.0f, 12.0f);
                Body body = m_world.CreateBody(bd);

                m_radius = 0.5f;
                CircleShape shape = new CircleShape();
                shape.Radius = m_radius;
                m_character = body.CreateFixture(shape, 20.0f);

                body.LinearVelocity = new Vec2(0.0f, -50.0f);
            }
        }
Esempio n. 13
0
        public ShapeEditing()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(0.0f, 10.0f);
                m_body = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(4.0f, 4.0f, new Vec2(0.0f, 0.0f), 0.0f);
                m_fixture1 = m_body.CreateFixture(shape, 10.0f);
                m_fixture2 = null;
            }
        }
Esempio n. 14
0
        public TitleState(StateStack stack, Context context)
            : base(stack, context)
        {
            starttimer = new Clock();
            starttimer.Restart();

            titletext = new Text();
            titletext.Scale = new Vector2f(2, 2);
            titletext.DisplayedString = "PIXELTASIM";
            titletext.Font = mContext.mFonts.get(FontID.Title);
            titletext.centerOrigin();
            titletext.Position = new Vector2f(mContext.mWindow.Size.X/2, mContext.mWindow.Size.Y / 8);
            titletext.Color = Color.Black;

            square = new RectangleShape(new Vector2f(UnitConverter.toPixScale(0.5f), UnitConverter.toPixScale(0.5f)));
            square.centerOrigin();
            square.FillColor = Color.Red;
            square.OutlineColor = Color.Black;
            square.OutlineThickness = 1;

            b2World = new World(new Vec2(0, 10), false);
            BodyDef b2Def = new BodyDef();
            b2Def.BodyType = BodyType.Dynamic;
            b2Def.Position = new Vec2(UnitConverter.toSimScale(mContext.mWindow.Size.X / 2), UnitConverter.toSimScale(mContext.mWindow.Size.Y / 8*3));
            b2Body = b2World.CreateBody(b2Def);

            PolygonShape dynamicbox = new PolygonShape();
            dynamicbox.SetAsBox(UnitConverter.toSimScale(32), UnitConverter.toSimScale(32));

            FixtureDef fixDef = new FixtureDef();
            fixDef.Shape = dynamicbox;
            fixDef.Density = 1;
            fixDef.Friction = 0.3f;
            b2Body.CreateFixture(fixDef);

            square.Position = new Vector2f(UnitConverter.toPixScale(b2Body.Position.X), UnitConverter.toPixScale(b2Body.Position.Y));
        }
Esempio n. 15
0
        public VaryingFriction()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

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

                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(-4.0f, 22.0f);
                bd.Angle = -0.25f;

                Body ground = m_world.CreateBody(bd);
                ground.CreateFixture(shape, 0.0f);
            }

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

                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(10.5f, 19.0f);

                Body ground = m_world.CreateBody(bd);
                ground.CreateFixture(shape, 0.0f);
            }

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

                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(4.0f, 14.0f);
                bd.Angle = 0.25f;

                Body ground = m_world.CreateBody(bd);
                ground.CreateFixture(shape, 0.0f);
            }

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

                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(-10.5f, 11.0f);

                Body ground = m_world.CreateBody(bd);
                ground.CreateFixture(shape, 0.0f);
            }

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

                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(-4.0f, 6.0f);
                bd.Angle = -0.25f;

                Body ground = m_world.CreateBody(bd);
                ground.CreateFixture(shape, 0.0f);
            }

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

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

                float[] friction = {0.75f, 0.5f, 0.35f, 0.1f, 0.0f};

                for (int i = 0; i < 5; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.BodyType = BodyType.Dynamic;
                    bd.Position = new Vec2(-15.0f + 4.0f * i, 28.0f);
                    Body body = m_world.CreateBody(bd);

                    fd.Friction = friction[i];
                    body.CreateFixture(fd);
                }
            }
        }
Esempio n. 16
0
        public Car()
        {
            {	// car body
                PolygonShape poly1 = new PolygonShape(), poly2 = new PolygonShape();

                // bottom half
                poly1.Vertices = new Vec2[]
                {
                    new Vec2(2.2f,-0.74f),
                    new Vec2(2.2f,-0.2f),
                    new Vec2(1.0f,0),
                    new Vec2(-2.2f,0),
                    new Vec2(-2.2f,-0.74f)
                };

                FixtureDef fixture1 = new FixtureDef();

                fixture1.Filter.GroupIndex = -1;
                fixture1.Shape = poly1;
                fixture1.Density		= 20.0f;
                fixture1.Friction		= 0.68f;

                // top half
                poly2.Vertices = new Vec2[]
                {
                    new Vec2(1.0f,0),
                    new Vec2(0.5f,0.74f),
                    new Vec2(-1.3f,0.7f),
                    new Vec2(-1.7f,0),
                };

                FixtureDef fixture2 = new FixtureDef();

                fixture2.Filter.GroupIndex = -1;
                fixture2.Shape = poly2;
                fixture2.Density		= 5.0f;
                fixture2.Friction		= 0.68f;

                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(0, 0);

                m_vehicle = m_world.CreateBody(bd);
                m_vehicle.CreateFixture(fixture1);
                m_vehicle.CreateFixture(fixture2);
            }

            {	// vehicle wheels
                CircleShape circ = new CircleShape();
                circ.Radius = 0.58608f;

                FixtureDef wheelFix = new FixtureDef();
                wheelFix.Shape = circ;
                wheelFix.Density = 40.0f;
                wheelFix.Friction = 0.8f;
                wheelFix.Filter.GroupIndex = -1;

                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.AllowSleep = false;
                bd.Position = new Vec2(1.2f, -0.8f);

                m_rightWheel = m_world.CreateBody(bd);
                m_rightWheel.CreateFixture(wheelFix);

                bd.Position = new Vec2(-1.2f, -0.8f);
                m_leftWheel = m_world.CreateBody(bd);
                m_leftWheel.CreateFixture(wheelFix);
            }

            {	// join wheels to chassis
                RevoluteJointDef jd = new RevoluteJointDef();
                jd.Initialize(m_vehicle, m_leftWheel, m_leftWheel.WorldCenter);
                jd.CollideConnected = false;
                jd.EnableMotor = true;
                jd.MaxMotorTorque = 10.0f;
                jd.MotorSpeed = 0.0f;
                m_leftJoint = (RevoluteJoint)m_world.CreateJoint(jd);

                jd.Initialize(m_vehicle, m_rightWheel, m_rightWheel.WorldCenter);
                jd.CollideConnected = false;
                m_rightJoint = (RevoluteJoint)m_world.CreateJoint(jd);
            }
        }
Esempio n. 17
0
        public EdgeShapes()
        {
            // Ground body
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

                    PolygonShape shape = new PolygonShape();
                    shape.SetAsEdge(new Vec2(x1, y1), new Vec2(x2, y2));
                    ground.CreateFixture(shape, 0.0f);

                    x1 = x2;
                    y1 = y2;
                }
            }

            {
                Vec2[] vertices = new Vec2[3];
                vertices[0] = new Vec2(-0.5f, 0.0f);
                vertices[1] = new Vec2(0.5f, 0.0f);
                vertices[2] = new Vec2(0.0f, 1.5f);
                m_polygons[0] = new PolygonShape();
                m_polygons[0].Vertices = vertices;
            }

            {
                Vec2[] vertices = new Vec2[3];
                vertices[0] = new Vec2(-0.1f, 0.0f);
                vertices[1] = new Vec2(0.1f, 0.0f);
                vertices[2] = new Vec2(0.0f, 1.5f);
                m_polygons[1] = new PolygonShape();
                m_polygons[1].Vertices = vertices;
            }

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

                Vec2[] vertices = new Vec2[8];
                vertices[0] = new Vec2(0.5f * s, 0.0f);
                vertices[1] = new Vec2(0.5f * w, b);
                vertices[2] = new Vec2(0.5f * w, b + s);
                vertices[3] = new Vec2(0.5f * s, w);
                vertices[4] = new Vec2(-0.5f * s, w);
                vertices[5] = new Vec2(-0.5f * w, b + s);
                vertices[6] = new Vec2(-0.5f * w, b);
                vertices[7] = new Vec2(-0.5f * s, 0.0f);

                m_polygons[2] = new PolygonShape();
                m_polygons[2].Vertices = vertices;
            }

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

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

            m_bodyIndex = 0;
            m_angle = 0.0f;
        }
Esempio n. 18
0
        public BodyTypes()
        {
            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f));

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

                ground.CreateFixture(fd);
            }

            // Define attachment
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(0.0f, 3.0f);
                m_attachment = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.5f, 2.0f);
                m_attachment.CreateFixture(shape, 2.0f);
            }

            // Define platform
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(-4.0f, 5.0f);
                m_platform = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.5f, 4.0f, new Vec2(4.0f, 0.0f), 0.5f * (float)Math.PI);

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;
                fd.Friction = 0.6f;
                fd.Density = 2.0f;
                m_platform.CreateFixture(fd);

                RevoluteJointDef rjd = new RevoluteJointDef();
                rjd.Initialize(m_attachment, m_platform, new Vec2(0.0f, 5.0f));
                rjd.MaxMotorTorque = 50.0f;
                rjd.EnableMotor = true;
                m_world.CreateJoint(rjd);

                PrismaticJointDef pjd = new PrismaticJointDef();
                pjd.Initialize(ground, m_platform, new Vec2(0.0f, 5.0f), new Vec2(1.0f, 0.0f));

                pjd.MaxMotorForce = 1000.0f;
                pjd.EnableMotor = true;
                pjd.LowerTranslation = -10.0f;
                pjd.UpperTranslation = 10.0f;
                pjd.EnableLimit = true;

                m_world.CreateJoint(pjd);

                m_speed = 3.0f;
            }

            // Create a payload
            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(0.0f, 8.0f);
                m_payload = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.75f, 0.75f);

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;
                fd.Friction = 0.6f;
                fd.Density = 2.0f;

                m_payload.CreateFixture(fd);
            }
        }
Esempio n. 19
0
        public Test()
        {
            Vec2 gravity;
            gravity = new Vec2(0.0f, -10.0f);
            bool doSleep = true;
            m_world = new World(gravity, doSleep);
            m_bomb = null;
            m_textLine = 30;
            m_mouseJoint = null;
            m_pointCount = 0;

            m_destructionListener.test = this;
            m_world.DestructionListener = m_destructionListener;
            m_world.ContactListener = this;
            m_world.DebugDraw = m_debugDraw;

            m_bombSpawning = false;

            m_stepCount = 0;

            BodyDef bodyDef = new BodyDef();
            m_groundBody = m_world.CreateBody(bodyDef);
            m_groundBody.UserData = "Ground";
        }
Esempio n. 20
0
        public Dominos()
        {
            Body b1 = m_world.CreateBody(new BodyDef());
            b1.CreateFixture(new PolygonShape(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)), 0.0f);
            b1.UserData = 1;

            {
                Body ground = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(-1.5f, 10.0f)));
                ground.CreateFixture(new PolygonShape(6.0f, 0.25f), 0.0f);
                ground.UserData = "ground";
            }

            for (int i = 0; i < 10; ++i)
            {
                Body body = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-6.0f + 1.0f * i, 11.25f), 0));
                body.CreateFixture(new FixtureDef(new PolygonShape(0.1f, 1.0f), 20.0f, 0.0f, 0.1f));
                body.UserData = "domino " + i.ToString();
            }

            {
                Body ground = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(1.0f, 6.0f)));
                ground.CreateFixture(new PolygonShape(7.0f, 0.25f, Vec2.Empty, 0.3f), 0.0f);
                ground.UserData = "ground";
            }

            Body b2;
            {
                b2 = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(-7.0f, 4.0f)));
                b2.CreateFixture(new PolygonShape(0.25f, 1.5f), 0.0f);
                b2.UserData = b2;
            }

            Body b3;
            {
                b3 = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-0.9f, 1.0f), -0.15f));
                b3.CreateFixture(new PolygonShape(6.0f, 0.125f), 10.0f);
                b3.UserData = 3;
            }

            RevoluteJointDef jd = new RevoluteJointDef();
            Vec2 anchor = new Vec2(-2.0f, 1.0f);
            jd.Initialize(b1, b3, anchor);
            jd.CollideConnected = true;
            m_world.CreateJoint(jd);

            Body b4;
            {
                b4 = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-10.0f, 15.0f)));
                b4.CreateFixture(new PolygonShape(0.25f, 0.25f), 10.0f);
                b4.UserData = 4;
            }

            anchor = new Vec2(-7.0f, 15.0f);
            jd.Initialize(b2, b4, anchor);
            m_world.CreateJoint(jd);

            Body b5;
            {
                b5 = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(6.5f, 3.0f)));

                b5.CreateFixture(new FixtureDef(new PolygonShape(1.0f, 0.1f, new Vec2(0.0f, -0.9f), 0.0f), 10.0f, 0.0f, 0.1f));
                b5.CreateFixture(new FixtureDef(new PolygonShape(0.1f, 1.0f, new Vec2(-0.9f, 0.0f), 0.0f), 10.0f, 0.0f, 0.1f));
                b5.CreateFixture(new FixtureDef(new PolygonShape(0.1f, 1.0f, new Vec2(0.9f, 0.0f), 0.0f), 10.0f, 0.0f, 0.1f));

                b5.UserData = 5;
            }

            anchor = new Vec2(6.0f, 2.0f);
            jd.Initialize(b1, b5, anchor);
            m_world.CreateJoint(jd);

            Body b6;
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(1.0f, 0.1f);

                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(6.5f, 4.1f);
                b6 = m_world.CreateBody(bd);
                b6.CreateFixture(shape, 30.0f);
                b6.UserData = 6;
            }

            anchor = new Vec2(7.5f, 4.0f);
            jd.Initialize(b5, b6, anchor);
            m_world.CreateJoint(jd);

            Body b7;
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(0.1f, 1.0f);

                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(7.4f, 1.0f);

                b7 = m_world.CreateBody(bd);
                b7.CreateFixture(shape, 10.0f);
                b7.UserData = 7;
            }

            DistanceJointDef djd = new DistanceJointDef();
            djd.BodyA = b3;
            djd.BodyB = b7;
            djd.LocalAnchorA = new Vec2(6.0f, 0.0f);
            djd.LocalAnchorB = new Vec2(0.0f, -1.0f);
            Vec2 d = djd.BodyB.GetWorldPoint(djd.LocalAnchorB) - djd.BodyA.GetWorldPoint(djd.LocalAnchorA);
            djd.Length = d.Length();
            m_world.CreateJoint(djd);

            {
                float radius = 0.2f;

                CircleShape shape = new CircleShape();
                shape.Radius = radius;

                for (int i = 0; i < 4; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.BodyType = BodyType.Dynamic;
                    bd.Position = new Vec2(5.9f + 2.0f * radius * i, 2.4f);
                    Body body = m_world.CreateBody(bd);
                    body.CreateFixture(shape, 10.0f);
                    body.UserData = "circle";
                }
            }
        }
Esempio n. 21
0
 public object Clone()
 {
     BodyDef def = new BodyDef(BodyType, Position, Angle, LinearVelocity, AngularVelocity, LinearDamping, AngularDamping, Bullet, Active, FixedRotation, AllowSleep, Awake, InertiaScale, UserData);
     return def;
 }
Esempio n. 22
0
        public Cloth()
        {
            FixtureDef boxFix = new FixtureDef(new CircleShape(ClothBodySize), 0.2f);
            BodyDef boxBod = new BodyDef(BodyType.Dynamic, Vec2.Empty);

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

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

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

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

                    body.CreateFixture(boxFix);

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

                    cloth[x, y] = body;
                }

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

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

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

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

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

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

                        djd.Initialize(leftBody, rightBody, leftBody.WorldCenter, rightBody.WorldCenter);
                        m_world.CreateJoint(djd);
                    }
                }
            }
        }
Esempio n. 23
0
        public Web()
        {
            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = m_world.CreateBody(bd);

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

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

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

                bd.Position = new Vec2(-5.0f, 5.0f);
                m_bodies[0] = m_world.CreateBody(bd);
                m_bodies[0].CreateFixture(shape, 5.0f);

                bd.Position = new Vec2(5.0f, 5.0f);
                m_bodies[1] = m_world.CreateBody(bd);
                m_bodies[1].CreateFixture(shape, 5.0f);

                bd.Position = new Vec2(5.0f, 15.0f);
                m_bodies[2] = m_world.CreateBody(bd);
                m_bodies[2].CreateFixture(shape, 5.0f);

                bd.Position = new Vec2(-5.0f, 15.0f);
                m_bodies[3] = m_world.CreateBody(bd);
                m_bodies[3].CreateFixture(shape, 5.0f);

                DistanceJointDef jd = new DistanceJointDef();
                Vec2 p1, p2, d;

                jd.FrequencyHz = 4.0f;
                jd.DampingRatio = 0.5f;

                jd.BodyA = ground;
                jd.BodyB = m_bodies[0];
                jd.LocalAnchorA = new Vec2(-10.0f, 0.0f);
                jd.LocalAnchorB = new Vec2(-0.5f, -0.5f);
                p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA);
                p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB);
                d = p2 - p1;
                jd.Length = d.Length();
                m_joints[0] = m_world.CreateJoint(jd);

                jd.BodyA = ground;
                jd.BodyB = m_bodies[1];
                jd.LocalAnchorA = new Vec2(10.0f, 0.0f);
                jd.LocalAnchorB = new Vec2(0.5f, -0.5f);
                p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA);
                p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB);
                d = p2 - p1;
                jd.Length = d.Length();
                m_joints[1] = m_world.CreateJoint(jd);

                jd.BodyA = ground;
                jd.BodyB = m_bodies[2];
                jd.LocalAnchorA = new Vec2(10.0f, 20.0f);
                jd.LocalAnchorB = new Vec2(0.5f, 0.5f);
                p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA);
                p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB);
                d = p2 - p1;
                jd.Length = d.Length();
                m_joints[2] = m_world.CreateJoint(jd);

                jd.BodyA = ground;
                jd.BodyB = m_bodies[3];
                jd.LocalAnchorA = new Vec2(-10.0f, 20.0f);
                jd.LocalAnchorB = new Vec2(-0.5f, 0.5f);
                p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA);
                p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB);
                d = p2 - p1;
                jd.Length = d.Length();
                m_joints[3] = m_world.CreateJoint(jd);

                jd.BodyA = m_bodies[0];
                jd.BodyB = m_bodies[1];
                jd.LocalAnchorA = new Vec2(0.5f, 0.0f);
                jd.LocalAnchorB = new Vec2(-0.5f, 0.0f);;
                p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA);
                p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB);
                d = p2 - p1;
                jd.Length = d.Length();
                m_joints[4] = m_world.CreateJoint(jd);

                jd.BodyA = m_bodies[1];
                jd.BodyB = m_bodies[2];
                jd.LocalAnchorA = new Vec2(0.0f, 0.5f);
                jd.LocalAnchorB = new Vec2(0.0f, -0.5f);
                p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA);
                p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB);
                d = p2 - p1;
                jd.Length = d.Length();
                m_joints[5] = m_world.CreateJoint(jd);

                jd.BodyA = m_bodies[2];
                jd.BodyB = m_bodies[3];
                jd.LocalAnchorA = new Vec2(-0.5f, 0.0f);
                jd.LocalAnchorB = new Vec2(0.5f, 0.0f);
                p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA);
                p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB);
                d = p2 - p1;
                jd.Length = d.Length();
                m_joints[6] = m_world.CreateJoint(jd);

                jd.BodyA = m_bodies[3];
                jd.BodyB = m_bodies[0];
                jd.LocalAnchorA = new Vec2(0.0f, -0.5f);
                jd.LocalAnchorB = new Vec2(0.0f, 0.5f);
                p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA);
                p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB);
                d = p2 - p1;
                jd.Length = d.Length();
                m_joints[7] = m_world.CreateJoint(jd);
            }
        }
Esempio n. 24
0
        public ApplyForce()
        {
            m_world.Gravity = new Vec2(0.0f, 0.0f);

            const float k_restitution = 0.4f;

            Body ground;
            {
                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(0.0f, 20.0f);
                ground = m_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 Vec2(-20.0f, -20.0f), new Vec2(-20.0f, 20.0f));
                ground.CreateFixture(sd);

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

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

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

            {
                Transform xf1 = new Transform();
                xf1.R = new Mat22(0.3524f * (float)Math.PI);
                xf1.Position = (xf1.R * new Vec2(1.0f, 0.0f));

                Vec2[] vertices = new Vec2[3]
                {
                    (xf1 * new Vec2(-1.0f, 0.0f)),
                    (xf1 * new Vec2(1.0f, 0.0f)),
                    (xf1 * new Vec2(0.0f, 0.5f))
                };

                PolygonShape poly1 = new PolygonShape(vertices);

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

                Transform xf2 = new Transform();
                xf2.R = new Mat22(-0.3524f * (float)Math.PI);
                xf2.Position = (xf2.R * new Vec2(-1.0f, 0.0f));

                vertices = new Vec2[]
                {
                    (xf2 * new Vec2(-1.0f, 0.0f)),
                    (xf2 * new Vec2(1.0f, 0.0f)),
                    (xf2 * new Vec2(0.0f, 0.5f))
                };

                PolygonShape poly2 = new PolygonShape(vertices);

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

                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.AngularDamping = 5.0f;
                bd.LinearDamping = 0.1f;

                bd.Position = new Vec2(0.0f, 2.0f);
                bd.Angle = (float)Math.PI;
                bd.AllowSleep = false;
                m_body = m_world.CreateBody(bd);
                m_body.CreateFixture(sd1);
                m_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.BodyType = BodyType.Dynamic;

                    bd.Position = new Vec2(0.0f, 5.0f + 1.54f * i);
                    Body body = m_world.CreateBody(bd);

                    body.CreateFixture(fd);

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

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

                    FrictionJointDef jd = new FrictionJointDef();
                    jd.LocalAnchorA = jd.LocalAnchorB = Vec2.Empty;
                    jd.BodyA = ground;
                    jd.BodyB = body;
                    jd.CollideConnected = true;
                    jd.MaxForce = mass * gravity;
                    jd.MaxTorque = mass * radius * gravity;

                    m_world.CreateJoint(jd);
                }
            }
        }
Esempio n. 25
0
        public void DrawJoint(Box2CS.Serialize.JointDefSerialized x, Vec2 p1, Vec2 p2, BodyDef bodyA, BodyDef bodyB)
        {
            Transform xf1 = new Transform(bodyA.Position, new Mat22(bodyA.Angle));
            Transform xf2 = new Transform(bodyB.Position, new Mat22(bodyB.Angle));
            Vec2 x1 = xf1.Position;
            Vec2 x2 = xf2.Position;

            p1 = xf1 * p1;
            p2 = xf2 * p2;

            ColorF color = new ColorF(0.5f, 0.8f, 0.8f);

            switch (x.Joint.JointType)
            {
            case JointType.Distance:
                DrawSegment(p1, p2, color);
                break;

            case JointType.Pulley:
                {
                    PulleyJointDef pulley = (PulleyJointDef)x.Joint;
                    Vec2 s1 = pulley.GroundAnchorA;
                    Vec2 s2 = pulley.GroundAnchorB;
                    DrawSegment(s1, p1, color);
                    DrawSegment(s2, p2, color);
                    DrawSegment(s1, s2, color);
                }
                break;

            case JointType.Revolute:
                {
                    RevoluteJointDef rjd = (RevoluteJointDef)x.Joint;

                    if (rjd.EnableLimit)
                    {
                        Vec2 startPos = p1;
                        Vec2 sinCos = new Vec2(-(float)Math.Cos((rjd.UpperAngle + rjd.ReferenceAngle) - (float)Math.PI / 2), -(float)Math.Sin((rjd.UpperAngle + rjd.ReferenceAngle) - (float)Math.PI / 2));

                        var end = startPos + (sinCos * 3);
                        DrawSegment(startPos, end, new ColorF(0, 0.65f, 0.65f));

                        sinCos = new Vec2(-(float)Math.Cos((rjd.LowerAngle + rjd.ReferenceAngle) - (float)Math.PI / 2), -(float)Math.Sin((rjd.LowerAngle + rjd.ReferenceAngle) - (float)Math.PI / 2));

                        end = startPos + (sinCos * 3);
                        DrawSegment(startPos, end, new ColorF(0, 0.65f, 0.65f));
                        DrawArc(startPos, 3, (-rjd.LowerAngle - rjd.ReferenceAngle), (-rjd.UpperAngle - rjd.ReferenceAngle));
                    }

                    DrawCircle(p1, 0.75f, new ColorF(0, 0.65f, 0.65f));

                    DrawSegment(x1, p1, color);
                    DrawSegment(p1, p2, color);
                    DrawSegment(x2, p2, color);
                }
                break;

            default:
            case JointType.Unknown:
                DrawSegment(x1, p1, color);
                DrawSegment(p1, p2, color);
                DrawSegment(x2, p2, color);
                break;
            }
        }
Esempio n. 26
0
        public CharacterCollision()
        {
            // Ground body
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

            // Collinear edges
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vec2(-8.0f, 1.0f), new Vec2(-6.0f, 1.0f));
                ground.CreateFixture(shape, 0.0f);
                shape.SetAsEdge(new Vec2(-6.0f, 1.0f), new Vec2(-4.0f, 1.0f));
                ground.CreateFixture(shape, 0.0f);
                shape.SetAsEdge(new Vec2(-4.0f, 1.0f), new Vec2(-2.0f, 1.0f));
                ground.CreateFixture(shape, 0.0f);
            }

            // Square tiles
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

            // Square made from edges notice how the edges are shrunk to account
            // for the polygon radius. This makes it so the square character does
            // not get snagged. However, ray casts can now go through the cracks.
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();
                float d = 2.0f * Box2DSettings.b2_polygonRadius;
                shape.SetAsEdge(new Vec2(-1.0f + d, 3.0f), new Vec2(1.0f - d, 3.0f));
                ground.CreateFixture(shape, 0.0f);
                shape.SetAsEdge(new Vec2(1.0f, 3.0f + d), new Vec2(1.0f, 5.0f - d));
                ground.CreateFixture(shape, 0.0f);
                shape.SetAsEdge(new Vec2(1.0f - d, 5.0f), new Vec2(-1.0f + d, 5.0f));
                ground.CreateFixture(shape, 0.0f);
                shape.SetAsEdge(new Vec2(-1.0f, 5.0f - d), new Vec2(-1.0f, 3.0f + d));
                ground.CreateFixture(shape, 0.0f);
            }

            // Square character
            {
                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(-3.0f, 5.0f);
                bd.BodyType = BodyType.Dynamic;
                bd.FixedRotation = true;
                bd.AllowSleep = false;

                Body body = m_world.CreateBody(bd);

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

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

            // Hexagon character
            {
                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(-5.0f, 5.0f);
                bd.BodyType = BodyType.Dynamic;
                bd.FixedRotation = true;
                bd.AllowSleep = false;

                Body body = m_world.CreateBody(bd);

                float angle = 0.0f;
                float delta = (float)Math.PI / 3.0f;

                Vec2[] vertices = new Vec2[6];
                for (int i = 0; i < 6; ++i)
                {
                    vertices[i] = new Vec2(0.5f * (float)Math.Cos(angle), 0.5f * (float)Math.Sin(angle));
                    angle += delta;
                }

                PolygonShape shape = new PolygonShape();
                shape.Vertices = vertices;

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

            // Circle character
            {
                BodyDef bd = new BodyDef();
                bd.Position = new Vec2(3.0f, 5.0f);
                bd.BodyType = BodyType.Dynamic;
                bd.FixedRotation = true;
                bd.AllowSleep = false;

                Body body = m_world.CreateBody(bd);

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

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;
                fd.Density = 20.0f;
                body.CreateFixture(fd);
            }
        }
Esempio n. 27
0
        void Create(int index)
        {
            if (m_bodies[m_bodyIndex] != null)
            {
                m_world.DestroyBody(m_bodies[m_bodyIndex]);
                m_bodies[m_bodyIndex] = null;
            }

            BodyDef bd = new BodyDef();

            float x = Rand.RandomFloat(-10.0f, 10.0f);
            float y = Rand.RandomFloat(0.0f, 20.0f);
            bd.Position = new Vec2(x, y);
            bd.Angle = Rand.RandomFloat((float)-Math.PI, (float)Math.PI);

            bd.UserData = index;

            if (index == 4)
                bd.AngularDamping = 0.02f;

            m_bodies[m_bodyIndex] = m_world.CreateBody(bd);

            if (index < 4)
            {
                FixtureDef fd = new FixtureDef();
                fd.Shape = m_polygons[index];
                fd.Friction = 0.3f;
                m_bodies[m_bodyIndex].CreateFixture(fd);
            }
            else
            {
                FixtureDef fd = new FixtureDef();
                fd.Shape = m_circle;
                fd.Friction = 0.3f;

                m_bodies[m_bodyIndex].CreateFixture(fd);
            }

            m_bodyIndex = (m_bodyIndex + 1) % e_maxBodies;
        }
Esempio n. 28
0
        public CollisionFiltering()
        {
            // Ground body
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));

                FixtureDef sd = new FixtureDef();
                sd.Shape = shape;
                sd.Friction = 0.3f;

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

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

            PolygonShape polygon = new PolygonShape(vertices);

            FixtureDef triangleShapeDef = new FixtureDef();
            triangleShapeDef.Shape = polygon;
            triangleShapeDef.Density = 1.0f;

            triangleShapeDef.Filter = new FilterData(k_triangleCategory, k_triangleMask, k_smallGroup);

            BodyDef triangleBodyDef = new BodyDef();
            triangleBodyDef.BodyType = BodyType.Dynamic;
            triangleBodyDef.Position = new Vec2(-5.0f, 2.0f);

            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.Vertices = vertices;
            triangleShapeDef.Filter = new FilterData(triangleShapeDef.Filter.CategoryBits, triangleShapeDef.Filter.MaskBits, k_largeGroup);
            triangleBodyDef.Position = new Vec2(-5.0f, 6.0f);
            triangleBodyDef.FixedRotation = true; // look at me!

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

            {
                BodyDef bd = new BodyDef();
                bd.BodyType = BodyType.Dynamic;
                bd.Position = new Vec2(-5.0f, 10.0f);
                Body body = m_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 Vec2(0.0f, 4.0f);
                jd.LocalAnchorB = Vec2.Empty;
                jd.LocalAxis = new Vec2(0.0f, 1.0f);
                jd.LowerTranslation = -1.0f;
                jd.UpperTranslation = 1.0f;

                m_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 = new FilterData(k_boxCategory, k_boxMask, k_smallGroup);

            BodyDef boxBodyDef = new BodyDef();
            boxBodyDef.BodyType = BodyType.Dynamic;
            boxBodyDef.Position = new Vec2(0.0f, 2.0f);

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

            // Large box (recycle definitions)
            polygon.SetAsBox(2.0f, 1.0f);
            boxShapeDef.Filter = new FilterData(k_boxCategory, k_boxMask, k_largeGroup);
            boxBodyDef.Position = new Vec2(0.0f, 6.0f);

            Body body4 = m_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 = new FilterData(k_circleCategory, k_circleMask, k_smallGroup);

            BodyDef circleBodyDef = new BodyDef();
            circleBodyDef.BodyType = BodyType.Dynamic;
            circleBodyDef.Position = new Vec2(5.0f, 2.0f);

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

            // Large circle
            circle.Radius *= 2.0f;
            circleShapeDef.Filter = new FilterData(k_circleCategory, k_circleMask, k_largeGroup);
            circleBodyDef.Position = new Vec2(5.0f, 6.0f);

            Body body6 = m_world.CreateBody(circleBodyDef);
            body6.CreateFixture(circleShapeDef);
        }
Esempio n. 29
0
        public RayCast()
        {
            // Ground body
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.CreateBody(bd);

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

            {
                Vec2[] vertices = new Vec2[3];
                vertices[0] = new Vec2(-0.5f, 0.0f);
                vertices[1] = new Vec2(0.5f, 0.0f);
                vertices[2] = new Vec2(0.0f, 1.5f);
                m_polygons[0] = new PolygonShape();
                m_polygons[0].Vertices = vertices;
            }

            {
                Vec2[] vertices = new Vec2[3];
                vertices[0] = new Vec2(-0.1f, 0.0f);
                vertices[1] = new Vec2(0.1f, 0.0f);
                vertices[2] = new Vec2(0.0f, 1.5f);
                m_polygons[1] = new PolygonShape();
                m_polygons[1].Vertices = vertices;
            }

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

                Vec2[] vertices = new Vec2[8];
                vertices[0] = new Vec2(0.5f * s, 0.0f);
                vertices[1] = new Vec2(0.5f * w, b);
                vertices[2] = new Vec2(0.5f * w, b + s);
                vertices[3] = new Vec2(0.5f * s, w);
                vertices[4] = new Vec2(-0.5f * s, w);
                vertices[5] = new Vec2(-0.5f * w, b + s);
                vertices[6] = new Vec2(-0.5f * w, b);
                vertices[7] = new Vec2(-0.5f * s, 0.0f);

                m_polygons[2] = new PolygonShape();
                m_polygons[2].Vertices = vertices;
            }

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

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

            m_bodyIndex = 0;
            m_angle = 0.0f;

            m_mode = Mode.e_closest;
        }
Esempio n. 30
0
        public Pyramid()
        {
            {
                BodyDef bd = new BodyDef();
                {
                    Body ground = m_world.CreateBody(bd);

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

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

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

                    BodyDef bd = new BodyDef();
                    {
                        for (int i = 0; i < e_count; ++i)
                        {
                            y = x;

                            for (int j = i; j < e_count; ++j)
                            {
                                bd.BodyType = BodyType.Dynamic;
                                bd.Position = y;

                                Body body = m_world.CreateBody(bd);
                                body.CreateFixture(shape, 5.0f);
                                body.UserData = totalCount;
                                totalCount++;
                                m_bodies.Add(body);

                                y += deltaY;
                            }
                            x += deltaX;
                        }

                        m_touching = new bool[totalCount];
                    }
                }
            }

            {
                Body movableBody = m_world.CreateBody(new BodyDef());
                movableBody.Position = new Vec2(999, 999);
                CircleShape shape = new CircleShape();
                shape.Radius = 7.0f;
                shape.Position = new Vec2(0, 0);

                FixtureDef fd = new FixtureDef();
                fd.Shape = shape;
                fd.IsSensor = true;
                m_sensor = movableBody.CreateFixture(fd);
            }
        }