コード例 #1
0
ファイル: SphereStack.cs プロジェクト: RubisetCie/box2c
        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);
                }
            }
        }
コード例 #2
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);
                }
            }
        }
コード例 #3
0
        VaryingRestitution()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = _world.CreateBody(bd);

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

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

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

                float[] restitution = new float[7] {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.type = BodyType.Dynamic;
                    bd.position = new Vector2(-10.0f + 3.0f * i, 20.0f);

                    Body body = _world.CreateBody(bd);

                    fd.restitution = restitution[i];
                    body.CreateFixture(fd);
                }
            }
        }
コード例 #4
0
ファイル: SphereStack.cs プロジェクト: GretelF/squircle
        public SphereStack()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = _world.CreateBody(bd);

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

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

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

                    _bodies[i] = _world.CreateBody(bd);

                    _bodies[i].CreateFixture(shape, 1.0f);

                    //_bodies[i].SetLinearVelocity(new Vector2(0.0f, -100.0f));
                }
            }
        }
コード例 #5
0
ファイル: ShapeEditing.cs プロジェクト: RubisetCie/box2c
        public override void Keyboard(SFML.Window.KeyCode key)
        {
            switch (char.ToLower((char)key))
            {
            case 'c':
                if (m_fixture2 == null)
                {
                    CircleShape shape = new CircleShape();
                    shape.Radius = 3.0f;
                    shape.Position = new Vec2(0.5f, -4.0f);
                    m_fixture2 = m_body.CreateFixture(shape, 10.0f);
                    m_body.IsAwake = true;
                }
                break;

            case 'd':
                if (m_fixture2 != null)
                {
                    m_body.DestroyFixture(m_fixture2.Value);
                    m_fixture2 = null;
                    m_body.IsAwake = true;
                }
                break;
            }
        }
コード例 #6
0
 public void Clone()
 {
     CircleShape circle = new CircleShape(1.23f);
       CircleShape clone = circle.Clone() as CircleShape;
       Assert.IsNotNull(clone);
       Assert.AreEqual(circle.Radius, clone.Radius);
       Assert.AreEqual(circle.GetAabb(Pose.Identity).Minimum, clone.GetAabb(Pose.Identity).Minimum);
       Assert.AreEqual(circle.GetAabb(Pose.Identity).Maximum, clone.GetAabb(Pose.Identity).Maximum);
 }
コード例 #7
0
ファイル: Globals.cs プロジェクト: pixeltasim/Conform
        public static void CollideCircles(out Manifold manifold, CircleShape circle1, Transform xf1, CircleShape circle2, Transform xf2)
        {
            var circle1Lock = circle1.Lock();
            var circle2Lock = circle2.Lock();

            NativeMethods.cb2_collidecircles(out manifold, circle1Lock, xf1, circle2Lock, xf2);

            circle1.Unlock();
            circle2.Unlock();
        }
コード例 #8
0
ファイル: Globals.cs プロジェクト: pixeltasim/Conform
        public static void CollidePolygonAndCircle(out Manifold manifold, PolygonShape polygon, Transform xf1, CircleShape circle, Transform xf2)
        {
            var polyLock = polygon.Lock();
            var circleLock = circle.Lock();

            NativeMethods.cb2_collidepolygonandcircle(out manifold, polyLock, xf1, circleLock, xf2);

            polygon.Unlock();
            circle.Unlock();
        }
コード例 #9
0
        public void GetMesh()
        {
            var s = new CircleShape(3);
              var mesh = s.GetMesh(0.05f, 3);
              Assert.Greater(mesh.NumberOfTriangles, 1);

              foreach(var vertex in mesh.Vertices)
              {
            Assert.AreEqual(0, vertex.Z);
              }
        }
コード例 #10
0
ファイル: Revolute.cs プロジェクト: RubisetCie/box2c
        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);
            }
        }
コード例 #11
0
ファイル: SensorTest.cs プロジェクト: GretelF/squircle
        public SensorTest()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = _world.CreateBody(bd);

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

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

                    FixtureDef fd = new FixtureDef();
                    fd.shape = shape;
                    fd.isSensor = true;
                    _sensor = ground.CreateFixture(fd);
                }
            #endif
            }

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

                for (int i = 0; i < e_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] = _world.CreateBody(bd);

                    _bodies[i].CreateFixture(shape, 1.0f);
                }
            }
        }
コード例 #12
0
ファイル: ContinuousTest.cs プロジェクト: n1ckd0r/Box2D.XNA
        public ContinuousTest()
        {
        {
			BodyDef bd = new BodyDef();
			bd.position = new Vector2(0.0f, 0.0f);
			Body body = _world.CreateBody(bd);

			PolygonShape shape = new PolygonShape();

			shape.SetAsEdge(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f));
			body.CreateFixture(shape, 1.0f);

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

#if true
		{
			BodyDef bd = new BodyDef();
			bd.type = BodyType.Dynamic;
			bd.position = new Vector2(0.0f, 20.0f);
			//bd.angle = 0.1f;

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

			_body = _world.CreateBody(bd);
			_body.CreateFixture(shape, 1.0f);

            Launch();
		}
#else
		{
			BodyDef bd = new BodyDef();
			bd.type = BodyType.Dynamic;
			bd.position = new Vector2(0.0f, 0.5f);
			Body body = _world.CreateBody(bd);

			CircleShape shape = new CircleShape();
			shape._p = new Vector2Zero();
			shape._radius = 0.5f;
			body.CreateFixture(shape, 1.0f);

			//bd.bullet = true;
			bd.position = new Vector2(0.0f, 10.0f);
			body = _world.CreateBody(bd);
			body.CreateFixture(shape, 1.0f);
			body.SetLinearVelocity(new Vector2(0.0f, -100.0f));
		}
#endif
        }
コード例 #13
0
ファイル: Confined.cs プロジェクト: GretelF/squircle
        public Confined()
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = _world.CreateBody(bd);

                PolygonShape shape = new PolygonShape();

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

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

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

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

            float radius = 0.5f;
            CircleShape shape2 = new CircleShape();
            shape2._p = Vector2.Zero;
            shape2._radius = radius;

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

            for (int j = 0; j < e_columnCount; ++j)
            {
                for (int i = 0; i < e_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 = _world.CreateBody(bd);

                    body.CreateFixture(fd);
                }
            }

            _world.Gravity = new Vector2(0.0f, 0.0f);
        }
コード例 #14
0
ファイル: ShapeEditing.cs プロジェクト: n1ckd0r/Box2D.XNA
	    public override void Keyboard(KeyboardState state, KeyboardState oldState)
	    {
		    if (state.IsKeyDown(Keys.C) && oldState.IsKeyUp(Keys.C) && _fixture2 == null)
		    {
                CircleShape shape = new CircleShape();
			    shape._radius = 3.0f;
			    shape._p = new Vector2(0.5f, -4.0f);
			    _fixture2 = _body.CreateFixture(shape, 10.0f);
			    _body.SetAwake(true);
		    }

		    if (state.IsKeyDown(Keys.D) && oldState.IsKeyUp(Keys.D) && _fixture2 != null)
		    {
			    _body.DestroyFixture(_fixture2);
			    _fixture2 = null;
			    _body.SetAwake(true);
		    }
	    }
コード例 #15
0
ファイル: SensorTest.cs プロジェクト: RubisetCie/box2c
        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);
                }
            }
        }
コード例 #16
0
ファイル: OneSidedPlatform.cs プロジェクト: GretelF/squircle
        public OneSidedPlatform()
        {
            // Ground
            {
                BodyDef bd = new BodyDef();
                Body ground = _world.CreateBody(bd);

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

            // Platform
            {
                BodyDef bd = new BodyDef();
                bd.position = new Vector2(0.0f, 10.0f);
                Body body = _world.CreateBody(bd);

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

                _bottom = 10.0f - 0.5f;
                _top = 10.0f + 0.5f;
            }

            // Actor
            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.Dynamic;
                bd.position = new Vector2(0.0f, 12.0f);
                Body body = _world.CreateBody(bd);

                _radius = 0.5f;
                CircleShape shape = new CircleShape();
                shape._radius = _radius;
                _character = body.CreateFixture(shape, 20.0f);

                body.SetLinearVelocity(new Vector2(0.0f, -50.0f));

                _state = State.e_unknown;
            }
        }
コード例 #17
0
ファイル: Revolute.cs プロジェクト: GretelF/squircle
        public Revolute()
        {
            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = _world.CreateBody(bd);

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

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

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

                RevoluteJointDef rjd = new RevoluteJointDef();

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

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

                rjd.Initialize(ground, body, new Vector2(0.0f, 12.0f));
                rjd.motorSpeed = 1.0f * (float)Settings.b2_pi;
                rjd.maxMotorTorque = 10000.0f;
                rjd.enableMotor = false;
                rjd.lowerAngle = -0.25f * (float)Settings.b2_pi;
                rjd.upperAngle = 0.5f * (float)Settings.b2_pi;
                rjd.enableLimit = true;
                rjd.collideConnected = true;

                _joint = (RevoluteJoint)_world.CreateJoint(rjd);
            }
        }
コード例 #18
0
ファイル: Confined.cs プロジェクト: RubisetCie/box2c
        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);
        }
コード例 #19
0
ファイル: OneSidedPlatform.cs プロジェクト: RubisetCie/box2c
        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);
            }
        }
コード例 #20
0
        public void DrawNodeDisplay()
        {
            _nodeWindow.Draw(new Text("Node tree", _font, 35)
            {
                Position  = new Vector2f(90, 30),
                FillColor = new Color(190, 190, 190)
            });

            _nodeWindow.Draw(new Text(_data.Agent.Name, _font, 15)
            {
                Position  = new Vector2f(260, 53),
                FillColor = new Color(200, 200, 200)
            });

            bool finished = false;
            int  level    = 0;

            int parentXPos = 0;
            int childXPos  = 0;

            Queue <Node <TileType> > levelNodeQueue     = new Queue <Node <TileType> >();
            Queue <Node <TileType> > nextLevelNodeQueue = new Queue <Node <TileType> >();

            levelNodeQueue.Enqueue(_data.Agent.AgentData.RootNode);

            _nodeWindow.Draw(new CircleShape()
            {
                Position = new Vector2f(
                    105,
                    80),
                Radius    = 5,
                FillColor = new Color(221, 108, 102)
            });

            _nodeWindow.Draw(new Text("(" + _data.Agent.AgentData.RootNode.Pos.X + ", "
                                      + _data.Agent.AgentData.RootNode.Pos.Y + ")", _font, 10)
            {
                Position = new Vector2f(
                    105 + 15,
                    80),
                FillColor = new Color(220, 220, 220)
            });


            while (!finished)
            {
                parentXPos = 0;
                childXPos  = 0;



                while (levelNodeQueue.Count > 0)
                {
                    Node <TileType> currentParentNode = levelNodeQueue.Dequeue();

                    foreach (Node <TileType> child in currentParentNode.Children)
                    {
                        nextLevelNodeQueue.Enqueue(child);



                        // child is child node
                        // current parent node is current parent node, xpos increases with eveyr child, however, we'll need to know the position of the parent node...
                        // draw the line between aprent and child

                        Vertex[] line = new Vertex[] { };

                        if (child.IsOnPath)
                        {
                            if (currentParentNode.IsOnPath)
                            {
                                line = new Vertex[]
                                {
                                    new Vertex(new Vector2f(105 + 5 + 80 * parentXPos, 110 + 5 + 30 * (level - 1)), new Color(250, 250, 220)),
                                    new Vertex(new Vector2f(105 + 5 + 80 * childXPos, 110 + 5 + 30 * level), new Color(250, 250, 220))
                                };
                            }
                        }
                        else
                        {
                            line = new Vertex[]
                            {
                                new Vertex(new Vector2f(105 + 5 + 80 * parentXPos, 110 + 5 + 30 * (level - 1)), new Color(150, 150, 150)),
                                new Vertex(new Vector2f(105 + 5 + 80 * childXPos, 110 + 5 + 30 * level), new Color(150, 150, 150))
                            };
                        }



                        _nodeWindow.Draw(line, PrimitiveType.Lines);

                        _nodeWindow.Draw(new Text("(" + child.Pos.X + ", " + child.Pos.Y + ")", _font, 10)
                        {
                            Position = new Vector2f(
                                105 + 15 + 80 * childXPos,
                                110 + 30 * level),
                            FillColor = new Color(220, 220, 220)
                        });

                        if (child.Cost != 0)
                        {
                            _nodeWindow.Draw(new Text("c: " + child.Cost, _font, 10)
                            {
                                Position = new Vector2f(
                                    105 + 50 + 80 * childXPos,
                                    110 + 30 * level),
                                FillColor = new Color(220, 220, 220)
                            });
                        }


                        CircleShape nodeCircle = new CircleShape()
                        {
                            Position = new Vector2f(
                                105 + 80 * childXPos,
                                110 + 30 * level),
                            Radius    = 5,
                            FillColor = HashedPosColor(child.Pos.X, child.Pos.Y, 100)
                        };

                        if (_data.Agent.AgentData.PosToSearch.Count > 0)
                        {
                            if (child.Pos == _data.Agent.AgentData.PosToSearch[0])
                            {
                                nodeCircle.FillColor = new Color(255, 201, 14);
                            }
                        }


                        if (child.Data == TileType.Goal)
                        {
                            nodeCircle.FillColor = new Color(111, 221, 102);
                        }



                        _nodeWindow.Draw(nodeCircle);



                        childXPos++;
                    }

                    parentXPos++;
                }

                // We've just looped through all the stuff in this level, all the children are in the next level
                // move each next level node to the level one and move on

                levelNodeQueue.Clear();
                while (nextLevelNodeQueue.Count > 0)
                {
                    levelNodeQueue.Enqueue(nextLevelNodeQueue.Dequeue());
                }

                nextLevelNodeQueue.Clear();

                if (levelNodeQueue.Count == 0)
                {
                    finished = true;
                }

                level++;

                _nodeWindow.Draw(new Text("INTERNAL", _font, 10)
                {
                    Position = new Vector2f(
                        5,
                        50),
                    FillColor = new Color(220, 220, 220)
                });

                int yPos = 0;

                for (int i = _data.Agent.AgentData.InternalHeap.Count - 1; i >= 0; i--)
                {
                    Node <TileType> node       = _data.Agent.AgentData.InternalHeap[i];
                    CircleShape     nodeCircle = new CircleShape()
                    {
                        Position = new Vector2f(
                            10,
                            90 + 30 * yPos),
                        Radius    = 5,
                        FillColor = HashedPosColor(node.Pos.X, node.Pos.Y, 100)
                    };


                    _nodeWindow.Draw(nodeCircle);
                    if (node.Cost != 0)
                    {
                        _nodeWindow.Draw(new Text(node.Cost.ToString(), _font, 10)
                        {
                            Position = new Vector2f(
                                12,
                                90 + 30 * yPos),
                            FillColor = new Color(220, 220, 220)
                        });
                    }


                    _nodeWindow.Draw(new Text("(" + node.Pos.X + ", " + node.Pos.Y + ")", _font, 10)
                    {
                        Position = new Vector2f(
                            25,
                            90 + 30 * yPos),
                        FillColor = new Color(220, 220, 220)
                    });
                    yPos++;
                }
            }
        }
コード例 #21
0
        static bool collideEdgeAndCircle(EdgeShape edge, ref FSTransform edgeTransform, CircleShape circle, ref FSTransform circleTransform, out FSCollisionResult result)
        {
            result = new FSCollisionResult();
            Collision.collideEdgeAndCircle(ref _manifold, edge, ref edgeTransform, circle, ref circleTransform);
            if (_manifold.pointCount > 0)
            {
                // code adapted from PositionSolverManifold.Initialize
                if (_manifold.type == ManifoldType.Circles)
                {
                    // this is essentically directly from ContactSolver.WorldManifold.Initialize. To avoid doing the extra math twice we duplicate this code
                    // here because it doesnt return some values we need to calculate separation
                    var pointA = MathUtils.mul(ref edgeTransform, _manifold.localPoint);
                    var pointB = MathUtils.mul(ref circleTransform, _manifold.points[0].localPoint);

                    result.normal = pointA - pointB;
                    Vector2Ext.normalize(ref result.normal);

                    var cA = pointA - edge.radius * result.normal;
                    var cB = pointB + circle.radius * result.normal;
                    result.point  = 0.5f * (cA + cB);
                    result.point *= FSConvert.simToDisplay;

                    var separation = Vector2.Dot(pointA - pointB, result.normal) - edge.radius - circle.radius;

                    // Ensure normal points from A to B
                    Vector2.Negate(ref result.normal, out result.normal);
                    result.minimumTranslationVector = result.normal * Math.Abs(separation);
                }
                else                 // FaceA
                {
                    result.normal = MathUtils.mul(edgeTransform.q, _manifold.localNormal);
                    var planePoint = MathUtils.mul(ref edgeTransform, _manifold.localPoint);

                    var clipPoint  = MathUtils.mul(ref circleTransform, _manifold.points[0].localPoint);
                    var separation = Vector2.Dot(clipPoint - planePoint, result.normal) - edge.radius - circle.radius;
                    result.point = (clipPoint - result.normal * circle.radius) * FSConvert.simToDisplay;

                    result.minimumTranslationVector = result.normal * -separation;
                }

                                #if DEBUG_FSCOLLISIONS
                Debug.drawPixel(result.point, 5, Color.Red, 0.2f);
                Debug.drawLine(result.point, result.point + result.normal * 20, Color.Yellow, 0.2f);
                                #endif

                return(true);
            }

            return(false);
        }
コード例 #22
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="game"></param>
        public void Load(String filename, Game game)
        {
            fileName = filename;
            XmlTextReader reader = new XmlTextReader(filename);

            reader.ReadToFollowing("Data");
            restitution = float.Parse(reader.GetAttribute("Restitution"));
            density     = float.Parse(reader.GetAttribute("Density"));
            friction    = float.Parse(reader.GetAttribute("Friction"));
            String fr = reader.GetAttribute("fixedRotation");

            if (fr != null)
            {
                fixedRotation = bool.Parse(fr);
            }
            //Load images
            images = new List <Texture2D>();
            reader.ReadToFollowing("Image");
            int x;
            int y;

            do
            {
                x = int.Parse(reader.GetAttribute("width"));
                y = int.Parse(reader.GetAttribute("height"));
                String fileToLoad = reader.ReadElementContentAsString();
                images.Add(game.Content.Load <Texture2D>(fileToLoad));
            }while (reader.ReadToNextSibling("Image"));
            size = new Vector2(x, y);

            //Load animations
            animations = new Dictionary <string, List <short> >();
            reader.ReadToFollowing("State");
            do
            {
                String   name = reader.GetAttribute("name");
                String[] strs = reader.ReadElementContentAsString().Split(',');

                animations.Add(name, new List <short>());
                List <short> tempList;
                animations.TryGetValue(name, out tempList);
                foreach (String s in strs)
                {
                    tempList.Add(short.Parse(s));
                }
            } while (reader.ReadToNextSibling("State"));

            reader.ReadToFollowing("Shape");
            do
            {
                string shapeType = reader.GetAttribute("ShapeType");
                string type      = reader.GetAttribute("type");
                switch (type)
                {
                case "Static":
                {
                    bodyType = BodyType.Static;
                    break;
                }

                case "Dynamic":
                {
                    bodyType = BodyType.Dynamic;
                    break;
                }

                case "Kinematic":
                {
                    bodyType = BodyType.Kinematic;
                    break;
                }
                }
                switch (shapeType)
                {
                case "Circle":
                {
                    float rad = reader.ReadElementContentAsFloat();
                    shape         = new CircleShape();
                    shape._radius = rad;
                    break;
                }

                case "Polygon":
                {
                    PolygonShape   pShape = new PolygonShape();
                    List <Vector2> verts  = new List <Vector2>();
                    float          multiX = x / scale;
                    float          multiY = y / scale;
                    reader.ReadToFollowing("Vertex");
                    do
                    {
                        String   str  = reader.ReadElementContentAsString();
                        String[] strs = str.Split(',');
                        Vector2  vert = new Vector2(float.Parse(strs[0]) * multiX, float.Parse(strs[1]) * multiY);
                        verts.Add(vert);
                    } while (reader.ReadToNextSibling("Vertex"));
                    pShape.Set(verts.ToArray(), verts.Count);
                    shape = pShape;
                    break;
                }
                }
                shapes.Add(shape);
                if (shapes.Count > 1)
                {
                    Console.Write(" ");
                }
            }while(reader.ReadToNextSibling("Shape"));
        }
コード例 #23
0
        public CharacterCollision()
        {
            // Ground body
            {
                var bd     = new BodyDef();
                var ground = World.CreateBody(bd);

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

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

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

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

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

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

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

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

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

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

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

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

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

                var body = World.CreateBody(bd);

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

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

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

                var body = World.CreateBody(bd);

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

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

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

                var body = World.CreateBody(bd);

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

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

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

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

                var body = World.CreateBody(bd);

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

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

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

                _character = World.CreateBody(bd);

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

                var fd = new FixtureDef
                {
                    Shape    = shape,
                    Density  = 20.0f,
                    Friction = 1.0f
                };
                _character.CreateFixture(fd);
            }
        }
コード例 #24
0
ファイル: Fixture.cs プロジェクト: terrynoya/Box2DNet
        public void Create(BroadPhase broadPhase, Body body, XForm xf, FixtureDef def)
        {
            UserData    = def.UserData;
            Friction    = def.Friction;
            Restitution = def.Restitution;
            Density     = def.Density;

            _body = body;
            _next = null;

            Filter = def.Filter;

            _isSensor = def.IsSensor;

            _type = def.Type;

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

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

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

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

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

            _shape.ComputeAABB(out aabb, xf);

            bool inRange = broadPhase.InRange(aabb);

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

            _proxyId = inRange ? broadPhase.CreateProxy(aabb, this) : PairManager.NullProxy;
        }
コード例 #25
0
        /// <summary>
        /// Activate the explosion at the specified position.
        /// </summary>
        /// <param name="pos">The position where the explosion happens </param>
        /// <param name="radius">The explosion radius </param>
        /// <param name="maxForce">The explosion force at the explosion point (then is inversely proportional to the square of the distance)</param>
        /// <returns>A list of bodies and the amount of force that was applied to them.</returns>
        public Dictionary <Fixture, Vector2> Activate(Vector2 pos, float radius, float maxForce)
        {
            AABB aabb;

            aabb.LowerBound = pos + new Vector2(-radius, -radius);
            aabb.UpperBound = pos + new Vector2(radius, radius);
            Fixture[] shapes = new Fixture[MaxShapes];

            // More than 5 shapes in an explosion could be possible, but still strange.
            Fixture[] containedShapes = new Fixture[5];
            bool      exit            = false;

            int shapeCount          = 0;
            int containedShapeCount = 0;

            // Query the world for overlapping shapes.
            World.QueryAABB(
                fixture => {
                if (fixture.TestPoint(ref pos))
                {
                    if (IgnoreWhenInsideShape)
                    {
                        exit = true;
                        return(false);
                    }

                    containedShapes[containedShapeCount++] = fixture;
                }
                else
                {
                    shapes[shapeCount++] = fixture;
                }

                // Continue the query.
                return(true);
            }, ref aabb);

            if (exit)
            {
                return(new Dictionary <Fixture, Vector2>());
            }

            Dictionary <Fixture, Vector2> exploded = new Dictionary <Fixture, Vector2>(shapeCount + containedShapeCount);

            // Per shape max/min angles for now.
            float[] vals     = new float[shapeCount * 2];
            int     valIndex = 0;

            for (int i = 0; i < shapeCount; ++i)
            {
                PolygonShape ps;
                CircleShape  cs = shapes[i].Shape as CircleShape;
                if (cs != null)
                {
                    // We create a "diamond" approximation of the circle
                    Vertices v   = new Vertices();
                    Vector2  vec = Vector2.Zero + new Vector2(cs.Radius, 0);
                    v.Add(vec);
                    vec = Vector2.Zero + new Vector2(0, cs.Radius);
                    v.Add(vec);
                    vec = Vector2.Zero + new Vector2(-cs.Radius, cs.Radius);
                    v.Add(vec);
                    vec = Vector2.Zero + new Vector2(0, -cs.Radius);
                    v.Add(vec);
                    ps = new PolygonShape(v, 0);
                }
                else
                {
                    ps = shapes[i].Shape as PolygonShape;
                }

                if ((shapes[i].Body.BodyType == BodyType.Dynamic) && ps != null)
                {
                    Vector2 toCentroid      = shapes[i].Body.GetWorldPoint(ps.MassData.Centroid) - pos;
                    float   angleToCentroid = (float)Math.Atan2(toCentroid.Y, toCentroid.X);
                    float   min             = float.MaxValue;
                    float   max             = float.MinValue;
                    float   minAbsolute     = 0.0f;
                    float   maxAbsolute     = 0.0f;

                    for (int j = 0; j < ps.Vertices.Count; ++j)
                    {
                        Vector2 toVertex = (shapes[i].Body.GetWorldPoint(ps.Vertices[j]) - pos);
                        float   newAngle = (float)Math.Atan2(toVertex.Y, toVertex.X);
                        float   diff     = (newAngle - angleToCentroid);

                        diff = (diff - MathHelper.Pi) % (2 * MathHelper.Pi);

                        // the minus pi is important. It means cutoff for going other direction is at 180 deg where it needs to be

                        if (diff < 0.0f)
                        {
                            diff += 2 * MathHelper.Pi;                             // correction for not handling negs
                        }

                        diff -= MathHelper.Pi;

                        if (Math.Abs(diff) > MathHelper.Pi)
                        {
                            continue;                             // Something's wrong, point not in shape but exists angle diff > 180
                        }

                        if (diff > max)
                        {
                            max         = diff;
                            maxAbsolute = newAngle;
                        }

                        if (diff < min)
                        {
                            min         = diff;
                            minAbsolute = newAngle;
                        }
                    }

                    vals[valIndex] = minAbsolute;
                    ++valIndex;
                    vals[valIndex] = maxAbsolute;
                    ++valIndex;
                }
            }

            Array.Sort(vals, 0, valIndex, _rdc);
            _data.Clear();
            bool rayMissed = true;

            for (int i = 0; i < valIndex; ++i)
            {
                Fixture fixture = null;
                float   midpt;

                int iplus = (i == valIndex - 1 ? 0 : i + 1);
                if (vals[i] == vals[iplus])
                {
                    continue;
                }

                if (i == valIndex - 1)
                {
                    // the single edgecase
                    midpt = (vals[0] + MathHelper.Pi * 2 + vals[i]);
                }
                else
                {
                    midpt = (vals[i + 1] + vals[i]);
                }

                midpt = midpt / 2;

                Vector2 p1 = pos;
                Vector2 p2 = radius * new Vector2((float)Math.Cos(midpt), (float)Math.Sin(midpt)) + pos;

                // RaycastOne
                bool hitClosest = false;
                World.RayCast((f, p, n, fr) => {
                    Body body = f.Body;

                    if (!IsActiveOn(body))
                    {
                        return(0);
                    }

                    hitClosest = true;
                    fixture    = f;
                    return(fr);
                }, p1, p2);

                // draws radius points
                if ((hitClosest) && (fixture.Body.BodyType == BodyType.Dynamic))
                {
                    if ((_data.Any()) && (_data.Last().Body == fixture.Body) && (!rayMissed))
                    {
                        int       laPos = _data.Count - 1;
                        ShapeData la    = _data[laPos];
                        la.Max       = vals[iplus];
                        _data[laPos] = la;
                    }
                    else
                    {
                        // make new
                        ShapeData d;
                        d.Body = fixture.Body;
                        d.Min  = vals[i];
                        d.Max  = vals[iplus];
                        _data.Add(d);
                    }

                    if ((_data.Count > 1) &&
                        (i == valIndex - 1) &&
                        (_data.Last().Body == _data.First().Body) &&
                        (_data.Last().Max == _data.First().Min))
                    {
                        ShapeData fi = _data[0];
                        fi.Min = _data.Last().Min;
                        _data.RemoveAt(_data.Count - 1);
                        _data[0] = fi;
                        while (_data.First().Min >= _data.First().Max)
                        {
                            fi.Min  -= MathHelper.Pi * 2;
                            _data[0] = fi;
                        }
                    }

                    int       lastPos = _data.Count - 1;
                    ShapeData last    = _data[lastPos];
                    while ((_data.Count > 0) &&
                           (_data.Last().Min >= _data.Last().Max))                            // just making sure min<max
                    {
                        last.Min       = _data.Last().Min - 2 * MathHelper.Pi;
                        _data[lastPos] = last;
                    }

                    rayMissed = false;
                }
                else
                {
                    rayMissed = true;                     // raycast did not find a shape
                }
            }

            for (int i = 0; i < _data.Count; ++i)
            {
                if (!IsActiveOn(_data[i].Body))
                {
                    continue;
                }

                float arclen = _data[i].Max - _data[i].Min;

                float first        = MathHelper.Min(maxEdgeOffset, EdgeRatio * arclen);
                int   insertedRays = (int)Math.Ceiling(((arclen - 2.0f * first) - (MinRays - 1) * MaxAngle) / MaxAngle);

                if (insertedRays < 0)
                {
                    insertedRays = 0;
                }

                float offset = (arclen - first * 2.0f) / ((float)MinRays + insertedRays - 1);

                //Note: This loop can go into infinite as it operates on floats.
                //Added FloatEquals with a large epsilon.
                for (float j = _data[i].Min + first;
                     j < _data[i].Max || MathUtils.FloatEquals(j, _data[i].Max, 0.0001f);
                     j += offset)
                {
                    Vector2 p1        = pos;
                    Vector2 p2        = pos + radius * new Vector2((float)Math.Cos(j), (float)Math.Sin(j));
                    Vector2 hitpoint  = Vector2.Zero;
                    float   minlambda = float.MaxValue;

                    List <Fixture> fl = _data[i].Body.FixtureList;
                    for (int x = 0; x < fl.Count; x++)
                    {
                        Fixture      f = fl[x];
                        RayCastInput ri;
                        ri.Point1      = p1;
                        ri.Point2      = p2;
                        ri.MaxFraction = 50f;

                        RayCastOutput ro;
                        if (f.RayCast(out ro, ref ri, 0))
                        {
                            if (minlambda > ro.Fraction)
                            {
                                minlambda = ro.Fraction;
                                hitpoint  = ro.Fraction * p2 + (1 - ro.Fraction) * p1;
                            }
                        }

                        // the force that is to be applied for this particular ray.
                        // offset is angular coverage. lambda*length of segment is distance.
                        float impulse = (arclen / (MinRays + insertedRays)) * maxForce * 180.0f / MathHelper.Pi *
                                        (1.0f - Math.Min(1.0f, minlambda));

                        // We Apply the impulse!!!
                        Vector2 vectImp =
                            Vector2.Dot(impulse * new Vector2((float)Math.Cos(j), (float)Math.Sin(j)), -ro.Normal) *
                            new Vector2((float)Math.Cos(j), (float)Math.Sin(j));
                        _data[i].Body.ApplyLinearImpulse(ref vectImp, ref hitpoint);

                        // We gather the fixtures for returning them
                        if (exploded.ContainsKey(f))
                        {
                            exploded[f] += vectImp;
                        }
                        else
                        {
                            exploded.Add(f, vectImp);
                        }

                        if (minlambda > 1.0f)
                        {
                            hitpoint = p2;
                        }
                    }
                }
            }

            // We check contained shapes
            for (int i = 0; i < containedShapeCount; ++i)
            {
                Fixture fix = containedShapes[i];

                if (!IsActiveOn(fix.Body))
                {
                    continue;
                }

                float   impulse = MinRays * maxForce * 180.0f / MathHelper.Pi;
                Vector2 hitPoint;

                CircleShape circShape = fix.Shape as CircleShape;
                if (circShape != null)
                {
                    hitPoint = fix.Body.GetWorldPoint(circShape.Position);
                }
                else
                {
                    PolygonShape shape = fix.Shape as PolygonShape;
                    hitPoint = fix.Body.GetWorldPoint(shape.MassData.Centroid);
                }

                Vector2 vectImp = impulse * (hitPoint - pos);

                fix.Body.ApplyLinearImpulse(ref vectImp, ref hitPoint);

                if (!exploded.ContainsKey(fix))
                {
                    exploded.Add(fix, vectImp);
                }
            }

            return(exploded);
        }
コード例 #26
0
ファイル: RayCast.cs プロジェクト: prepare/box2c
        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;
        }
コード例 #27
0
        public DialogueBox(GameState state, string tag)
        {
            this.state = state;
            this.tag   = tag;
            if (tag == "AI")
            {
                cursor           = new CircleShape((SCREEN_WIDTH / 1920) * 10, 3);
                dialogueFontSize = getFontSize();
                nameFontSize     = getFontSize() + 20;
                cursor.Rotation  = 180;
            }
            else if (tag == "PLAYER")
            {
                cursor           = new CircleShape((SCREEN_WIDTH / 1920) * 20, 3);
                dialogueFontSize = getFontSize() + 20;
                nameFontSize     = getFontSize() + 30;
                cursor.Rotation  = 180;
            }
            else if (tag == "tooltip")
            {
                dialogueFontSize = getFontSize() - 3;
                nameFontSize     = getFontSize() - 10;
            }

            if (tag != "tooltip")
            {
                if (!spriteDict.ContainsKey("left"))
                {
                    spriteDict.Add("left", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/speechbubbleleft.png")));
                    spriteDict["left"].Scale = scale;
                }
                if (!spriteDict.ContainsKey("right"))
                {
                    spriteDict.Add("right", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/speechbubbleright.png")));
                    spriteDict["right"].Scale = scale;
                }
                if (!spriteDict.ContainsKey("player"))
                {
                    spriteDict.Add("player", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/psb.png")));
                    spriteDict["player"].Scale = scale;
                }
            }
            else
            {
                // Tooltip 1
                if (!spriteDict.ContainsKey("tooltipleft"))
                {
                    spriteDict.Add("tooltipleft", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/tooltipinforight.png")));
                    spriteDict["tooltipleft"].Scale = scale;
                }
                if (!spriteDict.ContainsKey("tooltiplefthover"))
                {
                    spriteDict.Add("tooltiplefthover", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/tooltipinforighthover.png")));
                    spriteDict["tooltiplefthover"].Scale = scale;
                }
                // Tooltip 2
                if (!spriteDict.ContainsKey("tooltipright"))
                {
                    spriteDict.Add("tooltipright", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/tooltipinfotest.png")));
                    spriteDict["tooltipright"].Scale = scale;
                }
                if (!spriteDict.ContainsKey("tooltiprighthover"))
                {
                    spriteDict.Add("tooltiprighthover", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/tooltipinfotesthover.png")));
                    spriteDict["tooltiprighthover"].Scale = scale;
                }
                // Tooltip 3
                if (!spriteDict.ContainsKey("tooltipsmall"))
                {
                    spriteDict.Add("tooltipsmall", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/speakbuttontooltip.png")));
                    spriteDict["tooltipsmall"].Scale = scale;
                }
                if (!spriteDict.ContainsKey("tooltipsmallhover"))
                {
                    spriteDict.Add("tooltipsmallhover", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/speakbuttontooltiphover.png")));
                    spriteDict["tooltipsmallhover"].Scale = scale;
                }
            }
        }
コード例 #28
0
        private EdgeShapesTest()
        {
            // Ground body
            {
                Body ground = BodyFactory.CreateBody(World);

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

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

                    x1 = x2;
                    y1 = y2;
                }
            }

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

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

            {
                const float w = 1.0f;
                float       b = w / (2.0f + (float)Math.Sqrt(2.0f));
                float       s = (float)Math.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, 20);
            }

            {
                _polygons[3]          = new PolygonShape(20);
                _polygons[3].Vertices = PolygonUtils.CreateRectangle(0.5f, 0.5f);
            }

            {
                _circle = new CircleShape(0.5f, 1);
            }

            _bodyIndex = 0;
            _angle     = 0.0f;
        }
コード例 #29
0
ファイル: Bridge.cs プロジェクト: CrazyLiu00/GMap
        //NoNeed	Body _middle;


        public Bridge()
        {
            Body ground = null;

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

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

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

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

                RevoluteJointDef jd = new RevoluteJointDef();

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

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

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

                    prevBody = body;
                }

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

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

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

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

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

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

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

                BodyDef bd = new BodyDef();
                bd.type     = BodyType.Dynamic;
                bd.position = new Vector2(-6.0f + 6.0f * i, 10.0f);
                Body body = _world.CreateBody(bd);
                body.CreateFixture(fd);
            }
        }
コード例 #30
0
        public CollisionProcessing()
        {
            // Ground body
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vector2(-50.0, 0.0), new Vector2(50.0, 0.0));

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

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

            double xLo = -5.0, xHi = 5.0;
            double yLo = 2.0, yHi = 35.0;

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

            PolygonShape polygon = new PolygonShape();

            polygon.Set(vertices, 3);

            FixtureDef triangleShapeDef = new FixtureDef();

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

            BodyDef triangleBodyDef = new BodyDef();

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

            Body body1 = _world.CreateBody(triangleBodyDef);

            body1.CreateFixture(triangleShapeDef);

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

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

            Body body2 = _world.CreateBody(triangleBodyDef);

            body2.CreateFixture(triangleShapeDef);

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

            FixtureDef boxShapeDef = new FixtureDef();

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

            BodyDef boxBodyDef = new BodyDef();

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

            Body body3 = _world.CreateBody(boxBodyDef);

            body3.CreateFixture(boxShapeDef);

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

            Body body4 = _world.CreateBody(boxBodyDef);

            body4.CreateFixture(boxShapeDef);

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

            circle._radius = 1.0f;

            FixtureDef circleShapeDef = new FixtureDef();

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

            BodyDef circleBodyDef = new BodyDef();

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

            Body body5 = _world.CreateBody(circleBodyDef);

            body5.CreateFixture(circleShapeDef);

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

            Body body6 = _world.CreateBody(circleBodyDef);

            body6.CreateFixture(circleShapeDef);
        }
コード例 #31
0
 public CircleContact(Fixture fA, int indexA, Fixture fB, int indexB) : base(fA, indexA, fB, indexB)
 {
     circleB = (CircleShape)m_fixtureB.Shape;
     circleA = (CircleShape)m_fixtureA.Shape;
 }
コード例 #32
0
        private TheoJansenTest()
        {
            _offset     = new Vector2(0.0f, 8.0f);
            _motorSpeed = 2.0f;
            _motorOn    = true;
            Vector2 pivot = new Vector2(0.0f, 0.8f);

            // Ground
            {
                Body ground = BodyFactory.CreateEdge(World, new Vector2(-50.0f, 0.0f), new Vector2(50.0f, 0.0f));
                FixtureFactory.AttachEdge(new Vector2(-50.0f, 0.0f), new Vector2(-50.0f, 10.0f), ground);
                FixtureFactory.AttachEdge(new Vector2(50.0f, 0.0f), new Vector2(50.0f, 10.0f), ground);
            }

            // Balls
            for (int i = 0; i < 40; ++i)
            {
                CircleShape shape = new CircleShape(0.25f, 1);

                Body body = BodyFactory.CreateBody(World);
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(-40.0f + 2.0f * i, 0.5f);

                body.CreateFixture(shape);
            }

            // Chassis
            {
                PolygonShape shape = new PolygonShape(1);
                shape.Vertices = PolygonUtils.CreateRectangle(2.5f, 1.0f);

                _chassis          = BodyFactory.CreateBody(World);
                _chassis.BodyType = BodyType.Dynamic;
                _chassis.Position = pivot + _offset;

                Fixture fixture = _chassis.CreateFixture(shape);
                fixture.CollisionGroup = -1;
            }

            {
                CircleShape shape = new CircleShape(1.6f, 1);

                _wheel          = BodyFactory.CreateBody(World);
                _wheel.BodyType = BodyType.Dynamic;
                _wheel.Position = pivot + _offset;

                Fixture fixture = _wheel.CreateFixture(shape);
                fixture.CollisionGroup = -1;
            }

            {
                _motorJoint = new RevoluteJoint(_wheel, _chassis, _chassis.Position, true);
                _motorJoint.CollideConnected = false;
                _motorJoint.MotorSpeed       = _motorSpeed;
                _motorJoint.MaxMotorTorque   = 400.0f;
                _motorJoint.MotorEnabled     = _motorOn;
                World.AddJoint(_motorJoint);
            }

            Vector2 wheelAnchor = pivot + new Vector2(0.0f, -0.8f);

            CreateLeg(-1.0f, wheelAnchor);
            CreateLeg(1.0f, wheelAnchor);

            _wheel.SetTransform(_wheel.Position, 120.0f * Settings.Pi / 180.0f);
            CreateLeg(-1.0f, wheelAnchor);
            CreateLeg(1.0f, wheelAnchor);

            _wheel.SetTransform(_wheel.Position, -120.0f * Settings.Pi / 180.0f);
            CreateLeg(-1.0f, wheelAnchor);
            CreateLeg(1.0f, wheelAnchor);
        }
コード例 #33
0
        public void DrawShape(Fixture fixture, Transform xf, Color color)
        {
            switch (fixture.ShapeType)
            {
            case ShapeType.Circle:
            {
                CircleShape circle = (CircleShape)fixture.Shape;

                Vector2 center = MathUtils.Multiply(ref xf, circle.Position);
                float   radius = circle.Radius;
                Vector2 axis   = xf.R.Col1;

                if (DrawSolidShapes)
                {
                    DrawSolidCircle(center, radius, axis, color);
                }
                else
                {
                    DrawCircle(center, radius, color);
                }
            }
            break;

            case ShapeType.Polygon:
            {
                PolygonShape poly        = (PolygonShape)fixture.Shape;
                int          vertexCount = poly.Vertices.Count;
                Debug.Assert(vertexCount <= Settings.MaxPolygonVertices);

                for (int i = 0; i < vertexCount; ++i)
                {
                    _tempVertices[i] = MathUtils.Multiply(ref xf, poly.Vertices[i]);
                }

                if (DrawSolidShapes)
                {
                    DrawSolidPolygon(_tempVertices, vertexCount, color);
                }
                else
                {
                    DrawPolygon(_tempVertices, vertexCount, color);
                }
            }
            break;


            case ShapeType.Edge:
            {
                EdgeShape edge = (EdgeShape)fixture.Shape;
                Vector2   v1   = MathUtils.Multiply(ref xf, edge.Vertex1);
                Vector2   v2   = MathUtils.Multiply(ref xf, edge.Vertex2);
                DrawSegment(v1, v2, color);
            }
            break;

            case ShapeType.Loop:
            {
                LoopShape loop  = (LoopShape)fixture.Shape;
                int       count = loop.Vertices.Count;

                Vector2 v1 = MathUtils.Multiply(ref xf, loop.Vertices[count - 1]);
                DrawCircle(v1, 0.05f, color);
                for (int i = 0; i < count; ++i)
                {
                    Vector2 v2 = MathUtils.Multiply(ref xf, loop.Vertices[i]);
                    DrawSegment(v1, v2, color);
                    v1 = v2;
                }
            }
            break;
            }
        }
コード例 #34
0
ファイル: VerticalStack.cs プロジェクト: GretelF/squircle
        public override void Step(Framework.Settings settings)
        {
            base.Step(settings);

            _debugDraw.DrawString(50, _textLine, "Press: (,) to launch a bullet.");

            if (_stepCount == 300)
            {
                if (_bullet != null)
                {
                    _world.DestroyBody(_bullet);
                    _bullet = null;
                }

                {
                    CircleShape shape = new CircleShape();
                    shape._radius = 0.25f;

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

                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.Dynamic;
                    bd.bullet = true;
                    bd.position = new Vector2(-31.0f, 5.0f);

                    _bullet = _world.CreateBody(bd);
                    _bullet.CreateFixture(fd);

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

            _textLine += 15;
        }
コード例 #35
0
        public void JointReactions()
        {
            var   gravity = new Vector2(0, -10.0f);
            World world   = new World(gravity);

            BodyDef bodyDef = new BodyDef();
            Body    ground  = world.CreateBody(bodyDef);

            CircleShape circle = new CircleShape();

            circle.Radius = 1.0f;

            FixtureDef fixtureDef = new FixtureDef();

            // Disable collision
            fixtureDef.Filter.MaskBits = 0;
            fixtureDef.Density         = 1.0f;
            fixtureDef.Shape           = circle;

            bodyDef.BodyType = BodyType.DynamicBody;
            bodyDef.Position.Set(-2.0f, 3.0f);

            var bodyA = world.CreateBody(bodyDef);
            var bodyB = world.CreateBody(bodyDef);
            var bodyC = world.CreateBody(bodyDef);

            circle.ComputeMass(out var massData, fixtureDef.Density);
            var mg = massData.Mass * gravity.Y;

            bodyA.CreateFixture(fixtureDef);
            bodyB.CreateFixture(fixtureDef);
            bodyC.CreateFixture(fixtureDef);

            DistanceJointDef distanceJointDef = new DistanceJointDef();

            distanceJointDef.Initialize(ground, bodyA, bodyDef.Position + new Vector2(0.0f, 4.0f), bodyDef.Position);
            distanceJointDef.MinLength = distanceJointDef.Length;
            distanceJointDef.MaxLength = distanceJointDef.Length;

            PrismaticJointDef prismaticJointDef = new PrismaticJointDef();

            prismaticJointDef.Initialize(ground, bodyB, bodyDef.Position, new Vector2(1.0f, 0.0f));

            RevoluteJointDef revoluteJointDef = new RevoluteJointDef();

            revoluteJointDef.Initialize(ground, bodyC, bodyDef.Position);

            var distanceJoint  = (DistanceJoint)world.CreateJoint(distanceJointDef);
            var prismaticJoint = (PrismaticJoint)world.CreateJoint(prismaticJointDef);
            var revoluteJoint  = (RevoluteJoint)world.CreateJoint(revoluteJointDef);

            const float timeStep           = 1 / 60f;
            const float invTimeStep        = 60.0f;
            const int   velocityIterations = 6;
            const int   positionIterations = 2;

            world.Step(timeStep, velocityIterations, positionIterations);

            const float tol = 1e-5f;
            {
                var F = distanceJoint.GetReactionForce(invTimeStep);
                var T = distanceJoint.GetReactionTorque(invTimeStep);
                F.X.ShouldBe(0.0f);
                Math.Abs(F.Y + mg).ShouldBeLessThan(tol);
                T.ShouldBe(0.0f);
            }

            {
                var F = prismaticJoint.GetReactionForce(invTimeStep);
                var T = prismaticJoint.GetReactionTorque(invTimeStep);
                F.X.ShouldBe(0.0f);
                Math.Abs(F.Y + mg).ShouldBeLessThan(tol);
                T.ShouldBe(0.0f);
            }

            {
                var F = revoluteJoint.GetReactionForce(invTimeStep);
                var T = revoluteJoint.GetReactionTorque(invTimeStep);
                F.X.ShouldBe(0.0f);
                Math.Abs(F.Y + mg).ShouldBeLessThan(tol);
                T.ShouldBe(0.0f);
            }
        }
コード例 #36
0
ファイル: Car.cs プロジェクト: RubisetCie/box2c
        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);
            }
        }
コード例 #37
0
        /// <summary>
        /// Compute contact points for edge versus circle.
        /// This accounts for edge connectivity.
        /// </summary>
        /// <param name="manifold">The manifold.</param>
        /// <param name="edgeA">The edge A.</param>
        /// <param name="transformA">The transform A.</param>
        /// <param name="circleB">The circle B.</param>
        /// <param name="transformB">The transform B.</param>
        public static void CollideEdgeAndCircle(ref Manifold manifold, EdgeShape edgeA, ref Transform transformA, CircleShape circleB, ref Transform transformB)
        {
            manifold.PointCount = 0;

            // Compute circle in frame of edge
            Vector2 Q = MathUtils.MulT(ref transformA, MathUtils.Mul(ref transformB, ref circleB._position));

            Vector2 A = edgeA.Vertex1, B = edgeA.Vertex2;
            Vector2 e = B - A;

            // Barycentric coordinates
            float u = Vector2.Dot(e, B - Q);
            float v = Vector2.Dot(e, Q - A);

            float radius = edgeA.Radius + circleB.Radius;

            ContactFeature cf;

            cf.IndexB = 0;
            cf.TypeB  = ContactFeatureType.Vertex;

            // Region A
            if (v <= 0.0f)
            {
                Vector2 P1  = A;
                Vector2 d1  = Q - P1;
                float   dd1 = Vector2.Dot(d1, d1);
                if (dd1 > radius * radius)
                {
                    return;
                }

                // Is there an edge connected to A?
                if (edgeA.HasVertex0)
                {
                    Vector2 A1 = edgeA.Vertex0;
                    Vector2 B1 = A;
                    Vector2 e1 = B1 - A1;
                    float   u1 = Vector2.Dot(e1, B1 - Q);

                    // Is the circle in Region AB of the previous edge?
                    if (u1 > 0.0f)
                    {
                        return;
                    }
                }

                cf.IndexA                                = 0;
                cf.TypeA                                 = ContactFeatureType.Vertex;
                manifold.PointCount                      = 1;
                manifold.Type                            = ManifoldType.Circles;
                manifold.LocalNormal                     = Vector2.Zero;
                manifold.LocalPoint                      = P1;
                manifold.Points.Value0.Id.Key            = 0;
                manifold.Points.Value0.Id.ContactFeature = cf;
                manifold.Points.Value0.LocalPoint        = circleB.Position;
                return;
            }

            // Region B
            if (u <= 0.0f)
            {
                Vector2 P2  = B;
                Vector2 d2  = Q - P2;
                float   dd2 = Vector2.Dot(d2, d2);
                if (dd2 > radius * radius)
                {
                    return;
                }

                // Is there an edge connected to B?
                if (edgeA.HasVertex3)
                {
                    Vector2 B2 = edgeA.Vertex3;
                    Vector2 A2 = B;
                    Vector2 e2 = B2 - A2;
                    float   v2 = Vector2.Dot(e2, Q - A2);

                    // Is the circle in Region AB of the next edge?
                    if (v2 > 0.0f)
                    {
                        return;
                    }
                }

                cf.IndexA                                = 1;
                cf.TypeA                                 = (byte)ContactFeatureType.Vertex;
                manifold.PointCount                      = 1;
                manifold.Type                            = ManifoldType.Circles;
                manifold.LocalNormal                     = Vector2.Zero;
                manifold.LocalPoint                      = P2;
                manifold.Points.Value0.Id.Key            = 0;
                manifold.Points.Value0.Id.ContactFeature = cf;
                manifold.Points.Value0.LocalPoint        = circleB.Position;
                return;
            }

            // Region AB
            float den = Vector2.Dot(e, e);

            System.Diagnostics.Debug.Assert(den > 0.0f);
            Vector2 P  = (1.0f / den) * (u * A + v * B);
            Vector2 d  = Q - P;
            float   dd = Vector2.Dot(d, d);

            if (dd > radius * radius)
            {
                return;
            }

            Vector2 n = new Vector2(-e.Y, e.X);

            if (Vector2.Dot(n, Q - A) < 0.0f)
            {
                n = new Vector2(-n.X, -n.Y);
            }
            n.Normalize();

            cf.IndexA                                = 0;
            cf.TypeA                                 = ContactFeatureType.Face;
            manifold.PointCount                      = 1;
            manifold.Type                            = ManifoldType.FaceA;
            manifold.LocalNormal                     = n;
            manifold.LocalPoint                      = A;
            manifold.Points.Value0.Id.Key            = 0;
            manifold.Points.Value0.Id.ContactFeature = cf;
            manifold.Points.Value0.LocalPoint        = circleB.Position;
        }
コード例 #38
0
ファイル: RayCast.cs プロジェクト: RubisetCie/box2c
        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;
        }
コード例 #39
0
        public override bool Initialize()
        {
            if (!base.Initialize())
            {
                return(false);
            }
            if (!RetrieveSibling(out m_state))
            {
                return(false);
            }

            var size = m_state.Dimensions;

            m_bodyShape = new RectangleShape
            {
                FillColor        = Color.White,
                OutlineColor     = Color.Black,
                OutlineThickness = OutlineThickness,
                Size             = size.ToVector2f(),
                Origin           = new Vector2f(size.X / 2, size.Y / 2)
            };

            // fill is positioned at the base of the body so it acts as a health bar
            m_bodyFillShape = new RectangleShape
            {
                Size   = size.ToVector2f(),
                Origin = new Vector2f(0, size.Y / 2)
            };
            m_bodyFillTransform.Translate(-size.X / 2, 0);

            // tracks are 90% of the body length
            size.X      *= 0.9f;
            size.Y      += (m_state.TrackWidth * 2);
            m_trackShape = new RectangleShape
            {
                FillColor = Color.Black,
                Size      = size.ToVector2f(),
                Origin    = new Vector2f(size.X / 2, size.Y / 2)
            };

            var turretRadius = m_state.TurretWidth / 2;

            m_turretShape = new CircleShape
            {
                FillColor        = BodyColor,
                OutlineColor     = Color.Black,
                OutlineThickness = OutlineThickness,
                Radius           = turretRadius,
                Origin           = new Vector2f(turretRadius, turretRadius)
            };

            // make the barrel extend from the center of the turret for simplicity
            size          = m_state.BarrelDimensions + new Vector2(turretRadius, 0);
            m_barrelShape = new RectangleShape
            {
                FillColor        = BodyColor,
                OutlineColor     = Color.Black,
                OutlineThickness = OutlineThickness,
                Size             = size.ToVector2f(),
                Origin           = new Vector2f(0, size.Y / 2)
            };

            Initialized = true;
            return(true);
        }
コード例 #40
0
        static bool collidePolygonCircle(PolygonShape polygon, ref FSTransform polyTransform, CircleShape circle, ref FSTransform circleTransform, out FSCollisionResult result)
        {
            result = new FSCollisionResult();
            Collision.collidePolygonAndCircle(ref _manifold, polygon, ref polyTransform, circle, ref circleTransform);
            if (_manifold.pointCount > 0)
            {
                FixedArray2 <Vector2> points;
                ContactSolver.WorldManifold.initialize(ref _manifold, ref polyTransform, polygon.radius, ref circleTransform, circle.radius, out result.normal, out points);

                //var circleInPolySpace = polygonFixture.Body.GetLocalPoint( circleFixture.Body.Position );
                var circleInPolySpace = MathUtils.mulT(ref polyTransform, circleTransform.p);
                var value1            = circleInPolySpace - _manifold.localPoint;
                var value2            = _manifold.localNormal;
                var separation        = circle.radius - (value1.X * value2.X + value1.Y * value2.Y);

                if (separation <= 0)
                {
                    return(false);
                }

                result.point = points[0] * FSConvert.simToDisplay;
                result.minimumTranslationVector = result.normal * separation;

                                #if DEBUG_FSCOLLISIONS
                Debug.drawPixel(result.point, 2, Color.Red, 0.2f);
                Debug.drawLine(result.point, result.point + result.normal * 20, Color.Yellow, 0.2f);
                                #endif

                return(true);
            }

            return(false);
        }
コード例 #41
0
        protected override BodyContainer Read(ContentReader input, BodyContainer existingInstance)
        {
            BodyContainer bodies = existingInstance ?? new BodyContainer();

            int count = input.ReadInt32();

            for (int i = 0; i < count; i++)
            {
                string       name = input.ReadString();
                BodyTemplate body = new BodyTemplate
                {
                    Mass     = input.ReadSingle(),
                    BodyType = (BodyType)input.ReadInt32()
                };
                int fixtureCount = input.ReadInt32();
                for (int j = 0; j < fixtureCount; j++)
                {
                    FixtureTemplate fixture = new FixtureTemplate
                    {
                        Name        = input.ReadString(),
                        Restitution = input.ReadSingle(),
                        Friction    = input.ReadSingle()
                    };
                    ShapeType type = (ShapeType)input.ReadInt32();
                    switch (type)
                    {
                    case ShapeType.Circle:
                    {
                        float       density = input.ReadSingle();
                        float       radius  = input.ReadSingle();
                        CircleShape circle  = new CircleShape(radius, density);
                        circle.Position = input.ReadVector2();
                        fixture.Shape   = circle;
                    } break;

                    case ShapeType.Polygon:
                    {
                        Vertices verts        = new Vertices(Settings.MaxPolygonVertices);
                        float    density      = input.ReadSingle();
                        int      verticeCount = input.ReadInt32();
                        for (int k = 0; k < verticeCount; k++)
                        {
                            verts.Add(input.ReadVector2());
                        }
                        PolygonShape poly = new PolygonShape(verts, density);
                        poly.MassData.Centroid = input.ReadVector2();
                        fixture.Shape          = poly;
                    } break;

                    case ShapeType.Edge:
                    {
                        EdgeShape edge = new EdgeShape(input.ReadVector2(), input.ReadVector2());
                        edge.HasVertex0 = input.ReadBoolean();
                        if (edge.HasVertex0)
                        {
                            edge.Vertex0 = input.ReadVector2();
                        }
                        edge.HasVertex3 = input.ReadBoolean();
                        if (edge.HasVertex3)
                        {
                            edge.Vertex3 = input.ReadVector2();
                        }
                        fixture.Shape = edge;
                    } break;

                    case ShapeType.Chain:
                    {
                        Vertices verts        = new Vertices();
                        int      verticeCount = input.ReadInt32();
                        for (int k = 0; k < verticeCount; k++)
                        {
                            verts.Add(input.ReadVector2());
                        }
                        fixture.Shape = new ChainShape(verts);
                    } break;
                    }
                    body.Fixtures.Add(fixture);
                }
                bodies[name] = body;
            }
            return(bodies);
        }
コード例 #42
0
        public CollisionProcessing()
        {
            // Ground body
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vector2(-50.0f, 0.0f), new Vector2(50.0f, 0.0f));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            Body body6 = _world.CreateBody(circleBodyDef);
            body6.CreateFixture(circleShapeDef);
        }
コード例 #43
0
ファイル: Driver.cs プロジェクト: wyb314/Physics2D.Net
        static void Main(string[] args)
        {
            GroupCollection collection1 = new GroupCollection();
            GroupCollection collection2 = new GroupCollection();

            /* collection1.AddRange(new int[] { 1 });
            *  collection1.AddRange(new int[] {  3 });
            *  collection1.AddRange(new int[] {  2 });*/
            collection1.Add(1);
            collection1.Add(3);
            collection1.Add(2);
            collection2.Add(1);
            Console.WriteLine(GroupCollection.Intersect(collection1, collection2));

            Console.ReadLine();
            return;

            PhysicsEngine engine = new PhysicsEngine();

            engine.BroadPhase = new Physics2DDotNet.Detectors.SelectiveSweepDetector();
            engine.Solver     = new Physics2DDotNet.Solvers.SequentialImpulsesSolver();

            PhysicsTimer timer = new PhysicsTimer(engine.Update, .01f);

            timer.IsRunning = true;



            Coefficients coffecients = new Coefficients(/*restitution*/ 1, /*friction*/ .5f);


            IShape shape1 = new CircleShape(8, 7);
            IShape shape2 = new PolygonShape(VertexHelper.CreateRectangle(20, 10), 3);

            Scalar mass  = 5;
            Body   body1 = new Body(new PhysicsState(), shape1, mass, coffecients, new Lifespan());
            Body   body2 = new Body(new PhysicsState(), shape2, mass, coffecients, new Lifespan());

            engine.AddBody(body1);
            engine.AddBody(body2);
            Joint joint = new HingeJoint(body1, body2, Vector2D.Zero, new Lifespan());

            engine.AddJoint(joint);
            joint.Lifetime.IsExpired = true;

            engine.AddJoint(new HingeJoint(body1, body2, Vector2D.Zero, new Lifespan()));
            engine.Update(0, 0);

            body1.Lifetime.IsExpired = true;

            timer.IsRunning = false;
            engine.AddProxy(body1, body2, Matrix2x2.Identity);
            //  b1.RemoveFromProxy();



            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream    stream    = new MemoryStream();

            formatter.Serialize(stream, engine);
            stream.Seek(0, SeekOrigin.Begin);
            PhysicsEngine engine2 = (PhysicsEngine)formatter.Deserialize(stream);



            Console.WriteLine();

            /*
             *
             * Vector2D[] vertexes1 = new Vector2D[]
             * {
             *  new Vector2D(-1,1),
             *  new Vector2D(-3,1),
             *  new Vector2D(-3,-1),
             *  new Vector2D(-1,-1),
             * };
             * Vector2D[] vertexes2 = new Vector2D[]
             * {
             *  new Vector2D(1,-1),
             *  new Vector2D(3,-1),
             *  new Vector2D(3,1),
             *  new Vector2D(1,1),
             * };
             * Vector2D[][] polygons = new Vector2D[2][];
             * polygons[0] = vertexes1;
             * polygons[1] = vertexes2;
             * Console.WriteLine(MultiPartPolygon.GetCentroid(polygons));
             * Console.WriteLine(MultiPartPolygon.GetArea(polygons));
             */
            Console.WriteLine("Finished");
            Console.ReadLine();
        }
コード例 #44
0
        public CollisionFiltering()
        {
            // Ground body
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));

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

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

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

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

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

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

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

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

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

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

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

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

                _world.CreateJoint(jd);
            }

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

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

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

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

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

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

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

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

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

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

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

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

            Body body6 = _world.CreateBody(circleBodyDef);
            body6.CreateFixture(circleShapeDef);
        }
コード例 #45
0
    // Update is called once per frame
    void Update( )
    {
        Ray ray = _camera.ScreenPointToRay(Input.mousePosition);

        RaycastHit2D hit = new RaycastHit2D( );

        if (!EventSystem.current.IsPointerOverGameObject())
        {
            hit = Physics2D.GetRayIntersection(ray, Mathf.Infinity, _layerMask);
        }
        else if (_currentCursor != CursorType.Normal && !Input.GetMouseButton(0))
        {
            Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
            _currentCursor = CursorType.Normal;
        }

        if (hit.collider != null)
        {
            if (hit.collider.CompareTag("EffectorCenter") && _currentCursor != CursorType.Move)
            {
                Cursor.SetCursor(_cursorMove, _cursorMoveHotSpot, CursorMode.Auto);
                _currentCursor = CursorType.Move;
            }
            else if (hit.collider.CompareTag("EffectorOut") && _currentCursor != CursorType.Resize)
            {
                Cursor.SetCursor(_cursorResize, _cursorResizeHotSpot, CursorMode.Auto);
                _currentCursor = CursorType.Resize;
            }
        }
        else if (_currentCursor != CursorType.Normal && !Input.GetMouseButton(0))
        {
            Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
            _currentCursor = CursorType.Normal;
        }

        if (Input.GetMouseButtonDown(0))
        {
            if (hit.collider != null)
            {
                if (hit.collider.CompareTag("EffectorCenter"))
                {
                    _effectorTransform = hit.collider.transform.parent;
                    _offset            = hit.point - ( Vector2 )_effectorTransform.position;
                }

                if (hit.collider.CompareTag("EffectorOut"))
                {
                    _effectorResizeTransform    = hit.collider.transform;
                    _effectorResizeRadiusScript = _effectorResizeTransform.GetComponent <CircleShape>( );
                    _areaEffector             = _effectorResizeTransform.GetComponent <AreaEffector2D>( );
                    _lastDistanceFromEffector = Vector2.Distance(ray.origin, _effectorResizeTransform.position);
                }
            }
        }

        if (Input.GetMouseButton(0) && _effectorTransform != null)
        {
            _effectorTransform.position = new Vector3(ray.origin.x - _offset.x, ray.origin.y - _offset.y, 0f);
        }

        if (Input.GetMouseButton(0) && _effectorResizeTransform != null)
        {
            float _distance    = Vector2.Distance(ray.origin, _effectorResizeTransform.position);
            float _difDistance = _lastDistanceFromEffector - _distance;

            float _newRadius = _effectorResizeRadiusScript.Radius - _difDistance;
            _newRadius = Mathf.Clamp(_newRadius, _minRadius, _maxRadius);

            _areaEffector.forceMagnitude = _newRadius * _forceMultiplier;

            _effectorResizeRadiusScript.Radius = _newRadius;
            _lastDistanceFromEffector          = _distance;
        }

        if (Input.GetMouseButtonUp(0))
        {
            _effectorTransform          = null;
            _effectorResizeTransform    = null;
            _effectorResizeRadiusScript = null;
            _areaEffector = null;
        }
    }
コード例 #46
0
        private GearsTest()
        {
            Body ground = BodyFactory.CreateEdge(World, new Vector2(50.0f, 0.0f), new Vector2(-50.0f, 0.0f));

            {
                CircleShape circle1 = new CircleShape(1.0f, 5f);

                PolygonShape box = new PolygonShape(5f);
                box.Vertices = PolygonTools.CreateRectangle(0.5f, 5.0f);

                CircleShape circle2 = new CircleShape(2.0f, 5f);

                Body body1 = BodyFactory.CreateBody(World, new Vector2(10.0f, 9.0f));
                body1.CreateFixture(circle1);

                Body body2 = BodyFactory.CreateBody(World, new Vector2(10.0f, 8.0f));
                body2.BodyType = BodyType.Dynamic;
                body2.CreateFixture(box);

                Body body3 = BodyFactory.CreateBody(World, new Vector2(10.0f, 6.0f));
                body3.BodyType = BodyType.Dynamic;
                body3.CreateFixture(circle2);

                RevoluteJoint joint1 = new RevoluteJoint(body2, body1, body1.Position, true);
                World.AddJoint(joint1);

                RevoluteJoint joint2 = new RevoluteJoint(body2, body3, body3.Position, true);
                World.AddJoint(joint2);

                GearJoint joint4 = new GearJoint(body1, body3, joint1, joint2, circle2.Radius / circle1.Radius);
                World.AddJoint(joint4);
            }

            {
                CircleShape circle1 = new CircleShape(1.0f, 5.0f);

                CircleShape circle2 = new CircleShape(2.0f, 5.0f);

                PolygonShape box = new PolygonShape(5f);
                box.Vertices = PolygonTools.CreateRectangle(0.5f, 5.0f);

                Body body1 = BodyFactory.CreateBody(World, new Vector2(-3.0f, 12.0f));
                body1.BodyType = BodyType.Dynamic;
                body1.CreateFixture(circle1);

                _joint1 = new RevoluteJoint(ground, body1, body1.Position, true);
                _joint1.ReferenceAngle = body1.Rotation - ground.Rotation;
                World.AddJoint(_joint1);

                Body body2 = BodyFactory.CreateBody(World, new Vector2(0.0f, 12.0f));
                body2.BodyType = BodyType.Dynamic;
                body2.CreateFixture(circle2);

                _joint2 = new RevoluteJoint(ground, body2, body2.Position, true);
                World.AddJoint(_joint2);

                Body body3 = BodyFactory.CreateBody(World, new Vector2(2.5f, 12.0f));
                body3.BodyType = BodyType.Dynamic;
                body3.CreateFixture(box);

                _joint3              = new PrismaticJoint(ground, body3, body3.Position, new Vector2(0.0f, 1.0f), true);
                _joint3.LowerLimit   = -5.0f;
                _joint3.UpperLimit   = 5.0f;
                _joint3.LimitEnabled = true;

                World.AddJoint(_joint3);

                _joint4 = new GearJoint(body1, body2, _joint1, _joint2, circle2.Radius / circle1.Radius);
                World.AddJoint(_joint4);

                _joint5 = new GearJoint(body2, body3, _joint2, _joint3, -1.0f / circle2.Radius);
                World.AddJoint(_joint5);
            }
        }
コード例 #47
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);
        }
コード例 #48
0
        /// <summary>
        /// Compute contact points for edge versus circle.
        /// This accounts for edge connectivity.
        /// </summary>
        /// <param name="manifold">The manifold.</param>
        /// <param name="edgeA">The edge A.</param>
        /// <param name="transformA">The transform A.</param>
        /// <param name="circleB">The circle B.</param>
        /// <param name="transformB">The transform B.</param>
        public static void CollideEdgeAndCircle(ref Manifold manifold, EdgeShape edgeA, ref Transform transformA,
                                                CircleShape circleB, ref Transform transformB)
        {
            manifold.PointCount = 0;

            // Compute circle in frame of edge
            var Q = MathUtils.MulT(ref transformA, MathUtils.Mul(ref transformB, ref circleB._position));

            Vector2 A = edgeA.Vertex1, B = edgeA.Vertex2;
            var     e = B - A;

            // Barycentric coordinates
            var u = Vector2.Dot(e, B - Q);
            var v = Vector2.Dot(e, Q - A);

            var radius = edgeA.Radius + circleB.Radius;

            ContactFeature cf;

            cf.IndexB = 0;
            cf.TypeB  = ContactFeatureType.Vertex;

            // Region A
            if (v <= 0.0f)
            {
                var P1  = A;
                var d1  = Q - P1;
                var dd1 = Vector2.Dot(d1, d1);
                if (dd1 > radius * radius)
                {
                    return;
                }

                // Is there an edge connected to A?
                if (edgeA.HasVertex0)
                {
                    var A1 = edgeA.Vertex0;
                    var B1 = A;
                    var e1 = B1 - A1;
                    var u1 = Vector2.Dot(e1, B1 - Q);

                    // Is the circle in Region AB of the previous edge?
                    if (u1 > 0.0f)
                    {
                        return;
                    }
                }

                cf.IndexA                                = 0;
                cf.TypeA                                 = ContactFeatureType.Vertex;
                manifold.PointCount                      = 1;
                manifold.Type                            = ManifoldType.Circles;
                manifold.LocalNormal                     = Vector2.zero;
                manifold.LocalPoint                      = P1;
                manifold.Points.Value0.Id.Key            = 0;
                manifold.Points.Value0.Id.ContactFeature = cf;
                manifold.Points.Value0.LocalPoint        = circleB.Position;
                return;
            }

            // Region B
            if (u <= 0.0f)
            {
                var P2  = B;
                var d2  = Q - P2;
                var dd2 = Vector2.Dot(d2, d2);
                if (dd2 > radius * radius)
                {
                    return;
                }

                // Is there an edge connected to B?
                if (edgeA.HasVertex3)
                {
                    var B2 = edgeA.Vertex3;
                    var A2 = B;
                    var e2 = B2 - A2;
                    var v2 = Vector2.Dot(e2, Q - A2);

                    // Is the circle in Region AB of the next edge?
                    if (v2 > 0.0f)
                    {
                        return;
                    }
                }

                cf.IndexA                                = 1;
                cf.TypeA                                 = (byte)ContactFeatureType.Vertex;
                manifold.PointCount                      = 1;
                manifold.Type                            = ManifoldType.Circles;
                manifold.LocalNormal                     = Vector2.zero;
                manifold.LocalPoint                      = P2;
                manifold.Points.Value0.Id.Key            = 0;
                manifold.Points.Value0.Id.ContactFeature = cf;
                manifold.Points.Value0.LocalPoint        = circleB.Position;
                return;
            }

            // Region AB
            var den = Vector2.Dot(e, e);

            Debug.Assert(den > 0.0f);
            var P  = 1.0f / den * (u * A + v * B);
            var d  = Q - P;
            var dd = Vector2.Dot(d, d);

            if (dd > radius * radius)
            {
                return;
            }

            var n = new Vector2(-e.y, e.x);

            if (Vector2.Dot(n, Q - A) < 0.0f)
            {
                n = new Vector2(-n.x, -n.y);
            }
            n.Normalize();

            cf.IndexA                                = 0;
            cf.TypeA                                 = ContactFeatureType.Face;
            manifold.PointCount                      = 1;
            manifold.Type                            = ManifoldType.FaceA;
            manifold.LocalNormal                     = n;
            manifold.LocalPoint                      = A;
            manifold.Points.Value0.Id.Key            = 0;
            manifold.Points.Value0.Id.ContactFeature = cf;
            manifold.Points.Value0.LocalPoint        = circleB.Position;
        }
コード例 #49
0
        /// <summary>
        /// 创建一次一定要同步一次
        /// </summary>
        /// <param name="a">释放者unit Id</param>
        /// <param name="b">碰撞关系数据载体Id(Excel表中的)</param>
        /// <param name="c">碰撞关系数据载体中的Node的Id</param>
        /// <param name="d">目标行为树数据载体Id(Excel表中的)</param>
        public override void Run(long a, int b, long c, int d)
        {
            Unit            unit            = UnitComponent.Instance.Get(a);
            ConfigComponent configComponent = Game.Scene.GetComponent <ConfigComponent>();

            B2S_ColliderComponent colliderComponent = UnitFactory
                                                      .CreateColliderUnit(unit, configComponent.Get <Server_B2SCollisionRelationConfig>(b).B2S_CollisionRelationId, c)
                                                      .GetComponent <B2S_ColliderComponent>();

            //这里直接默认以英雄当前位置作为碰撞体生成的位置,如需提前指定位置,请在抛事件那里传参
            colliderComponent.SyncBody();
            //Log.Info("生成技能碰撞体");

            //根据传过来的行为树Id来给这个碰撞Unit加上行为树
            NP_RuntimeTreeFactory.CreateSkillNpRuntimeTree(colliderComponent.Entity as Unit,
                                                           configComponent.Get <Server_SkillCanvasConfig>(d).NPBehaveId, configComponent.Get <Server_SkillCanvasConfig>(d).BelongToSkillId)
            .Start();

            //下面这一部分是Debug用的,稳定后请去掉
            {
                //广播碰撞体信息
                foreach (var VARIABLE in colliderComponent.Body.FixtureList)
                {
                    switch (VARIABLE.ShapeType)
                    {
                    case ShapeType.Polygon:     //多边形
                        M2C_B2S_Debugger_Polygon test = new M2C_B2S_Debugger_Polygon()
                        {
                            Id = unit.Id, SustainTime = 2000,
                        };
                        foreach (var VARIABLE1 in ((PolygonShape)VARIABLE.Shape).Vertices)
                        {
                            Vector2 worldPoint = colliderComponent.Body.GetWorldPoint(VARIABLE1);
                            test.Vects.Add(new M2C_B2S_VectorBase()
                            {
                                X = worldPoint.X, Y = worldPoint.Y
                            });
                        }

                        MessageHelper.Broadcast(test);
                        break;

                    case ShapeType.Circle:     //圆形
                        CircleShape             myShape = (CircleShape)VARIABLE.Shape;
                        M2C_B2S_Debugger_Circle test1   = new M2C_B2S_Debugger_Circle()
                        {
                            Id          = unit.Id,
                            SustainTime = 2000,
                            Radius      = myShape.Radius,
                            Pos         = new M2C_B2S_VectorBase()
                            {
                                X = colliderComponent.Body.GetWorldPoint(myShape.Position).X,
                                Y = colliderComponent.Body.GetWorldPoint(myShape.Position).Y
                            },
                        };
                        MessageHelper.Broadcast(test1);
                        //Log.Info($"是圆形,并且已经朝客户端发送绘制数据,半径为{myShape.Radius}");
                        break;
                    }
                }
            }
        }
コード例 #50
0
        static bool collideCircles(CircleShape circleA, ref FSTransform firstTransform, CircleShape circleB, ref FSTransform secondTransform, out FSCollisionResult result)
        {
            result = new FSCollisionResult();
            Collision.collideCircles(ref _manifold, circleA, ref firstTransform, circleB, ref secondTransform);
            if (_manifold.pointCount > 0)
            {
                // this is essentically directly from ContactSolver.WorldManifold.Initialize. To avoid doing the extra math twice we duplicate this code
                // here because it doesnt return some values we need to calculate separation
                var pointA = MathUtils.mul(ref firstTransform, _manifold.localPoint);
                var pointB = MathUtils.mul(ref secondTransform, _manifold.points[0].localPoint);

                result.normal = pointA - pointB;
                Vector2Ext.normalize(ref result.normal);

                var cA = pointA - circleA.radius * result.normal;
                var cB = pointB + circleB.radius * result.normal;
                result.point  = 0.5f * (cA + cB);
                result.point *= FSConvert.simToDisplay;

                var separation = Vector2.Dot(pointA - pointB, result.normal) - circleA.radius - circleB.radius;
                result.minimumTranslationVector = result.normal * Math.Abs(separation);

                                #if DEBUG_FSCOLLISIONS
                Debug.drawPixel(result.point, 5, Color.Red, 0.2f);
                Debug.drawLine(result.point, result.point + result.normal * 20, Color.Yellow, 0.2f);
                                #endif

                return(true);
            }

            return(false);
        }
コード例 #51
0
ファイル: TheoJansen.cs プロジェクト: GretelF/squircle
        TheoJansen()
        {
            _offset = new Vector2(0.0f, 8.0f);
            _motorSpeed = 2.0f;
            _motorOn = true;
            Vector2 pivot = new Vector2(0.0f, 0.8f);

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

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

                shape.SetAsEdge(new Vector2(-50.0f, 0.0f), new Vector2(-50.0f, 10.0f));
                ground.CreateFixture(shape, 0.0f);

                shape.SetAsEdge(new Vector2(50.0f, 0.0f), new Vector2(50.0f, 10.0f));
                ground.CreateFixture(shape, 0.0f);
            }

            // Balls
            for (int i = 0; i < 40; ++i)
            {
                CircleShape shape = new CircleShape();
                shape._radius = 0.25f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType.Dynamic;
                bd.position = new Vector2(-40.0f + 2.0f * i, 0.5f);

                Body body = _world.CreateBody(bd);
                body.CreateFixture(shape, 1.0f);
            }

            // Chassis
            {
                PolygonShape shape = new PolygonShape();
                shape.SetAsBox(2.5f, 1.0f);

                FixtureDef sd = new FixtureDef();
                sd.density = 1.0f;
                sd.shape = shape;
                sd.filter.groupIndex = -1;
                BodyDef bd = new BodyDef();
                bd.type = BodyType.Dynamic;
                bd.position = pivot + _offset;
                _chassis = _world.CreateBody(bd);
                _chassis.CreateFixture(sd);
            }

            {
                CircleShape shape = new CircleShape();
                shape._radius = 1.6f;

                FixtureDef sd = new FixtureDef();
                sd.density = 1.0f;
                sd.shape = shape;
                sd.filter.groupIndex = -1;
                BodyDef bd = new BodyDef();
                bd.type = BodyType.Dynamic;
                bd.position = pivot + _offset;
                _wheel = _world.CreateBody(bd);
                _wheel.CreateFixture(sd);
            }

            {
                RevoluteJointDef jd = new RevoluteJointDef();
                jd.Initialize(_wheel, _chassis, pivot + _offset);
                jd.collideConnected = false;
                jd.motorSpeed = _motorSpeed;
                jd.maxMotorTorque = 400.0f;
                jd.enableMotor = _motorOn;
                _motorJoint = (RevoluteJoint)_world.CreateJoint(jd);
            }

            Vector2 wheelAnchor;

            wheelAnchor = pivot + new Vector2(0.0f, -0.8f);

            CreateLeg(-1.0f, wheelAnchor);
            CreateLeg(1.0f, wheelAnchor);

            _wheel.SetTransform(_wheel.GetPosition(), 120.0f * (float)Settings.b2_pi / 180.0f);
            CreateLeg(-1.0f, wheelAnchor);
            CreateLeg(1.0f, wheelAnchor);

            _wheel.SetTransform(_wheel.GetPosition(), -120.0f * (float)Settings.b2_pi / 180.0f);
            CreateLeg(-1.0f, wheelAnchor);
            CreateLeg(1.0f, wheelAnchor);
        }
コード例 #52
0
ファイル: Cantilever.cs プロジェクト: CloneDeath/Box2D.Net
        Cantilever()
        {
            Body ground = null;

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

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

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

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

                WeldJointDef jd = new WeldJointDef();

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

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

                    prevBody = body;
                }
            }

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

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

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

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

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

                    prevBody = body;
                }
            }

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

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

                WeldJointDef jd = new WeldJointDef();

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

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

                    prevBody = body;
                }
            }

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

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

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

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

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

                    prevBody = body;
                }
            }

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

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

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

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

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

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

                BodyDef bd = new BodyDef();
                bd.type = BodyType._dynamicBody;
                bd.Position.Set(-6.0f + 6.0f * i, 10.0f);
                Body body = m_world.CreateBody(bd);
                body.CreateFixture(fd);
            }
        }
コード例 #53
0
ファイル: VerticalStack.cs プロジェクト: GretelF/squircle
        public override void Keyboard(KeyboardState state, KeyboardState oldState)
        {
            if (state.IsKeyDown(Keys.OemComma) && oldState.IsKeyUp(Keys.OemComma))
            {
                if (_bullet != null)
                {
                    _world.DestroyBody(_bullet);
                    _bullet = null;
                }

                {
                    CircleShape shape = new CircleShape();
                    shape._radius = 0.25f;

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

                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.Dynamic;
                    bd.bullet = true;
                    bd.position = new Vector2(-31.0f, 5.0f);

                    _bullet = _world.CreateBody(bd);
                    _bullet.CreateFixture(fd);

                    _bullet.SetLinearVelocity(new Vector2(400.0f, 0.0f));
                }
            }
        }
コード例 #54
0
        BridgeTest()
        {
            Body ground;
            {
                ground = new Body(World);

                EdgeShape shape = new EdgeShape(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                ground.CreateFixture(shape);
            }
            {
                Vertices     box   = PolygonTools.CreateRectangle(0.5f, 0.125f);
                PolygonShape shape = new PolygonShape(box, 20);

                Body prevBody = ground;
                for (int i = 0; i < Count; ++i)
                {
                    Body body = BodyFactory.CreateBody(World);
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(-14.5f + 1.0f * i, 5.0f);

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

                    Vector2       anchor = new Vector2(-15f + 1.0f * i, 5.0f);
                    RevoluteJoint jd     = new RevoluteJoint(prevBody, body, anchor, true);
                    World.AddJoint(jd);

                    prevBody = body;
                }

                Vector2       anchor2 = new Vector2(-15.0f + 1.0f * Count, 5.0f);
                RevoluteJoint jd2     = new RevoluteJoint(ground, prevBody, anchor2, true);
                World.AddJoint(jd2);
            }

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

            for (int i = 0; i < 2; ++i)
            {
                PolygonShape shape = new PolygonShape(vertices, 1);

                Body body = BodyFactory.CreateBody(World);
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(-8.0f + 8.0f * i, 12.0f);

                body.CreateFixture(shape);
            }

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

                Body body = BodyFactory.CreateBody(World);
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(-6.0f + 6.0f * i, 10.0f);

                body.CreateFixture(shape);
            }
        }
コード例 #55
0
ファイル: Cantilever.cs プロジェクト: n1ckd0r/Box2D.XNA
        public Cantilever()
        {
            Body ground = null;
		    {
                BodyDef bd = new BodyDef();
			    ground = _world.CreateBody(bd);

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

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

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

                WeldJointDef jd = new WeldJointDef();

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

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

				    prevBody = body;
			    }
		    }

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

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

                WeldJointDef jd = new WeldJointDef();

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

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

				    prevBody = body;
			    }
		    }

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

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

                WeldJointDef jd = new WeldJointDef();

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

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

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

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

                WeldJointDef jd = new WeldJointDef();

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

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

				    prevBody = body;
			    }
		    }

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

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

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

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

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

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

                BodyDef bd = new BodyDef();
			    bd.type = BodyType.Dynamic;
			    bd.position = new Vector2(-6.0f + 6.0f * i, 10.0f);
			    Body body = _world.CreateBody(bd);
			    body.CreateFixture(fd);
		    }
        }
コード例 #56
0
        public StarMenuControl(Star objStar)
        {
            BodyComponentList = new List <Drawable>();

            float    fltStarRad     = objStar.Radius;
            Vector2f vecStarCenter  = objStar.Position;
            float    fltStarCenterX = vecStarCenter.X + fltStarRad;
            float    fltStarCenterY = vecStarCenter.Y + fltStarRad;

            CircleShape objCenterCirc = new CircleShape(fltStarRad + 10);

            objCenterCirc.OutlineColor     = Color.Blue;
            objCenterCirc.OutlineThickness = 2;
            objCenterCirc.FillColor        = Color.Transparent;

            float fltCenterCircX = fltStarCenterX - objCenterCirc.Radius;
            float fltCenterCircY = fltStarCenterY - objCenterCirc.Radius;

            objCenterCirc.Position = new Vector2f(fltCenterCircX, fltCenterCircY);
            this.BodyComponentList.Add(objCenterCirc);

            float fltCenterCircOffset = fltStarRad + 10;
            float fltHorizontalBarX   = 50;

            float    fltLineOffsetX = fltCenterCircOffset + fltHorizontalBarX;
            Vector2f vecVertex1     = new Vector2f(fltStarCenterX, fltStarCenterY - fltCenterCircOffset);
            Vector2f vecVertex2     = new Vector2f(fltStarCenterX - fltLineOffsetX, fltStarCenterY - 100);
            Vector2f vecVertex3     = new Vector2f(fltStarCenterX - fltLineOffsetX, fltStarCenterY + 100);
            Vector2f vecVertex4     = new Vector2f(fltStarCenterX, fltStarCenterY + fltCenterCircOffset);

            HorizontalLine1 = new Vertex[]
            {
                new Vertex(vecVertex1, Color.Blue),
                new Vertex(vecVertex2, Color.Blue),
                new Vertex(vecVertex3, Color.Blue),
                new Vertex(vecVertex4, Color.Blue)
            };

            float          fltRecHeight = 200;
            RectangleShape recDetails   = new RectangleShape(new Vector2f(200, fltRecHeight));

            recDetails.FillColor        = new Color(50, 170, 255, 50);
            recDetails.OutlineColor     = Color.Blue;
            recDetails.OutlineThickness = 2;

            recDetails.Position = new Vector2f(vecVertex2.X - 200, vecVertex2.Y);
            BodyComponentList.Add(recDetails);
            int intOrbitalCount = 0;

            if (objStar.ChildOrbits != null)
            {
                intOrbitalCount = objStar.ChildOrbits.Length;
            }

            string strText       = $"Name: {objStar.SystemName}\r\nType: {objStar.StarType}\r\nMajor Orbitals: {intOrbitalCount}";
            Text   objDetailText = new Text(strText, new Font(Engine.Instance.fontStream));

            objDetailText.Position      = new Vector2f(recDetails.Position.X + 5, recDetails.Position.Y + 5);
            objDetailText.CharacterSize = 11;
            BodyComponentList.Add(objDetailText);
        }
コード例 #57
0
ファイル: Raycast.cs プロジェクト: n1ckd0r/Box2D.XNA
        public RayCast()
        {
            // Ground body
		    {
			    BodyDef bd = new BodyDef();
			    Body ground = _world.CreateBody(bd);

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

		    {
			    var vertices = new Vector2[3];
			    vertices[0] = new Vector2(-0.5f, 0.0f);
			    vertices[1] = new Vector2(0.5f, 0.0f);
			    vertices[2] = new Vector2(0.0f, 1.5f);
                _polygons[0] = new PolygonShape();
			    _polygons[0].Set(vertices, 3);
		    }

		    {
			    var vertices2 = new Vector2[3];
			    vertices2[0] = new Vector2(-0.1f, 0.0f);
			    vertices2[1] = new Vector2(0.1f, 0.0f);
			    vertices2[2] = new Vector2(0.0f, 1.5f);
                _polygons[1] = new PolygonShape();
			    _polygons[1].Set(vertices2, 3);
		    }

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

			    var vertices3 = new Vector2[8];
			    vertices3[0] = new Vector2(0.5f * s, 0.0f);
			    vertices3[1] = new Vector2(0.5f * w, b);
			    vertices3[2] = new Vector2(0.5f * w, b + s);
			    vertices3[3] = new Vector2(0.5f * s, w);
			    vertices3[4] = new Vector2(-0.5f * s, w);
			    vertices3[5] = new Vector2(-0.5f * w, b + s);
			    vertices3[6] = new Vector2(-0.5f * w, b);
			    vertices3[7] = new Vector2(-0.5f * s, 0.0f);
                _polygons[2] = new PolygonShape();
			    _polygons[2].Set(vertices3, 8);
		    }

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

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

		    _bodyIndex = 0;
		    _angle = 0.0f;
            _mode = RayCastMode.Closest;
        }
コード例 #58
0
        private CollisionProcessingTest()
        {
            //Ground
            BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));

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

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

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

            PolygonShape polygon = new PolygonShape(vertices, 1);

            Body body1 = BodyFactory.CreateBody(World);

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

            Fixture fixture = body1.CreateFixture(polygon);

            fixture.OnCollision += OnCollision;

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

            Body body2 = BodyFactory.CreateBody(World);

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

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

            polygon.Vertices = smallBox;

            Body body3 = BodyFactory.CreateBody(World);

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

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

            polygon.Vertices = largeBox;

            Body body4 = BodyFactory.CreateBody(World);

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

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

            Body body5 = BodyFactory.CreateBody(World);

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

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

            Body body6 = BodyFactory.CreateBody(World);

            body6.BodyType       = BodyType.Dynamic;
            body6.Position       = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi));
            fixture              = body6.CreateFixture(circle);
            fixture.OnCollision += OnCollision;
        }
コード例 #59
0
ファイル: Test.cs プロジェクト: n1ckd0r/Box2D.XNA
	    public void LaunchBomb(Vector2 position, Vector2 velocity)
        {
            if (_bomb != null)
	        {
		        _world.DestroyBody(_bomb);
		        _bomb = null;
	        }

	        BodyDef bd = new BodyDef();
	        bd.type = BodyType.Dynamic;
	        bd.position = position;
        	
	        bd.bullet = true;
	        _bomb = _world.CreateBody(bd);
	        _bomb.SetLinearVelocity(velocity);

            CircleShape circle = new CircleShape();
	        circle._radius = 0.3f;

            FixtureDef fd = new FixtureDef();
	        fd.shape = circle;
	        fd.density = 20.0f;
	        fd.restitution = 0.0f;
        	
	        Vector2 minV = position - new Vector2(0.3f,0.3f);
	        Vector2 maxV = position + new Vector2(0.3f,0.3f);
        	
	        AABB aabb;
	        aabb.lowerBound = minV;
	        aabb.upperBound = maxV;

	        _bomb.CreateFixture(fd);
        }
コード例 #60
0
        private CantileverTest()
        {
            Body ground = World.CreateEdge(new Vector2(-40, 0), new Vector2(40, 0));

            {
                PolygonShape shape = new PolygonShape(20);
                shape.Vertices = PolygonTools.CreateRectangle(0.5f, 0.125f);

                Body prevBody = ground;
                for (int i = 0; i < Count; ++i)
                {
                    Body body = World.CreateBody();
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(-14.5f + 1.0f * i, 5.0f);
                    body.CreateFixture(shape);

                    Vector2   anchor = new Vector2(-15.0f + 1.0f * i, 5.0f);
                    WeldJoint jd     = new WeldJoint(prevBody, body, anchor, anchor, true);
                    World.Add(jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape(20f);
                shape.Vertices = PolygonTools.CreateRectangle(1f, 0.125f);

                Body prevBody = ground;
                for (int i = 0; i < 3; ++i)
                {
                    Body body = World.CreateBody();
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(-14.0f + 2.0f * i, 15.0f);
                    body.CreateFixture(shape);

                    Vector2   anchor = new Vector2(-15.0f + 2.0f * i, 15.0f);
                    WeldJoint jd     = new WeldJoint(prevBody, body, anchor, anchor, true);
                    jd.FrequencyHz  = 5.0f;
                    jd.DampingRatio = 0.7f;
                    World.Add(jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape(20f);
                shape.Vertices = PolygonTools.CreateRectangle(0.5f, 0.125f);

                Body prevBody = ground;
                for (int i = 0; i < Count; ++i)
                {
                    Body body = World.CreateBody();
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(-4.5f + 1.0f * i, 5.0f);

                    body.CreateFixture(shape);

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

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape(20f);
                shape.Vertices = PolygonTools.CreateRectangle(0.5f, 0.125f);

                Body prevBody = ground;
                for (int i = 0; i < Count; ++i)
                {
                    Body body = World.CreateBody();
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(5.5f + 1.0f * i, 10.0f);

                    body.CreateFixture(shape);

                    if (i > 0)
                    {
                        Vector2   anchor = new Vector2(5.0f + 1.0f * i, 10.0f);
                        WeldJoint jd     = new WeldJoint(prevBody, body, anchor, anchor, true);
                        jd.FrequencyHz  = 8.0f;
                        jd.DampingRatio = 0.7f;

                        World.Add(jd);
                    }

                    prevBody = body;
                }
            }

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

            for (int i = 0; i < 2; ++i)
            {
                PolygonShape shape = new PolygonShape(vertices, 1);

                Body body = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(-8.0f + 8.0f * i, 12.0f);

                body.CreateFixture(shape);
            }

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

                Body body = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(-6.0f + 6.0f * i, 10.0f);

                body.CreateFixture(shape);
            }
        }