/**
         * Creates a new circle object.
         */
        public CircleObject(World world, string texturename, float density, float friction, float restitution,float myScale)
            : base(world)
        {
            textureName = texturename;

            // Initialize
            this.texture = GameEngine.TextureList[texturename];
            TextureFilename = texturename;

            Width = texture.Width * myScale;
            Height = Width;

            scale = myScale;

            // Determine dimension
            float radius = (float)texture.Width / (2 * CASSWorld.SCALE) * scale;

            // Create collision shape
            CircleDef shape = new CircleDef();
            shape.Radius = radius;
            shape.Density = density;
            shape.Friction = friction;
            shape.Restitution = restitution;
            shapes.Add(shape);
        }
Example #2
0
        public (Body, Drawable) ToBody(World world)
        {
            var circleBody = world.CreateBody(new BodyDef {
                Position      = new Vec2(PosX, PosY),
                FixedRotation = true,
            });
            var circleDef = new CircleDef
            {
                Radius   = Radius,
                Density  = Density,
                Friction = Friction,
            };

            circleBody.CreateShape(circleDef);
            var drawable = new CircleDrawable(
                circleBody,
                System.Windows.Media.Color.FromRgb(
                    (byte)(Friction * 255.0f),
                    80,
                    (byte)(Density * 255.0f)),
                circleDef);

            circleBody.SetMassFromShapes();

            return(circleBody, drawable);
        }
Example #3
0
        public void AddCircle(float x, float y, float radius, float angle, float density,
                              float friction, float restetution, float mass, bool IsBullet = true,
                              bool IsSensor = false, bool AllowSleep = false, short group_index = 1, Object userDate = null)
        {
            BodyDef bDef = new BodyDef();

            bDef.Position.Set(x / metric, y / metric);
            bDef.Angle      = angle;
            bDef.AllowSleep = AllowSleep;
            bDef.IsBullet   = IsBullet;

            CircleDef pDef = new CircleDef();

            pDef.Restitution       = restetution;
            pDef.Friction          = friction;
            pDef.Density           = density;
            pDef.Radius            = radius / metric;
            pDef.Filter.GroupIndex = group_index;
            pDef.IsSensor          = IsSensor;

            Body body = world.CreateBody(bDef);

            body.CreateShape(pDef);
            body.SetMassFromShapes();

            float    Inertia = body.GetInertia();
            MassData md      = new MassData();

            md.I    = Inertia;
            md.Mass = mass;
            body.SetMass(md);
        }
Example #4
0
        public VaryingRestitution()
        {
            {
                PolygonDef sd = new PolygonDef();
                sd.SetAsBox(50.0f, 10.0f);

                BodyDef bd = new BodyDef();
                bd.Position.Set(0.0f, -10.0f);

                Body ground = _world.CreateBody(bd);
                ground.CreateShape(sd);
            }

            {
                CircleDef sd = new CircleDef();
                sd.Radius  = 1.0f;
                sd.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.Position.Set(-10.0f + 3.0f * i, 20.0f);

                    Body body = _world.CreateBody(bd);

                    sd.Restitution = restitution[i];
                    body.CreateShape(sd);
                    body.SetMassFromShapes();
                }
            }
        }
Example #5
0
        public virtual void SetupPhysics(World world)
        {
            float angle = Object.EulerAngles.z;

            angle = angle * Mathf.Deg2Rad;

            bodyDef = new BodyDef();
            bodyDef.Position.Set(Object.Position.x, Object.Position.y);
            bodyDef.Angle = angle;

            circleDef             = new CircleDef();
            circleDef.Restitution = 0.2f;
            circleDef.Friction    = 0.3f;
            circleDef.Density     = 0.5f;
            circleDef.Radius      = Mathf.Max(Object.Size.x / 3f, Object.Size.y / 3f, Object.Size.z / 3f);

            body = world.CreateBody(bodyDef);

            while (body == null)
            {
                body = world.CreateBody(bodyDef);
            }

            body.CreateShape(circleDef);
            body.SetMassFromShapes();
            body.SetUserData(this);

            this.world = world;
        }
 public void Reset()
 {
     if (b2Body != null)
     {
         refWorld.B2World.DestroyBody(b2Body);
         b2Body.Dispose();
     }
     b2BodyDef               = new BodyDef();
     b2CircleDef             = new CircleDef();
     b2BodyDef.Angle         = Angle / 180.0f * 3.14f;
     b2BodyDef.Position      = PhysicalConvert.Tob2Vector(Position);
     b2CircleDef.Radius      = PhysicalConvert.Tob2Single(OuterDiameter / 2.0f);
     b2CircleDef.Density     = Density;
     b2CircleDef.Restitution = Restitution;
     b2CircleDef.Friction    = Friction;
     b2CircleDef.Filter      = new FilterData()
     {
         GroupIndex   = GroupIndex,
         CategoryBits = CategoryBits,
         MaskBits     = MaskBits
     };
     b2Body = refWorld.B2World.CreateBody(b2BodyDef);
     b2Body.CreateFixture(b2CircleDef);
     if (physicalShapeType == PhysicalShapeType.Dynamic)
     {
         b2Body.SetMassFromShapes();
     }
 }
Example #7
0
        public override void Keyboard(System.Windows.Forms.Keys key)
        {
            switch (key)
            {
            case System.Windows.Forms.Keys.C:
                if (_shape2 == null)
                {
                    CircleDef sd = new CircleDef();
                    sd.Radius  = 3.0f;
                    sd.Density = 10.0f;
                    sd.LocalPosition.Set(0.5f, -4.0f);
                    _shape2 = _body.CreateShape(sd);
                    _body.SetMassFromShapes();
                    _body.WakeUp();
                }
                break;

            case System.Windows.Forms.Keys.D:
                if (_shape2 != null)
                {
                    _body.DestroyShape(_shape2);
                    _shape2 = null;
                    _body.SetMassFromShapes();
                    _body.WakeUp();
                }
                break;
            }
        }
Example #8
0
        public override void Keyboard(System.Windows.Forms.Keys key)
        {
            switch (key)
            {
            case System.Windows.Forms.Keys.B:
                if (_bullet != null)
                {
                    _world.DestroyBody(_bullet);
                    _bullet = null;
                }
                {
                    CircleDef sd = new CircleDef();
                    sd.Density     = 20.0f;
                    sd.Radius      = 0.25f;
                    sd.Restitution = 0.05f;

                    BodyDef bd = new BodyDef();
                    bd.IsBullet = true;
                    bd.Position.Set(-31.0f, 5.0f);

                    _bullet = _world.CreateBody(bd);
                    _bullet.CreateFixture(sd);
                    _bullet.SetMassFromShapes();

                    _bullet.SetLinearVelocity(new Vec2(400.0f, 0.0f));
                }
                break;
            }
        }
Example #9
0
        void LaunchBomb()
        {
            if (bomb != null)
            {
                world.DestroyBody(bomb);
                bomb = null;
            }

            BodyDef bd = new BodyDef();

            bd.BodyType   = BodyType.e_dynamicBody;
            bd.AllowSleep = true;
            Random rand = new Random();

            bd.Position         = new Vector((float)rand.NextDouble() * 30 - 15, 30.0f);
            bd.IsBullet         = true;
            bomb                = world.CreateBody(bd);
            bomb.LinearVelocity = bd.Position * -5;

            CircleDef sd = new CircleDef();

            sd.Radius      = 0.3f;
            sd.Density     = 20.0f;
            sd.Restitution = 0.1f;
            bomb.CreateShape(sd);
            bomb.SetMassFromShapes();
        }
Example #10
0
		public override void Keyboard(System.Windows.Forms.Keys key)
		{
			switch (key)
			{
				case System.Windows.Forms.Keys.C:
					if (_shape2 == null)
					{
						CircleDef sd = new CircleDef();
						sd.Radius = 3.0f;
						sd.Density = 10.0f;
						sd.LocalPosition.Set(0.5f, -4.0f);
						_shape2 = _body.CreateShape(sd);
						_body.SetMassFromShapes();
						_body.WakeUp();
					}
					break;

				case System.Windows.Forms.Keys.D:
					if (_shape2 != null)
					{
						_body.DestroyShape(_shape2);
						_shape2 = null;
						_body.SetMassFromShapes();
						_body.WakeUp();
					}
					break;
			}
		}
Example #11
0
        public void LaunchBomb()
        {
            if (_bomb != null)
            {
                _world.DestroyBody(_bomb);
                _bomb = null;
            }

            BodyDef bd = new BodyDef();

            bd.AllowSleep = true;
            bd.Position.Set(Box2DNet.Common.Math.Random(-15.0f, 15.0f), 30.0f);
            bd.IsBullet = true;
            _bomb       = _world.CreateBody(bd);
            _bomb.SetLinearVelocity(-5.0f * bd.Position);

            CircleDef sd = new CircleDef();

            sd.Radius      = 0.3f;
            sd.Density     = 20.0f;
            sd.Restitution = 0.1f;
            _bomb.CreateFixture(sd);

            _bomb.SetMassFromShapes();
        }
Example #12
0
		public VaryingRestitution()
		{
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);

				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);

				Body ground = _world.CreateBody(bd);
				ground.CreateShape(sd);
			}

			{
				CircleDef sd = new CircleDef();
				sd.Radius = 1.0f;
				sd.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.Position.Set(-10.0f + 3.0f * i, 20.0f);

					Body body = _world.CreateBody(bd);

					sd.Restitution = restitution[i];
					body.CreateShape(sd);
					body.SetMassFromShapes();
				}
			}
		}
Example #13
0
        public MyModel3D AddCircle(float x, float y, float radius, float angle, float density,
                                   float friction, float restetution)
        {
            MyModel3D model = new MyModel3D(models, x, -y, 0, Environment.CurrentDirectory + "\\" + PATH_CIRCLE, new System.Windows.Size(radius * 2, radius * 2));

            BodyDef bDef = new BodyDef();

            bDef.Position.Set(x, y);
            bDef.Angle = angle;

            CircleDef pDef = new CircleDef();

            pDef.Restitution = restetution;
            pDef.Friction    = friction;
            pDef.Density     = density;
            pDef.Radius      = radius;

            Body body = world.CreateBody(bDef);

            body.CreateShape(pDef);
            body.SetMassFromShapes();

            body.SetUserData(model);

            return(model);
        }
Example #14
0
        public Player(World world, Vector2 midPoint, PlayerController controller)
        {
            // sprite for rendering
            sprite        = new AnimatedSprite(new Texture("Textures/Character/idle_00.png"), 0.05F, 20, new Vector2i(62, 50));
            sprite.Origin = ((Vector2)sprite.spriteSize) / 2F;
            sprite.Scale  = Vector2.One * 1.4F;
            sprite.restartAnimation(Program.gameTime);

            // controller
            this.controller = controller;

            // set properties
            this.size = new Vector2(1F, 1F);

            // Physics init
            BodyDef bodydef = new BodyDef();

            bodydef.Position.Set(midPoint.X, midPoint.Y);
            body = world.CreateBody(bodydef);

            CircleDef circleDef = new CircleDef();

            circleDef.Radius      = 0.5F;
            circleDef.Density     = 1.0F;
            circleDef.Friction    = 1.0F;
            circleDef.Restitution = 0.0F;

            body.SetUserData(this);
            body.CreateShape(circleDef);
            body.SetMassFromShapes();

            // weapon
            weapon = new Weapon(WeaponType.Gatling);
        }
Example #15
0
        private static ShapeDef CreateBaseCircleDef(PhysicsSetups setups, SizeF size)
        {
            ShapeDef circleShape = new CircleDef();

            (circleShape as CircleDef).Radius = size.Width / 2;
            circleShape.Restitution           = setups.restetution;
            circleShape.Friction = setups.friction;
            circleShape.Density  = setups.density;

            return(circleShape);
        }
Example #16
0
        public static void DefineBody(EntityID entity, Registry registry, PhysicsWorld2D physicsWorld, TransformComponent transform)
        {
            var     rigidBody = registry.GetComponent <RigidBody2D>(entity);
            BodyDef bodyDef   = new BodyDef();

            bodyDef.Position       = Util.UtilFunctions.ToVec2(transform.Position / PhysicsWorld2D.PixelToMeter);
            bodyDef.Angle          = transform.Rotation.Z;
            bodyDef.AngularDamping = rigidBody.AngularDamping;
            bodyDef.LinearDamping  = rigidBody.LinearDamping;
            bodyDef.FixedRotation  = rigidBody.FixedRotation;
            bodyDef.IsSleeping     = false;
            bodyDef.IsBullet       = rigidBody.IsBullet;
            Body       body     = physicsWorld.World.CreateBody(bodyDef);
            FixtureDef shapeDef = null;

            if (registry.TryGetComponent(entity, out BoxCollider box))
            {
                shapeDef = new PolygonDef();
                ((PolygonDef)shapeDef).SetAsBox((box.Width / 2) / PhysicsWorld2D.PixelToMeter, (box.Height / 2) / PhysicsWorld2D.PixelToMeter);
            }
            else if (registry.TryGetComponent(entity, out CircleCollider circle))
            {
                shapeDef = new CircleDef();
                ((CircleDef)shapeDef).Radius = circle.Radius;
            }

            shapeDef.Density     = rigidBody.Density;
            shapeDef.Friction    = rigidBody.Friction;
            shapeDef.Restitution = rigidBody.Restitution;

            body.CreateFixture(shapeDef);

            if (rigidBody.Mass > 0)
            {
                MassData massData = new MassData();
                massData.Mass   = rigidBody.Mass;
                massData.Center = body.GetLocalCenter();
                body.SetMass(massData);
            }
            else
            {
                body.SetMassFromShapes();
            }
            body.SetUserData(entity);
            if (rigidBody.StartVelocity != Vector2.Zero)
            {
                body.SetLinearVelocity(Util.UtilFunctions.ToVec2(rigidBody.StartVelocity));
            }
            rigidBody.SetBody(body);
        }
Example #17
0
        /// <summary>
        /// Creates a circle geometry and attaches it to a body.
        /// </summary>
        /// <param name="body">Body to attach circle too.</param>
        /// <param name="radius">Radius of the circle.</param>
        /// <returns></returns>
        public Shape CreateCircleGeom(Body body, float radius)
        {
            CircleDef geomDef = new CircleDef();

            geomDef.Radius = radius;

            // add the shape to the body
            Shape geom = body.CreateShape(geomDef);

            // set the mass from the all the shapes associated with the body
            body.SetMassFromShapes();

            return(geom);
        }
Example #18
0
 protected override void CreatePhysics(World world, float positionX, float positionY, float friction)
 {
     var bodyDef = new BodyDef();
     bodyDef.Position.Set(positionX, positionY);
     bodyDef.LinearDamping = 0.3f;
     bodyDef.AngularDamping = 0.6f;
     var circleDef = new CircleDef();
     circleDef.Density = this.Density;
     circleDef.Radius = this.Radius * 0.5f;
     circleDef.Friction = friction;
     circleDef.Restitution = 0.3f;
     this.body = world.CreateBody(bodyDef);
     this.body.CreateShape(circleDef);
     this.body.SetMassFromShapes();
 }
Example #19
0
        public RigidBody CreateCircleDef(float restetution, float friction, float density,
                                         float radius, short group_index = 1, bool isSensor = false)
        {
            var pDef = new CircleDef();

            pDef.Restitution       = restetution;
            pDef.Friction          = friction;
            pDef.Density           = density;
            pDef.Radius            = radius / PhysicsController.metric;
            pDef.Filter.GroupIndex = group_index;
            pDef.IsSensor          = isSensor;

            _shapeDef = pDef;

            return(this);
        }
        private Body CreatePole(Vec2 basePose, float angle, float radius, float friction, float restitution, float density, ushort layers)
        {
            const float __poleLength = 1f;

            // ==== Create bar. ====
            // Determine position of top of pole with base position of (0, 0), length of 1m and an angle CCW is +ve.
            Vec2 polePosTop    = new Vec2(__poleLength * (float)-SysMath.Sin(angle), __poleLength * (float)SysMath.Cos(angle));
            Vec2 polePosCenter = (polePosTop * 0.5f) + basePose;

            BodyDef bodyDef = new BodyDef();

            bodyDef.Position.Set(polePosCenter.X, polePosCenter.Y);
            bodyDef.Angle = angle;

            // Create body object; The body is also added to the world.
            Body       body     = _world.CreateBody(bodyDef);
            PolygonDef shapeDef = new PolygonDef();

            shapeDef.SetAsBox(radius, __poleLength * 0.5f);
            shapeDef.Friction            = friction;
            shapeDef.Restitution         = restitution;
            shapeDef.Density             = density;
            shapeDef.Filter.MaskBits     = layers;
            shapeDef.Filter.CategoryBits = 0x3;
            body.CreateShape(shapeDef);

            // ==== Place some end caps on the pole. ====
            CircleDef circleDef = new CircleDef();

            circleDef.Radius              = radius;
            circleDef.Friction            = friction;
            circleDef.Restitution         = restitution;
            circleDef.Density             = 0f;
            circleDef.Filter.MaskBits     = layers;
            circleDef.Filter.CategoryBits = 0x3;
            // Top cap.
            circleDef.LocalPosition.Set(0f, __poleLength * 0.5f);
            body.CreateShape(circleDef);

            // Bottom cap.
            circleDef.LocalPosition.Set(0f, -__poleLength * 0.5f);
            body.CreateShape(circleDef);

            body.SetMassFromShapes();
            return(body);
        }
Example #21
0
        public Buoyancy()
        {
            BuoyancyController bc = _bc;

            _world.AddController(bc);

            bc.Offset = 15;
            bc.Normal.Set(0, 1);
            bc.Density     = 2;
            bc.LinearDrag  = 2;
            bc.AngularDrag = 1;

            for (int i = 0; i < 2; ++i)
            {
                PolygonDef sd = new PolygonDef();
                sd.VertexCount = 3;
                sd.Vertices[0].Set(-0.5f, 0.0f);
                sd.Vertices[1].Set(0.5f, 0.0f);
                sd.Vertices[2].Set(0.0f, 1.5f);
                sd.Density = 1.0f;

                BodyDef bd = new BodyDef();
                bd.Position.Set(-8.0f + 8.0f * i, 12.0f);
                Body body = _world.CreateBody(bd);
                body.CreateFixture(sd);
                body.SetMassFromShapes();

                bc.AddBody(body);
            }

            for (int i = 0; i < 3; ++i)
            {
                CircleDef sd = new CircleDef();
                sd.Radius  = 0.5f;
                sd.Density = 1.0f;

                BodyDef bd = new BodyDef();
                bd.Position.Set(-6.0f + 6.0f * i, 10.0f);
                Body body = _world.CreateBody(bd);
                body.CreateFixture(sd);
                body.SetMassFromShapes();

                bc.AddBody(body);
            }
        }
Example #22
0
        BipedTest()
        {
            const float k_restitution = 1.4f;

            {
                BodyDef bd = new BodyDef();
                bd.Position.Set(0.0f, 20.0f);
                Body body = _world.CreateBody(bd);

                PolygonDef sd = new PolygonDef();
                sd.Density     = 0.0f;
                sd.Restitution = k_restitution;

                sd.SetAsBox(0.1f, 10.0f, new Vec2(-10.0f, 0.0f), 0.0f);
                body.CreateShape(sd);

                sd.SetAsBox(0.1f, 10.0f, new Vec2(10.0f, 0.0f), 0.0f);
                body.CreateShape(sd);

                sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, -10.0f), 0.5f * Box2DX.Common.Settings.Pi);
                body.CreateShape(sd);

                sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, 10.0f), -0.5f * Box2DX.Common.Settings.Pi);
                body.CreateShape(sd);
            }

            _biped = new Biped(_world, new Vec2(0.0f, 20.0f));

            for (int i = 0; i < 8; ++i)
            {
                BodyDef bd = new BodyDef();
                bd.Position.Set(5.0f, 20.0f + i);
                bd.IsBullet = true;
                Body body = _world.CreateBody(bd);
                body.SetLinearVelocity(new Vec2(0.0f, -100.0f));
                body.SetAngularVelocity(Box2DX.Common.Math.Random(-50.0f, 50.0f));

                CircleDef sd = new CircleDef();
                sd.Radius      = 0.25f;
                sd.Density     = 15.0f;
                sd.Restitution = k_restitution;
                body.CreateShape(sd);
                body.SetMassFromShapes();
            }
        }
Example #23
0
		BipedTest()
		{
			const float k_restitution = 1.4f;

			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, 20.0f);
				Body body = _world.CreateBody(bd);

				PolygonDef sd = new PolygonDef();
				sd.Density = 0.0f;
				sd.Restitution = k_restitution;

				sd.SetAsBox(0.1f, 10.0f, new Vec2(-10.0f, 0.0f), 0.0f);
				body.CreateShape(sd);

				sd.SetAsBox(0.1f, 10.0f, new Vec2(10.0f, 0.0f), 0.0f);
				body.CreateShape(sd);

				sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, -10.0f), 0.5f * Box2DX.Common.Settings.Pi);
				body.CreateShape(sd);

				sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, 10.0f), -0.5f * Box2DX.Common.Settings.Pi);
				body.CreateShape(sd);
			}

			_biped = new Biped(_world, new Vec2(0.0f, 20.0f));

			for (int i = 0; i < 8; ++i)
			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(5.0f, 20.0f + i);
				bd.IsBullet = true;
				Body body = _world.CreateBody(bd);
				body.SetLinearVelocity(new Vec2(0.0f, -100.0f));
				body.SetAngularVelocity(Box2DX.Common.Math.Random(-50.0f, 50.0f));

				CircleDef sd = new CircleDef();
				sd.Radius = 0.25f;
				sd.Density = 15.0f;
				sd.Restitution = k_restitution;
				body.CreateShape(sd);
				body.SetMassFromShapes();
			}
		}
Example #24
0
		public Buoyancy()
		{
			BuoyancyController bc = _bc;
			_world.AddController(bc);

			bc.offset = 15;
			bc.normal.Set(0, 1);
			bc.density = 2;
			bc.linearDrag = 2;
			bc.angularDrag = 1;

			for (int i = 0; i < 2; ++i)
			{
				PolygonDef sd = new PolygonDef();
				sd.VertexCount = 3;
				sd.Vertices[0].Set(-0.5f, 0.0f);
				sd.Vertices[1].Set(0.5f, 0.0f);
				sd.Vertices[2].Set(0.0f, 1.5f);
				sd.Density = 1.0f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(-8.0f + 8.0f * i, 12.0f);
				Body body = _world.CreateBody(bd);
				body.CreateShape(sd);
				body.SetMassFromShapes();

				bc.AddBody(body);
			}

			for (int i = 0; i < 3; ++i)
			{
				CircleDef sd = new CircleDef();
				sd.Radius = 0.5f;
				sd.Density = 1.0f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(-6.0f + 6.0f * i, 10.0f);
				Body body = _world.CreateBody(bd);
				body.CreateShape(sd);
				body.SetMassFromShapes();

				bc.AddBody(body);
			}
		}
Example #25
0
        private void GenMultiIslands()
        {
            Log.Message("[Map Designer] Island Multispawn");

            outerRadius /= 2;
            innerRadius /= 2;
            //beachSize /= 2;

            List <CircleDef> islandList = new List <CircleDef>();

            islandList.Add(new CircleDef(center, outerRadius));
            CircleDef circle = new CircleDef(center, outerRadius);

            islandList = GenNestedCircles(circle, islandList);

            List <CircleDef> finalIslands = new List <CircleDef>();

            islandList = islandList.OrderByDescending(ci => ci.Radius).ToList();

            foreach (CircleDef c in islandList)
            {
                if (c.Radius > 3)
                {
                    if (c.Center.DistanceToEdge(myMap) >= 15)
                    {
                        List <IntVec3> newCells = HelperMethods.GenCircle(myMap, c.Center, c.Radius);
                        if (!newCells.Intersect(beachCells).Any())
                        {
                            finalIslands.Add(c);
                            beachCells.AddRange(HelperMethods.GenCircle(myMap, c.Center, c.Radius));
                        }
                    }
                }
            }

            foreach (CircleDef f in finalIslands)
            {
                if (f.Radius > beachSize * 2)
                {
                    landCells.AddRange(HelperMethods.GenCircle(myMap, f.Center, f.Radius - beachSize));
                    beachCells = beachCells.Except(HelperMethods.GenCircle(myMap, f.Center, f.Radius - beachSize)).ToList();
                }
            }
        }
Example #26
0
		public Revolute()
		{
			Body ground = null;
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);

				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);
				ground = _world.CreateBody(bd);
				ground.CreateShape(sd);
			}

			{
				CircleDef sd = new CircleDef();
				sd.Radius = 0.5f;
				sd.Density = 5.0f;

				BodyDef bd = new BodyDef();

				RevoluteJointDef rjd = new RevoluteJointDef();

				bd.Position.Set(0.0f, 20.0f);
				Body body = _world.CreateBody(bd);
				body.CreateShape(sd);
				body.SetMassFromShapes();

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

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

				_joint = (RevoluteJoint)_world.CreateJoint(rjd);
			}
		}
Example #27
0
        public Revolute()
        {
            Body ground = null;
            {
                PolygonDef sd = new PolygonDef();
                sd.SetAsBox(50.0f, 10.0f);

                BodyDef bd = new BodyDef();
                bd.Position.Set(0.0f, -10.0f);
                ground = _world.CreateBody(bd);
                ground.CreateFixture(sd);
            }

            {
                CircleDef sd = new CircleDef();
                sd.Radius  = 0.5f;
                sd.Density = 5.0f;

                BodyDef bd = new BodyDef();

                RevoluteJointDef rjd = new RevoluteJointDef();

                bd.Position.Set(0.0f, 20.0f);
                Body body = _world.CreateBody(bd);
                body.CreateFixture(sd);
                body.SetMassFromShapes();

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

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

                _joint = (RevoluteJoint)_world.CreateJoint(rjd);
            }
        }
 /// <summary>
 /// 初期化
 /// </summary>
 /// <param name="shapeType">物理形状タイプ</param>
 /// <param name="world">登録するワールド</param>
 public PhysicalCircleShape(PhysicalShapeType shapeType, PhysicalWorld world)
 {
     density           = 1.0f;
     restitution       = 0.3f;
     base.Angle        = 0.0f;
     groupIndex        = 0;
     categoryBits      = 0x0001;
     maskBits          = 0xffff;
     b2BodyDef         = new BodyDef();
     b2CircleDef       = new CircleDef();
     refWorld          = world;
     physicalShapeType = shapeType;
     b2Body            = refWorld.B2World.CreateBody(b2BodyDef);
     b2Body.CreateFixture(b2CircleDef);
     if (physicalShapeType == PhysicalShapeType.Dynamic)
     {
         b2Body.SetMassFromShapes();
     }
     world.Add(this);
 }
Example #29
0
 private void addCircle(Body body)
 {
     try
     {
         if (body.GetUserData() == null)
         {
             return;
         }
         GizmoComponents myGizmo   = (GizmoComponents)body.GetUserData();
         CircleDef       circleDef = new CircleDef();
         circleDef.Radius      = myGizmo.Radius;
         circleDef.Density     = myGizmo.Density;
         circleDef.Restitution = myGizmo.Restitution;
         circleDef.Friction    = myGizmo.Friction;
         body.CreateFixture(circleDef);
     }
     catch (Exception e)
     {
         MessageBox.Show("PhysicalWorld-addBaffleX函数出错");
     }
 }
Example #30
0
        public RaycastTest()
        {
            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                bd.Position.Set(0.0f, -10.0f);
                ground = _world.CreateBody(bd);

                PolygonDef sd = new PolygonDef();
                sd.SetAsBox(50.0f, 10.0f);
                ground.CreateFixture(sd);
            }

            {
                BodyDef bd = new BodyDef();
                bd.Position.Set(0.0f, 1.0f);
                laserBody = _world.CreateBody(bd);

                PolygonDef sd = new PolygonDef();
                sd.SetAsBox(5.0f, 1.0f);
                sd.Density = 4.0f;
                laserBody.CreateFixture(sd);
                laserBody.SetMassFromShapes();

                Body body;
                //Create a few shapes
                bd.Position.Set(-5.0f, 10.0f);
                body = _world.CreateBody(bd);

                CircleDef cd = new CircleDef();
                cd.Radius = 3;
                body.CreateFixture(cd);

                bd.Position.Set(5.0f, 10.0f);
                body = _world.CreateBody(bd);

                body.CreateFixture(cd);
            }
        }
Example #31
0
		public RaycastTest()
		{
			Body ground = null;
			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);
				ground = _world.CreateBody(bd);

				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);
				ground.CreateShape(sd);
			}

			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, 1.0f);
				laserBody = _world.CreateBody(bd);

				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(5.0f, 1.0f);
				sd.Density = 4.0f;
				laserBody.CreateShape(sd);
				laserBody.SetMassFromShapes();

				Body body;
				//Create a few shapes
				bd.Position.Set(-5.0f, 10.0f);
				body = _world.CreateBody(bd);

				CircleDef cd = new CircleDef();
				cd.Radius = 3;
				body.CreateShape(cd);

				bd.Position.Set(5.0f, 10.0f);
				body = _world.CreateBody(bd);

				body.CreateShape(cd);
			}
		}
Example #32
0
        //только для тестов
        public SolidBody(IGameObject parent) : base(parent)
        {
            shape = new RectangleF(60, 70, 5, 5);
            BodyDef bDef = new BodyDef();

            bDef.Position.Set(shape.X, shape.Y);
            bDef.Angle         = 0;
            bDef.FixedRotation = true;

            CircleDef pDef = new CircleDef();

            pDef.Restitution         = 0;
            pDef.Friction            = 0;
            pDef.Density             = 0.5f;
            pDef.Radius              = shape.Width / 2;
            pDef.Filter.CategoryBits = 0;
            pDef.Filter.MaskBits     = 0;

            Body = Parent.Model.Field.CreateBody(bDef);
            Body.CreateShape(pDef);
            Body.SetMassFromShapes();
            Body.SetUserData(this);
        }
        public InfoBody AddCircle(float x, float y, float radius, float angle, float density,
                                  float friction, float restetution, float mass, Image image, object userDate = null)
        {
            BodyDef bDef = new BodyDef();

            bDef.Position.Set(x / metric, y / metric);
            bDef.Angle = angle;

            CircleDef pDef = new CircleDef();

            pDef.Restitution = restetution;
            pDef.Friction    = friction;
            pDef.Density     = density;
            pDef.Radius      = radius / metric;

            Body body = world.CreateBody(bDef);

            body.CreateShape(pDef);
            body.SetMassFromShapes();

            float    Inertia = body.GetInertia();
            MassData md      = new MassData();

            md.I    = Inertia;
            md.Mass = mass;
            body.SetMass(md);

            InfoBody info = new InfoBody();

            info.image    = image;
            info.body     = body;
            info.userDate = userDate;

            body.SetUserData(info);

            return(info);
        }
Example #34
0
        public SensorTest()
        {
            {
                BodyDef bd = new BodyDef();
                bd.Position.Set(0.0f, -10.0f);

                Body ground = _world.CreateBody(bd);

                PolygonDef sd = new PolygonDef();
                sd.SetAsBox(50.0f, 10.0f);
                ground.CreateFixture(sd);

                CircleDef cd = new CircleDef();
                cd.IsSensor = true;
                cd.Radius   = 5.0f;
                cd.LocalPosition.Set(0.0f, 20.0f);
                _fixtureCircle = ground.CreateFixture(cd);
                _sensor        = _fixtureCircle.Shape;
            }

            {
                CircleDef sd = new CircleDef();
                sd.Radius  = 1.0f;
                sd.Density = 1.0f;

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

                    Body body = _world.CreateBody(bd);

                    body.CreateFixture(sd);
                    body.SetMassFromShapes();
                }
            }
        }
Example #35
0
        private static List <CircleDef> GenNestedCircles(CircleDef starterCircle, List <CircleDef> circles, int i = 0)
        {
            int radDist = starterCircle.Radius;

            if (i < 3)
            {
                IntRange additions  = new IntRange((int)(radDist * 1.3), (int)(radDist * 3));
                IntRange sizeWobble = new IntRange(-5, 5);

                for (int j = 0; j < 4 - i; j++)
                {
                    IntVec3 newCenter = starterCircle.Center;
                    if (Rand.Bool)
                    {
                        newCenter.x += additions.RandomInRange;
                    }
                    else
                    {
                        newCenter.x -= additions.RandomInRange;
                    }
                    if (Rand.Bool)
                    {
                        newCenter.z += additions.RandomInRange;
                    }
                    else
                    {
                        newCenter.z -= additions.RandomInRange;
                    }

                    CircleDef newCircle = new CircleDef(newCenter, (int)(sizeWobble.RandomInRange + radDist * 0.65));
                    circles.Add(newCircle);
                    circles.Concat(GenNestedCircles(newCircle, circles, i + 1));
                }
            }

            return(circles);
        }
Example #36
0
		public SensorTest()
		{
			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);

				Body ground = _world.CreateBody(bd);

				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);
				ground.CreateShape(sd);

				CircleDef cd = new CircleDef();
				cd.IsSensor = true;
				cd.Radius = 5.0f;
				cd.LocalPosition.Set(0.0f, 20.0f);
				_sensor = ground.CreateShape(cd);
			}

			{
				CircleDef sd = new CircleDef();
				sd.Radius = 1.0f;
				sd.Density = 1.0f;

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

					Body body = _world.CreateBody(bd);

					body.CreateShape(sd);
					body.SetMassFromShapes();
				}
			}
		}
        public InfoBody AddCircle(float x, float y, float radius, float angle, float density,
                                  float friction, float restetution, Bitmap image, object userDate = null)
        {
            Image g_image = new Image(game);

            g_image.SetImage(image);
            g_image.SetWidth(radius * 2);
            g_image.SetHeight(radius * 2);

            BodyDef bDef = new BodyDef();

            bDef.Position.Set(x / metric, y / metric);
            bDef.Angle = angle;

            CircleDef pDef = new CircleDef();

            pDef.Restitution = restetution;
            pDef.Friction    = friction;
            pDef.Density     = density;
            pDef.Radius      = radius / metric;

            Body body = world.CreateBody(bDef);

            body.CreateShape(pDef);
            body.SetMassFromShapes();

            InfoBody info = new InfoBody();

            info.image    = g_image;
            info.body     = body;
            info.userDate = userDate;

            body.SetUserData(info);

            return(info);
        }
        private Body CreatePole(Vec2 basePose, float length, float angle, float radius, float density, ushort layers)
        {
            // ==== Create bar. ====
            // Determine position of top of pole with base position of (0, 0), length of 1m and an angle CCW is +ve.
            Vec2 polePosTop = new Vec2(length * (float)-SysMath.Sin(angle), length * (float)SysMath.Cos(angle));
            Vec2 polePosCenter = (polePosTop * 0.5f) + basePose;

            BodyDef bodyDef = new BodyDef();
            bodyDef.Position.Set(polePosCenter.X, polePosCenter.Y);
            bodyDef.Angle = angle;
            bodyDef.IsBullet = true;

            // Create body object; The body is also added to the world.
            Body body = _world.CreateBody(bodyDef);
            PolygonDef shapeDef = new PolygonDef();
            shapeDef.SetAsBox(radius, length * 0.5f);
            shapeDef.Friction = _simParams._defaultFriction;
            shapeDef.Restitution = _simParams._defaultRestitution;
            shapeDef.Density = density;
            shapeDef.Filter.MaskBits = 0xFFFE;
            shapeDef.Filter.CategoryBits = layers;
            body.CreateShape(shapeDef);

            // ==== Place some end caps on the pole. ====
            CircleDef circleDef = new CircleDef();
            circleDef.Radius = radius;
            circleDef.Friction = _simParams._defaultFriction;
            circleDef.Restitution = _simParams._defaultRestitution;
            circleDef.Density = density;
            circleDef.Filter.MaskBits = 0xFFFE;
            circleDef.Filter.CategoryBits = layers;

            // Top cap.
            circleDef.LocalPosition.Set(0f, length * 0.5f);
            body.CreateShape(circleDef);

            // Bottom cap.
            circleDef.LocalPosition.Set(0f, -length * 0.5f);
            body.CreateShape(circleDef);
            body.SetMassFromShapes();
            return body;
        }
Example #39
0
        public override void Generate(Map map, GenStepParams parms)
        {
            IntVec3 center = map.Center;

            int outerRadius = (int)(0.01 * map.Size.x * MapDesignerMod.mod.settings.priIslandSize);

            int beachSize   = (int)MapDesignerMod.mod.settings.priBeachSize;
            int innerRadius = outerRadius - beachSize;

            List <IntVec3> beachCells = new List <IntVec3>();
            List <IntVec3> landCells  = new List <IntVec3>();

            Log.Message("[Map Designer] Creating multiple islands");

            if (MapDesignerMod.mod.settings.priMultiSpawn)
            {
                Log.Message("[Map Designer] Island Multispawn");

                outerRadius /= 2;
                innerRadius /= 2;
                //beachSize /= 2;

                List <CircleDef> islandList = new List <CircleDef>();
                islandList.Add(new CircleDef(center, outerRadius));
                CircleDef circle = new CircleDef(center, outerRadius);
                islandList = GenNestedCircles(circle, islandList);

                List <CircleDef> finalIslands = new List <CircleDef>();

                islandList = islandList.OrderByDescending(ci => ci.Radius).ToList();

                foreach (CircleDef c in islandList)
                {
                    if (c.Radius > 3)
                    {
                        if (c.Center.DistanceToEdge(map) >= 15)
                        {
                            List <IntVec3> newCells = HelperMethods.GenCircle(map, c.Center, c.Radius);
                            if (!newCells.Intersect(beachCells).Any())
                            {
                                finalIslands.Add(c);
                                beachCells.AddRange(HelperMethods.GenCircle(map, c.Center, c.Radius));
                            }
                        }
                    }
                }

                foreach (CircleDef f in finalIslands)
                {
                    if (f.Radius > beachSize * 2)
                    {
                        landCells.AddRange(HelperMethods.GenCircle(map, f.Center, f.Radius - beachSize));
                        beachCells = beachCells.Except(HelperMethods.GenCircle(map, f.Center, f.Radius - beachSize)).ToList();
                    }
                }
            }

            else
            {
                Log.Message("[Map Designer] Creating single island");

                landCells  = HelperMethods.GenCircle(map, center, innerRadius);
                beachCells = HelperMethods.GenCircle(map, center, outerRadius).Except(landCells).ToList();
            }

            MapGenFloatGrid elevation  = MapGenerator.Elevation;
            MapGenFloatGrid fertility  = MapGenerator.Fertility;
            List <IntVec3>  waterCells = map.AllCells.Except(landCells).Except(beachCells).ToList();

            foreach (IntVec3 current in beachCells)
            {
                fertility[current] = -1075f;
                elevation[current] = 0;
            }

            foreach (IntVec3 current in waterCells)
            {
                fertility[current] = -2025f;
                elevation[current] = 0;
            }
        }
Example #40
0
		// Main...
		public ElasticBody()
		{
			// Bottom static body
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 2.0f);
				sd.Friction = 0.1f;
				sd.Restitution = 0.1f;
				BodyDef bd = new BodyDef();
				bd.Position.Set(-1.0f, -7.5f);
				_ground = _world.CreateBody(bd);
				_ground.CreateShape(sd);
			}
			// Upper static body
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(20.0f, 0.50f, new Vec2(0.0f, 0.0f), 0.047f * Box2DX.Common.Settings.Pi);
				sd.Friction = 0.01f;
				sd.Restitution = 0.001f;
				BodyDef bd = new BodyDef();
				bd.Position.Set(-20.0f, 93.0f);
				Body g = _world.CreateBody(bd);
				g.CreateShape(sd);
				sd.SetAsBox(15.0f, 0.50f, new Vec2(-15.0f, 12.5f), 0.0f);
				g.CreateShape(sd);

				sd.SetAsBox(20.0f, 0.5f, new Vec2(0.0f, -25.0f), -0.5f);
				g.CreateShape(sd);
			}
			// Left channel left wall
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(0.7f, 55.0f);
				sd.Friction = 0.1f;
				sd.Restitution = 0.1f;
				BodyDef bd = new BodyDef();
				bd.Position.Set(-49.3f, 50.0f);
				Body g = _world.CreateBody(bd);
				g.CreateShape(sd);
			}
			// Right wall
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(0.7f, 55.0f);
				sd.Friction = 0.1f;
				sd.Restitution = 0.1f;
				BodyDef bd = new BodyDef();
				bd.Position.Set(45.0f, 50.0f);
				Body g = _world.CreateBody(bd);
				g.CreateShape(sd);
			}
			// Left channel right upper wall  
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(0.5f, 20.0f);
				sd.Friction = 0.05f;
				sd.Restitution = 0.01f;
				BodyDef bd = new BodyDef();
				bd.Position.Set(-42.0f, 70.0f);
				bd.Angle = -0.03f * Box2DX.Common.Settings.Pi;
				Body g = _world.CreateBody(bd);
				g.CreateShape(sd);
			}
			// Left channel right lower wall
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(0.50f, 23.0f);
				sd.Friction = 0.05f;
				sd.Restitution = 0.01f;
				BodyDef bd = new BodyDef();
				bd.Position.Set(-44.0f, 27.0f);
				Body g = _world.CreateBody(bd);
				g.CreateShape(sd);
				// Bottom motors
				CircleDef cd = new CircleDef();
				cd.Radius = 3.0f;
				cd.Density = 15.0f;
				cd.Friction = 1.0f;
				cd.Restitution = 0.2f;
				// 1. 
				bd.Position.Set(-40.0f, 2.5f);
				Body body = _world.CreateBody(bd);
				body.CreateShape(cd);
				body.SetMassFromShapes();
				RevoluteJointDef jr = new RevoluteJointDef();
				jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f));
				jr.MaxMotorTorque = 30000.0f;
				jr.EnableMotor = true;
				jr.MotorSpeed = 20.0f;
				_world.CreateJoint(jr);
				// 1. left down
				bd.Position.Set(-46.0f, -2.5f);
				cd.Radius = 1.5f; jr.MotorSpeed = -20.0f;
				body = _world.CreateBody(bd);
				body.CreateShape(cd);
				sd.SetAsBox(2.0f, 0.50f);
				body.CreateShape(sd);
				body.SetMassFromShapes();
				jr.Initialize(g, body, body.GetWorldCenter());
				_world.CreateJoint(jr);
				// 2.
				cd.Radius = 3.0f; jr.MotorSpeed = 20.0f;
				bd.Position.Set(-32.0f, 2.5f);
				body = _world.CreateBody(bd);
				body.CreateShape(cd);
				body.SetMassFromShapes();
				jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f));
				_world.CreateJoint(jr);
				// 3.
				jr.MotorSpeed = 20.0f;
				bd.Position.Set(-24.0f, 1.5f);
				body = _world.CreateBody(bd);
				body.CreateShape(cd);
				body.SetMassFromShapes();
				jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f));
				_world.CreateJoint(jr);
				// 4.
				bd.Position.Set(-16.0f, 0.8f);
				body = _world.CreateBody(bd);
				body.CreateShape(cd);
				body.SetMassFromShapes();
				jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f));
				_world.CreateJoint(jr);
				// 5.
				bd.Position.Set(-8.0f, 0.5f);
				body = _world.CreateBody(bd);
				body.CreateShape(cd);
				body.SetMassFromShapes();
				jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f));
				_world.CreateJoint(jr);
				// 6.
				bd.Position.Set(0.0f, 0.1f);
				body = _world.CreateBody(bd);
				body.CreateShape(cd);
				body.SetMassFromShapes();
				jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f));
				_world.CreateJoint(jr);
				// 7.
				bd.Position.Set(8.0f, -0.5f);
				body = _world.CreateBody(bd);
				body.CreateShape(cd);
				sd.SetAsBox(3.7f, 0.5f);
				body.CreateShape(sd);
				body.SetMassFromShapes();
				jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f));
				_world.CreateJoint(jr);
				// 8. right rotator
				sd.SetAsBox(5.0f, 0.5f);
				sd.Density = 2.0f;
				bd.Position.Set(18.0f, 1.0f);
				Body rightmotor = _world.CreateBody(bd);
				rightmotor.CreateShape(sd);
				sd.SetAsBox(4.5f, 0.5f, new Vec2(0.0f, 0.0f), Box2DX.Common.Settings.Pi / 3.0f);
				rightmotor.CreateShape(sd);
				sd.SetAsBox(4.5f, 0.5f, new Vec2(0.0f, 0.0f), Box2DX.Common.Settings.Pi * 2.0f / 3.0f);
				rightmotor.CreateShape(sd);
				cd.Radius = 4.2f;
				rightmotor.CreateShape(cd);
				rightmotor.SetMassFromShapes();
				jr.Initialize(g, rightmotor, rightmotor.GetWorldCenter());
				jr.MaxMotorTorque = 70000.0f;
				jr.MotorSpeed = -4.0f;
				_world.CreateJoint(jr);
				// 9. left rotator
				sd.SetAsBox(8.5f, 0.5f);
				sd.Density = 2.0f;
				bd.Position.Set(-34.0f, 17.0f);
				body = _world.CreateBody(bd);
				body.CreateShape(sd);
				sd.SetAsBox(8.5f, 0.5f, new Vec2(0.0f, 0.0f), Box2DX.Common.Settings.Pi * .5f);
				body.CreateShape(sd);
				cd.Radius = 7.0f;
				cd.Friction = 0.9f;
				body.CreateShape(cd);
				body.SetMassFromShapes();
				jr.Initialize(g, body, body.GetWorldCenter());
				jr.MaxMotorTorque = 100000.0f;
				jr.MotorSpeed = -5.0f;
				_world.CreateJoint(jr);
				// big compressor
				sd.SetAsBox(3.0f, 4.0f);
				sd.Density = 10.0f;
				bd.Position.Set(-16.0f, 17.0f);
				Body hammerleft = _world.CreateBody(bd);
				hammerleft.CreateShape(sd);
				hammerleft.SetMassFromShapes();
				DistanceJointDef jd = new DistanceJointDef();
				jd.Initialize(body, hammerleft, body.GetWorldCenter() + new Vec2(0.0f, 6.0f), hammerleft.GetWorldCenter());
				_world.CreateJoint(jd);

				bd.Position.Set(4.0f, 17.0f);
				Body hammerright = _world.CreateBody(bd);
				hammerright.CreateShape(sd);
				hammerright.SetMassFromShapes();
				jd.Initialize(body, hammerright, body.GetWorldCenter() - new Vec2(0.0f, 6.0f), hammerright.GetWorldCenter());
				_world.CreateJoint(jd);
				// pusher
				sd.SetAsBox(6.0f, 0.75f);
				bd.Position.Set(-21.0f, 9.0f);
				Body pusher = _world.CreateBody(bd);
				pusher.CreateShape(sd);
				sd.SetAsBox(2.0f, 1.5f, new Vec2(-5.0f, 0.0f), 0.0f);
				pusher.SetMassFromShapes();
				pusher.CreateShape(sd);
				jd.Initialize(rightmotor, pusher, rightmotor.GetWorldCenter() + new Vec2(-8.0f, 0.0f),
							  pusher.GetWorldCenter() + new Vec2(5.0f, 0.0f));
				_world.CreateJoint(jd);
			}
			// Static bodies above motors
			{
				PolygonDef sd = new PolygonDef();
				CircleDef cd = new CircleDef();
				sd.SetAsBox(9.0f, 0.5f);
				sd.Friction = 0.05f;
				sd.Restitution = 0.01f;
				BodyDef bd = new BodyDef();
				bd.Position.Set(-15.5f, 12.0f);
				bd.Angle = 0.0f;
				Body g = _world.CreateBody(bd);
				g.CreateShape(sd);

				sd.SetAsBox(8.0f, 0.5f, new Vec2(23.0f, 0.0f), 0.0f);
				g.CreateShape(sd);
				// compressor statics  
				sd.SetAsBox(7.0f, 0.5f, new Vec2(-2.0f, 9.0f), 0.0f);
				g.CreateShape(sd);
				sd.SetAsBox(9.0f, 0.5f, new Vec2(22.0f, 9.0f), 0.0f);
				g.CreateShape(sd);

				sd.SetAsBox(19.0f, 0.5f, new Vec2(-9.0f, 15.0f), -0.05f);
				g.CreateShape(sd);
				sd.SetAsBox(4.7f, 0.5f, new Vec2(15.0f, 11.5f), -0.5f);
				g.CreateShape(sd);
				// below compressor
				sd.SetAsBox(26.0f, 0.3f, new Vec2(17.0f, -4.4f), -0.02f);
				g.CreateShape(sd);
				cd.Radius = 1.0f; cd.Friction = 1.0f;
				cd.LocalPosition = new Vec2(29.0f, -6.0f);
				g.CreateShape(cd);
				cd.Radius = 0.7f;
				cd.LocalPosition = new Vec2(-2.0f, -4.5f);
				g.CreateShape(cd);
			}
			// Elevator
			{
				BodyDef bd = new BodyDef();
				CircleDef cd = new CircleDef();
				PolygonDef sd = new PolygonDef();

				bd.Position.Set(40.0f, 4.0f);
				_elev = _world.CreateBody(bd);

				sd.SetAsBox(0.5f, 2.5f, new Vec2(3.0f, -3.0f), 0.0f);
				sd.Density = 1.0f;
				sd.Friction = 0.01f;
				_elev.CreateShape(sd);
				sd.SetAsBox(7.0f, 0.5f, new Vec2(-3.5f, -5.5f), 0.0f);
				_elev.CreateShape(sd);
				sd.SetAsBox(0.5f, 2.5f, new Vec2(-11.0f, -3.5f), 0.0f);
				_elev.CreateShape(sd);
				_elev.SetMassFromShapes();

				PrismaticJointDef jp = new PrismaticJointDef();
				jp.Initialize(_ground, _elev, bd.Position, new Vec2(0.0f, 1.0f));
				jp.LowerTranslation = 0.0f;
				jp.UpperTranslation = 100.0f;
				jp.EnableLimit = true;
				jp.EnableMotor = true;
				jp.MaxMotorForce = 10000.0f;
				jp.MotorSpeed = 0.0f;
				_joint_elev = (PrismaticJoint)_world.CreateJoint(jp);

				// Korb
				sd.SetAsBox(2.3f, 0.5f, new Vec2(1.0f, 0.0f), 0.0f);
				sd.Density = 0.5f;
				bd.Position.Set(29.0f, 6.5f);
				Body body = _world.CreateBody(bd);
				body.CreateShape(sd);
				sd.SetAsBox(2.5f, 0.5f, new Vec2(3.0f, -2.0f), Box2DX.Common.Settings.Pi / 2.0f);
				body.CreateShape(sd);
				sd.SetAsBox(4.6f, 0.5f, new Vec2(7.8f, -4.0f), 0.0f);
				body.CreateShape(sd);
				sd.SetAsBox(0.5f, 4.5f, new Vec2(12.0f, 0.0f), 0.0f);
				body.CreateShape(sd);

				sd.SetAsBox(0.5f, 0.5f, new Vec2(13.0f, 4.0f), 0.0f);
				body.CreateShape(sd);

				cd.Radius = 0.7f; cd.Density = 1.0f; cd.Friction = 0.01f;
				cd.LocalPosition = new Vec2(0.0f, 0.0f);
				body.CreateShape(cd);
				body.SetMassFromShapes();

				RevoluteJointDef jr = new RevoluteJointDef();
				jr.Initialize(_elev, body, bd.Position);
				jr.EnableLimit = true;
				jr.LowerAngle = -0.2f;
				jr.UpperAngle = Box2DX.Common.Settings.Pi * 1.1f;
				jr.CollideConnected = true;
				_world.CreateJoint(jr);
				// upper body exit
				sd.SetAsBox(14.0f, 0.5f, new Vec2(-3.5f, -10.0f), 0.0f);
				bd.Position.Set(17.5f, 96.0f);
				body = _world.CreateBody(bd);
				body.CreateShape(sd);
			}
			// "Elastic body" 64 bodies - something like a lin. elastic compound
			// connected via dynamic forces (springs) 
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(0.55f, 0.55f);
				sd.Density = 1.5f;
				sd.Friction = 0.01f;
				sd.Filter.GroupIndex = -1;
				Vec2 startpoint = new Vec2(30.0f, 20.0f);
				BodyDef bd = new BodyDef();
				bd.IsBullet = false;
				bd.AllowSleep = false;
				for (int i = 0; i < 8; ++i)
				{
					for (int j = 0; j < 8; ++j)
					{
						bd.Position.Set(j * 1.02f, 2.51f + 1.02f * i);
						bd.Position += startpoint;
						Body body = _world.CreateBody(bd);
						bodies[8 * i + j] = body;
						body.CreateShape(sd);
						body.SetMassFromShapes();
					}
				}
			}
		}
Example #41
0
		public Gears()
		{
			Body ground = null;
			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);
				ground = _world.CreateBody(bd);

				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);
				ground.CreateShape(sd);
			}

			{
				CircleDef circle1 = new CircleDef();
				circle1.Radius = 1.0f;
				circle1.Density = 5.0f;

				CircleDef circle2 = new CircleDef();
				circle2.Radius = 2.0f;
				circle2.Density = 5.0f;

				PolygonDef box = new PolygonDef();
				box.SetAsBox(0.5f, 5.0f);
				box.Density = 5.0f;

				BodyDef bd1 = new BodyDef();
				bd1.Position.Set(-3.0f, 12.0f);
				Body body1 = _world.CreateBody(bd1);
				body1.CreateShape(circle1);
				body1.SetMassFromShapes();

				RevoluteJointDef jd1 = new RevoluteJointDef();
				jd1.Body1 = ground;
				jd1.Body2 = body1;
				jd1.LocalAnchor1 = ground.GetLocalPoint(bd1.Position);
				jd1.LocalAnchor2 = body1.GetLocalPoint(bd1.Position);
				jd1.ReferenceAngle = body1.GetAngle() - ground.GetAngle();
				_joint1 = (RevoluteJoint)_world.CreateJoint(jd1);

				BodyDef bd2 = new BodyDef();
				bd2.Position.Set(0.0f, 12.0f);
				Body body2 = _world.CreateBody(bd2);
				body2.CreateShape(circle2);
				body2.SetMassFromShapes();

				RevoluteJointDef jd2 = new RevoluteJointDef();
				jd2.Initialize(ground, body2, bd2.Position);
				_joint2 = (RevoluteJoint)_world.CreateJoint(jd2);

				BodyDef bd3 = new BodyDef();
				bd3.Position.Set(2.5f, 12.0f);
				Body body3 = _world.CreateBody(bd3);
				body3.CreateShape(box);
				body3.SetMassFromShapes();

				PrismaticJointDef jd3 = new PrismaticJointDef();
				jd3.Initialize(ground, body3, bd3.Position, new Vec2(0.0f, 1.0f));
				jd3.LowerTranslation = -5.0f;
				jd3.UpperTranslation = 5.0f;
				jd3.EnableLimit = true;

				_joint3 = (PrismaticJoint)_world.CreateJoint(jd3);

				GearJointDef jd4 = new GearJointDef();
				jd4.Body1 = body1;
				jd4.Body2 = body2;
				jd4.Joint1 = _joint1;
				jd4.Joint2 = _joint2;
				jd4.Ratio = circle2.Radius / circle1.Radius;
				_joint4 = (GearJoint)_world.CreateJoint(jd4);

				GearJointDef jd5 = new GearJointDef();
				jd5.Body1 = body2;
				jd5.Body2 = body3;
				jd5.Joint1 = _joint2;
				jd5.Joint2 = _joint3;
				jd5.Ratio = -1.0f / circle2.Radius;
				_joint5 = (GearJoint)_world.CreateJoint(jd5);
			}
		}
Example #42
0
		public CompoundShapes()
		{
			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);
				Body body = _world.CreateBody(bd);

				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);
				body.CreateShape(sd);
			}

			{
				CircleDef sd1 = new CircleDef();
				sd1.Radius = 0.5f;
				sd1.LocalPosition.Set(-0.5f, 0.5f);
				sd1.Density = 2.0f;

				CircleDef sd2 = new CircleDef();
				sd2.Radius = 0.5f;
				sd2.LocalPosition.Set(0.5f, 0.5f);
				sd2.Density = 0.0f; // massless

				for (int i = 0; i < 10; ++i)
				{
					float x = Box2DX.Common.Math.Random(-0.1f, 0.1f);
					BodyDef bd = new BodyDef();
					bd.Position.Set(x + 5.0f, 1.05f + 2.5f * i);
					bd.Angle = Box2DX.Common.Math.Random(-Box2DX.Common.Settings.Pi, Box2DX.Common.Settings.Pi);
					Body body = _world.CreateBody(bd);
					body.CreateShape(sd1);
					body.CreateShape(sd2);
					body.SetMassFromShapes();
				}
			}

			{
				PolygonDef sd1 = new PolygonDef();
				sd1.SetAsBox(0.25f, 0.5f);
				sd1.Density = 2.0f;

				PolygonDef sd2 = new PolygonDef();
				sd2.SetAsBox(0.25f, 0.5f, new Vec2(0.0f, -0.5f), 0.5f * Box2DX.Common.Settings.Pi);
				sd2.Density = 2.0f;

				for (int i = 0; i < 10; ++i)
				{
					float x = Box2DX.Common.Math.Random(-0.1f, 0.1f);
					BodyDef bd = new BodyDef();
					bd.Position.Set(x - 5.0f, 1.05f + 2.5f * i);
					bd.Angle = Box2DX.Common.Math.Random(-Box2DX.Common.Settings.Pi, Box2DX.Common.Settings.Pi);
					Body body = _world.CreateBody(bd);
					body.CreateShape(sd1);
					body.CreateShape(sd2);
					body.SetMassFromShapes();
				}
			}

			{
				XForm xf1 = new XForm();
				xf1.R.Set(0.3524f * Box2DX.Common.Settings.Pi);
				xf1.Position = Box2DX.Common.Math.Mul(xf1.R, new Vec2(1.0f, 0.0f));

				PolygonDef sd1 = new PolygonDef();
				sd1.VertexCount = 3;
				sd1.Vertices[0] = Box2DX.Common.Math.Mul(xf1, new Vec2(-1.0f, 0.0f));
				sd1.Vertices[1] = Box2DX.Common.Math.Mul(xf1, new Vec2(1.0f, 0.0f));
				sd1.Vertices[2] = Box2DX.Common.Math.Mul(xf1, new Vec2(0.0f, 0.5f));
				sd1.Density = 2.0f;

				XForm xf2 = new XForm();
				xf2.R.Set(-0.3524f * Box2DX.Common.Settings.Pi);
				xf2.Position = Box2DX.Common.Math.Mul(xf2.R, new Vec2(-1.0f, 0.0f));

				PolygonDef sd2 = new PolygonDef();
				sd2.VertexCount = 3;
				sd2.Vertices[0] = Box2DX.Common.Math.Mul(xf2, new Vec2(-1.0f, 0.0f));
				sd2.Vertices[1] = Box2DX.Common.Math.Mul(xf2, new Vec2(1.0f, 0.0f));
				sd2.Vertices[2] = Box2DX.Common.Math.Mul(xf2, new Vec2(0.0f, 0.5f));
				sd2.Density = 2.0f;

				for (int i = 0; i < 10; ++i)
				{
					float x = Box2DX.Common.Math.Random(-0.1f, 0.1f);
					BodyDef bd = new BodyDef();
					bd.Position.Set(x, 2.05f + 2.5f * i);
					bd.Angle = 0.0f;
					Body body = _world.CreateBody(bd);
					body.CreateShape(sd1);
					body.CreateShape(sd2);
					body.SetMassFromShapes();
				}
			}

			{
				PolygonDef sd_bottom = new PolygonDef();
				sd_bottom.SetAsBox(1.5f, 0.15f);
				sd_bottom.Density = 4.0f;

				PolygonDef sd_left = new PolygonDef();
				sd_left.SetAsBox(0.15f, 2.7f, new Vec2(-1.45f, 2.35f), 0.2f);
				sd_left.Density = 4.0f;

				PolygonDef sd_right = new PolygonDef();
				sd_right.SetAsBox(0.15f, 2.7f, new Vec2(1.45f, 2.35f), -0.2f);
				sd_right.Density = 4.0f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, 2.0f);
				Body body = _world.CreateBody(bd);
				body.CreateShape(sd_bottom);
				body.CreateShape(sd_left);
				body.CreateShape(sd_right);
				body.SetMassFromShapes();
			}
		}
Example #43
0
        public CollisionProcessing()
        {
            // Ground body
            {
                PolygonDef sd = new PolygonDef();
                sd.SetAsBox(50.0f, 10.0f);
                sd.Friction = 0.3f;

                BodyDef bd = new BodyDef();
                bd.Position.Set(0.0f, -10.0f);

                Body ground = _world.CreateBody(bd);
                ground.CreateShape(sd);
            }

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

            // Small triangle
            PolygonDef triangleShapeDef = new PolygonDef();

            triangleShapeDef.VertexCount = 3;
            triangleShapeDef.Vertices[0].Set(-1.0f, 0.0f);
            triangleShapeDef.Vertices[1].Set(1.0f, 0.0f);
            triangleShapeDef.Vertices[2].Set(0.0f, 2.0f);
            triangleShapeDef.Density = 1.0f;

            BodyDef triangleBodyDef     = new BodyDef();

            //triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
            triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 35f);

            Body body1 = _world.CreateBody(triangleBodyDef);

            body1.CreateShape(triangleShapeDef);
            body1.SetMassFromShapes();

            // Large triangle (recycle definitions)
            triangleShapeDef.Vertices[0] *= 2.0f;
            triangleShapeDef.Vertices[1] *= 2.0f;
            triangleShapeDef.Vertices[2] *= 2.0f;
            //triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
            triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 30f);

            Body body2 = _world.CreateBody(triangleBodyDef);

            body2.CreateShape(triangleShapeDef);
            body2.SetMassFromShapes();

            // Small box
            PolygonDef boxShapeDef = new PolygonDef();

            boxShapeDef.SetAsBox(1.0f, 0.5f);
            boxShapeDef.Density = 1.0f;

            BodyDef boxBodyDef = new BodyDef();

            //boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
            boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 25f);

            Body body3 = _world.CreateBody(boxBodyDef);

            body3.CreateShape(boxShapeDef);
            body3.SetMassFromShapes();

            // Large box (recycle definitions)
            boxShapeDef.SetAsBox(2.0f, 1.0f);
            //boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
            boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 15f);

            Body body4 = _world.CreateBody(boxBodyDef);

            body4.CreateShape(boxShapeDef);
            body4.SetMassFromShapes();

            // Small circle
            CircleDef circleShapeDef = new CircleDef();

            circleShapeDef.Radius  = 1.0f;
            circleShapeDef.Density = 1.0f;

            BodyDef circleBodyDef = new BodyDef();

            //circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
            circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 10f);

            Body body5 = _world.CreateBody(circleBodyDef);

            body5.CreateShape(circleShapeDef);
            body5.SetMassFromShapes();

            // Large circle
            circleShapeDef.Radius *= 2.0f;
            //circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
            circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 5f);

            Body body6 = _world.CreateBody(circleBodyDef);

            body6.CreateShape(circleShapeDef);
            body6.SetMassFromShapes();
        }
Example #44
0
		public Dominos()
		{
			Body b1;
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);

				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);
				b1 = _world.CreateBody(bd);
				b1.CreateShape(sd);
			}

			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(6.0f, 0.25f);

				BodyDef bd = new BodyDef();
				bd.Position.Set(-1.5f, 10.0f);
				Body ground = _world.CreateBody(bd);
				ground.CreateShape(sd);
			}

			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(0.1f, 1.0f);
				sd.Density = 20.0f;
				sd.Friction = 0.1f;

				for (int i = 0; i < 10; ++i)
				{
					BodyDef bd = new BodyDef();
					bd.Position.Set(-6.0f + 1.0f * i, 11.25f);
					Body body = _world.CreateBody(bd);
					body.CreateShape(sd);
					body.SetMassFromShapes();
				}
			}

			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(7.0f, 0.25f, Vec2.Zero, 0.3f);

				BodyDef bd = new BodyDef();
				bd.Position.Set(1.0f, 6.0f);
				Body ground = _world.CreateBody(bd);
				ground.CreateShape(sd);
			}

			Body b2;
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(0.25f, 1.5f);

				BodyDef bd = new BodyDef();
				bd.Position.Set(-7.0f, 4.0f);
				b2 = _world.CreateBody(bd);
				b2.CreateShape(sd);
			}

			Body b3;
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(6.0f, 0.125f);
				sd.Density = 10.0f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(-0.9f, 1.0f);
				bd.Angle = -0.15f;

				b3 = _world.CreateBody(bd);
				b3.CreateShape(sd);
				b3.SetMassFromShapes();
			}

			RevoluteJointDef jd = new RevoluteJointDef();
			Vec2 anchor = new Vec2();

			anchor.Set(-2.0f, 1.0f);
			jd.Initialize(b1, b3, anchor);
			jd.CollideConnected = true;
			_world.CreateJoint(jd);

			Body b4;
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(0.25f, 0.25f);
				sd.Density = 10.0f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(-10.0f, 15.0f);
				b4 = _world.CreateBody(bd);
				b4.CreateShape(sd);
				b4.SetMassFromShapes();
			}

			anchor.Set(-7.0f, 15.0f);
			jd.Initialize(b2, b4, anchor);
			_world.CreateJoint(jd);

			Body b5;
			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(6.5f, 3.0f);
				b5 = _world.CreateBody(bd);

				PolygonDef sd = new PolygonDef();
				sd.Density = 10.0f;
				sd.Friction = 0.1f;

				sd.SetAsBox(1.0f, 0.1f, new Vec2(0.0f, -0.9f), 0.0f);
				b5.CreateShape(sd);

				sd.SetAsBox(0.1f, 1.0f, new Vec2(-0.9f, 0.0f), 0.0f);
				b5.CreateShape(sd);

				sd.SetAsBox(0.1f, 1.0f, new Vec2(0.9f, 0.0f), 0.0f);
				b5.CreateShape(sd);

				b5.SetMassFromShapes();
			}

			anchor.Set(6.0f, 2.0f);
			jd.Initialize(b1, b5, anchor);
			_world.CreateJoint(jd);

			Body b6;
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(1.0f, 0.1f);
				sd.Density = 30.0f;
				sd.Friction = 0.2f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(6.5f, 4.1f);
				b6 = _world.CreateBody(bd);
				b6.CreateShape(sd);
				b6.SetMassFromShapes();
			}

			anchor.Set(7.5f, 4.0f);
			jd.Initialize(b5, b6, anchor);
			_world.CreateJoint(jd);

			Body b7;
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(0.1f, 1.0f);
				sd.Density = 10.0f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(7.4f, 1.0f);

				b7 = _world.CreateBody(bd);
				b7.CreateShape(sd);
				b7.SetMassFromShapes();
			}

			DistanceJointDef djd = new DistanceJointDef();
			djd.Body1 = b3;
			djd.Body2 = b7;
			djd.LocalAnchor1.Set(6.0f, 0.0f);
			djd.LocalAnchor2.Set(0.0f, -1.0f);
			Vec2 d = djd.Body2.GetWorldPoint(djd.LocalAnchor2) - djd.Body1.GetWorldPoint(djd.LocalAnchor1);
			djd.Length = d.Length();
			_world.CreateJoint(djd);

			{
				CircleDef sd = new CircleDef();
				sd.Radius = 0.2f;
				sd.Density = 10.0f;

				for (int i = 0; i < 4; ++i)
				{
					BodyDef bd = new BodyDef();
					bd.Position.Set(5.9f + 2.0f * sd.Radius * i, 2.4f);
					Body body = _world.CreateBody(bd);
					body.CreateShape(sd);
					body.SetMassFromShapes();
				}
			}
		}
        List<Vec2> vertices = new List<Vec2>(); // we need this for drawing between the vertices

        #endregion Fields

        #region Constructors

        /**
         * Creates a new drawn object
         */
        public PaintedObject(World world, string blobtexturename, string segmenttexturename, List<Vector2> unsanitized_blobs)
            : base(world, blobtexturename, POB_DENSITY, POB_FRICTION, POB_RESTITUTION, 1f)
        {
            List<Vector2> blobs = SanitizeBlobs(unsanitized_blobs);
            if (blobs.Count == 0)
                return;
            Position = blobs[0]; // CASSWorld.SCALE; // position of the painting is the first blob in it

            Texture2D segmenttexture = GameEngine.TextureList[segmenttexturename];
            Texture2D blobtexture = GameEngine.TextureList[blobtexturename];

            this.blobTextureName = blobtexturename;
            this.segmentTextureName = segmenttexturename;

            TextureFilename = segmenttexturename;

            //boundingBox = new Rectangle((int)Position.X, (int)Position.Y, (int)Height, (int)Width);

            segmentTexture = segmenttexture;
            blobTexture = blobtexture;

            radius = (float)(blobtexture.Width) / (2 * CASSWorld.SCALE);
            //radius = (float)(blobtexture.Width - 6) / (2 * CASSWorld.SCALE);
            //radius = 4 / CASSWorld.SCALE; // really small physics object to keep cosmo from stubbing his toes

            // calculate amount of instasteel that was taken from this object during sanitation so we can return it to you
            float origamount = 0;
            for (int i = 0; i < unsanitized_blobs.Count - 1; i++)
            {
                origamount += Vector2.Distance(unsanitized_blobs[i], unsanitized_blobs[i + 1]) * CASSWorld.SCALE;
            }

            //foreach (Vector2 blobpos in blobs)
            for (int i=0; i<blobs.Count-1; i++)
            {
               // Vector2 localpos = (blobs[i] / CASSWorld.SCALE) - Position;
                //Vector2 localpos2 = (blobs[i+1] / CASSWorld.SCALE) - Position;
                Vector2 localpos = blobs[i]  - Position;
                Vector2 localpos2 = blobs[i+1]- Position;
                amountOfInstasteel += Vector2.Distance(blobs[i], blobs[i + 1]) * CASSWorld.SCALE; // moved above

                // add a circle fixture to this object at each point
                CircleDef circle = new CircleDef();
                circle.LocalPosition = Common.Utils.Convert(localpos);
                circle.Radius = radius;
                circle.Density = POB_DENSITY;
                circle.Friction = POB_FRICTION;
                circle.Restitution = POB_RESTITUTION;
                shapes.Add(circle);

                float scaledTextureWidth = segmentTexture.Width / CASSWorld.SCALE;

                Vector2 shapeVec = localpos2 - localpos;
                shapeVec.Normalize();
                Vector2 cornerOrtho = new Vector2(-shapeVec.Y, shapeVec.X);// * segmentTexture.Width / 2;
                // manually calculate the positions of each corner of the box/line between localpos and localpos2
                Vector2[] cornerpoints = new Vector2[] {               // if box were lying flat...
                    localpos - cornerOrtho * scaledTextureWidth / 2, // lower-left corner
                    localpos2 - cornerOrtho * scaledTextureWidth / 2, // lower-right corner
                    localpos2 + cornerOrtho * scaledTextureWidth / 2, // upper-right corner
                    localpos + cornerOrtho * scaledTextureWidth / 2 // upper-left corner
                };

                LinkedList<int> polygon = new LinkedList<int>();
                for (int j = 0; j < cornerpoints.Length; j++)
                    polygon.AddLast(j);
                // Triangles generated
                List<Vector2[]> triangles = new List<Vector2[]>();
                Split(polygon, cornerpoints, triangles);
                CreateShapes(triangles, POB_DENSITY, POB_FRICTION, POB_RESTITUTION);

                vertices.Add(Common.Utils.Convert(localpos)); // that is, vertices of the curve approximation
                numBlobs++;
            }

            // return the instasteel that was taken from you during sanitation of your drawing
            ScrollingWorld.numDrawLeft += (origamount - amountOfInstasteel);

            // add the last vertex
            //Vector2 lastlocalpos = (blobs[blobs.Count - 1] / CASSWorld.SCALE) - Position;
            //vertices.Add(Common.Utils.Convert(lastlocalpos));
            Vector2 lastlocalpos = blobs[blobs.Count - 1]- Position;
            vertices.Add(Utils.Convert(lastlocalpos));
            numBlobs++;
        }
Example #46
0
		public TheoJansen()
		{
			_offset.Set(0.0f, 8.0f);
			_motorSpeed = 2.0f;
			_motorOn = true;
			Vec2 pivot = new Vec2(0.0f, 0.8f);

			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);

				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);
				Body ground = _world.CreateBody(bd);
				ground.CreateShape(sd);

				sd.SetAsBox(0.5f, 5.0f, new Vec2(-50.0f, 15.0f), 0.0f);
				ground.CreateShape(sd);

				sd.SetAsBox(0.5f, 5.0f, new Vec2(50.0f, 15.0f), 0.0f);
				ground.CreateShape(sd);
			}

			for (int i = 0; i < 40; ++i)
			{
				CircleDef sd = new CircleDef();
				sd.Density = 1.0f;
				sd.Radius = 0.25f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(-40.0f + 2.0f * i, 0.5f);

				Body body = _world.CreateBody(bd);
				body.CreateShape(sd);
				body.SetMassFromShapes();
			}

			{
				PolygonDef sd = new PolygonDef();
				sd.Density = 1.0f;
				sd.SetAsBox(2.5f, 1.0f);
				sd.Filter.GroupIndex = -1;
				BodyDef bd = new BodyDef();
				bd.Position = pivot + _offset;
				_chassis = _world.CreateBody(bd);
				_chassis.CreateShape(sd);
				_chassis.SetMassFromShapes();
			}

			{
				CircleDef sd = new CircleDef();
				sd.Density = 1.0f;
				sd.Radius = 1.6f;
				sd.Filter.GroupIndex = -1;
				BodyDef bd = new BodyDef();
				bd.Position = pivot + _offset;
				_wheel = _world.CreateBody(bd);
				_wheel.CreateShape(sd);
				_wheel.SetMassFromShapes();
			}

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

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

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

			_wheel.SetXForm(_wheel.GetPosition(), 120.0f * Box2DX.Common.Settings.Pi / 180.0f);
			CreateLeg(-1.0f, wheelAnchor);
			CreateLeg(1.0f, wheelAnchor);

			_wheel.SetXForm(_wheel.GetPosition(), -120.0f * Box2DX.Common.Settings.Pi / 180.0f);
			CreateLeg(-1.0f, wheelAnchor);
			CreateLeg(1.0f, wheelAnchor);
		}
Example #47
0
        void LaunchBomb()
        {
	        if (bomb != null)
	        {
                world.DestroyBody(bomb);
                bomb = null;
	        }

            BodyDef bd = new BodyDef();
	        bd.BodyType = BodyType.e_dynamicBody;
	        bd.AllowSleep = true;
            Random rand = new Random();
            bd.Position = new Vector((float)rand.NextDouble() * 30 - 15, 30.0f);
	        bd.IsBullet = true;
            bomb = world.CreateBody(bd);
	        bomb.LinearVelocity = bd.Position * -5;

            CircleDef sd = new CircleDef();
	        sd.Radius = 0.3f;
	        sd.Density = 20.0f;
	        sd.Restitution = 0.1f;
            bomb.CreateShape(sd);
            bomb.SetMassFromShapes();
        }
Example #48
0
		public override void Keyboard(System.Windows.Forms.Keys key)
		{
			switch (key)
			{
				case System.Windows.Forms.Keys.S:
					if (_bullet != null)
					{
						_world.DestroyBody(_bullet);
						_bullet = null;
					}
					{
						CircleDef sd = new CircleDef();
						sd.Density = 20.0f;
						sd.Radius = 0.25f;
						sd.Restitution = 0.05f;

						BodyDef bd = new BodyDef();
						bd.IsBullet = true;
						bd.AllowSleep = false;
						bd.Position.Set(-31.0f, 5.0f);

						_bullet = _world.CreateBody(bd);
						_bullet.CreateShape(sd);
						_bullet.SetMassFromShapes();

						_bullet.SetLinearVelocity(new Vec2(400.0f, 0.0f));
					}
					break;
			}
		}
        public virtual void InitPhysics()
        {
            if (_physBody != null)
            {
                Log.Instance.Log("WARNING: Call to InitPhysics had no effect.  Actor has already had physics initialized.");
                return;
            }

            ShapeType shapeType = ShapeType.Box;
            Box2D.World physicsWorld = Angel.World.Instance.PhysicsWorld;

            ShapeDef shape;
            switch (shapeType)
            {
                case ShapeType.Box:
                    PolygonDef box = new PolygonDef();
                    box.SetAsBox(0.5f * Size.X, 0.5f * Size.Y);
                    shape = box;
                    break;
                case ShapeType.Circle:
                    CircleDef circle = new CircleDef();
                    circle.Radius = 0.5f * Size.X;
                    shape = circle;
                    break;
                default:
                    Log.Instance.Log("InitPhysics(): Invalid shape type given");
                    return;
            }

            shape.Density = _fDensity;
            shape.Friction = _fFriction;
            shape.Restitution = _fRestitution;
            shape.IsSensor = _bIsSensor;
            if (_iCollisionFlags != -1)
            {
                //shape->maskBits = (short)collisionFlags;
                //shape->categoryBits = (short)collisionFlags;
            }

            // InitShape( shape );

            BodyDef bodyDef = new BodyDef();
            bodyDef.UserData = this;
            bodyDef.Position = this.Position;
            bodyDef.Angle = MathHelper.ToRadians(-Rotation);
            bodyDef.FixedRotation = _bFixedRotation;

            _physBody = physicsWorld.CreateBody(bodyDef);
            _physBody.CreateShape(shape);
            _physBody.SetMassFromShapes();

            CustomInitPhysics();
        }
Example #50
0
        public PlayerCharacter(World _world, Vector2 _position)
            : base(_world, _position)
        {
            playerIndex = playerCount++;
            color = PlayerCharacter.Colors[playerIndex];
            accelerate = 0;
            rotate = 0;

            isDead = false;

            this.angVelocity = 0;
            //build the unicycle
            CircleDef circleDef = new CircleDef();
            circleDef.Radius = 1;
            circleDef.Density = 1f;
            circleDef.Friction = 1.0f;
            circleDef.Restitution = 0.0f;
            circleDef.LocalPosition.Set(0, 0);

            wheel = body.CreateShape(circleDef);
            body.SetMassFromShapes();
            body.SetUserData(this); // link body and this to register collisions in this

            //build the head and connect with the wheel
            BodyDef bodydef = new BodyDef();
            bodydef.Position = _position + new Vector2(0.0f, 3.5f);
            bodydef.Angle = 0f;

            chest = _world.CreateBody(bodydef);

            //add the head
            circleDef.Density = 0.0001f;
            circleDef.Radius = 0.75f;
            circleDef.LocalPosition.Set(0, 3);
            head = chest.CreateShape(circleDef);

            rotationHead = _position;

            PolygonDef Boxdef = new PolygonDef();
            Boxdef.SetAsBox(1, 1.5f);
            Boxdef.Density = 0.25f;
            Boxdef.Friction = 0.4f;
            Box2DX.Collision.Shape s2 = chest.CreateShape(Boxdef);
            chest.SetMassFromShapes();
            chest.SetUserData(this);

            //Jointshit
            RevoluteJointDef jointDefKW = new RevoluteJointDef();
            jointDefKW.Body2 = chest;
            jointDefKW.Body1 = body;
            jointDefKW.CollideConnected = false;
            jointDefKW.LocalAnchor2 = new Vector2(-0.0f, -3.8f);
            jointDefKW.LocalAnchor1 = new Vector2(0, 0);
            jointDefKW.EnableLimit = false;

            _world.CreateJoint(jointDefKW);

            // add visuals
            Texture wheelTexture = AssetManager.getTexture(AssetManager.TextureName.ShoopWheel);
            wheelSprite = new AnimatedSprite(wheelTexture, 1.0f, 1, (Vector2)wheelTexture.Size);
            wheelSprite.Scale = Constants.windowScaleFactor * new Vector2(0.2f, 0.2f); //(Vector2.One / (Vector2)wheelTexture.Size * 2F * circleDef.Radius).toScreenCoord() - Vector2.Zero.toScreenCoord();//new Vector2(0.08f, 0.08f);
            wheelSprite.Origin = ((Vector2)wheelSprite.spriteSize) / 2F;

            sheepSprite = new Sprite(AssetManager.getTexture(AssetManager.TextureName.ShoopInfronUnicycle));
            sheepSprite.Origin = ((Vector2)sheepSprite.Texture.Size) / 2F;
            sheepSprite.Scale = Constants.windowScaleFactor *  new Vector2(_position.X > Constants.worldSizeX / 2F ? -0.2f : 0.2f, 0.2f);
        }
Example #51
0
		public Car()
		{
			{	// car body
				PolygonDef poly1 = new PolygonDef(), poly2 = new PolygonDef();

				// bottom half
				poly1.VertexCount = 5;
				poly1.Vertices[4].Set(-2.2f, -0.74f);
				poly1.Vertices[3].Set(-2.2f, 0);
				poly1.Vertices[2].Set(1.0f, 0);
				poly1.Vertices[1].Set(2.2f, -0.2f);
				poly1.Vertices[0].Set(2.2f, -0.74f);
				poly1.Filter.GroupIndex = -1;

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

				// top half
				poly2.VertexCount = 4;
				poly2.Vertices[3].Set(-1.7f, 0);
				poly2.Vertices[2].Set(-1.3f, 0.7f);
				poly2.Vertices[1].Set(0.5f, 0.74f);
				poly2.Vertices[0].Set(1.0f, 0);
				poly2.Filter.GroupIndex = -1;

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

				BodyDef bd = new BodyDef();
				bd.Position.Set(-35.0f, 2.8f);

				_vehicle = _world.CreateBody(bd);
				_vehicle.CreateShape(poly1);
				_vehicle.CreateShape(poly2);
				_vehicle.SetMassFromShapes();
			}

			{	// vehicle wheels
				CircleDef circ = new CircleDef();
				circ.Density = 40.0f;
				circ.Radius = 0.38608f;
				circ.Friction = 0.8f;
				circ.Filter.GroupIndex = -1;

				BodyDef bd = new BodyDef();
				bd.AllowSleep = false;
				bd.Position.Set(-33.8f, 2.0f);

				_rightWheel = _world.CreateBody(bd);
				_rightWheel.CreateShape(circ);
				_rightWheel.SetMassFromShapes();

				bd.Position.Set(-36.2f, 2.0f);
				_leftWheel = _world.CreateBody(bd);
				_leftWheel.CreateShape(circ);
				_leftWheel.SetMassFromShapes();
			}

			{	// join wheels to chassis
				Vec2 anchor = new Vec2();
				RevoluteJointDef jd = new RevoluteJointDef();
				jd.Initialize(_vehicle, _leftWheel, _leftWheel.GetWorldCenter());
				jd.CollideConnected = false;
				jd.EnableMotor = true;
				jd.MaxMotorTorque = 10.0f;
				jd.MotorSpeed = 0.0f;
				_leftJoint = (RevoluteJoint)_world.CreateJoint(jd);

				jd.Initialize(_vehicle, _rightWheel, _rightWheel.GetWorldCenter());
				jd.CollideConnected = false;
				_rightJoint = (RevoluteJoint)_world.CreateJoint(jd);
			}

			{	// ground
				PolygonDef box = new PolygonDef();
				box.SetAsBox(19.5f, 0.5f);
				box.Friction = 0.62f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(-25.0f, 1.0f);

				Body ground = _world.CreateBody(bd);
				ground.CreateShape(box);
			}

			{	// more ground
				PolygonDef box = new PolygonDef();
				BodyDef bd = new BodyDef();

				box.SetAsBox(9.5f, 0.5f, Vec2.Zero, 0.1f * Box2DX.Common.Settings.Pi);
				box.Friction = 0.62f;
				bd.Position.Set(27.0f - 30.0f, 3.1f);

				Body ground = _world.CreateBody(bd);
				ground.CreateShape(box);
			}

			{	// more ground
				PolygonDef box = new PolygonDef();
				BodyDef bd = new BodyDef();

				box.SetAsBox(9.5f, 0.5f, Vec2.Zero, -0.1f * Box2DX.Common.Settings.Pi);
				box.Friction = 0.62f;
				bd.Position.Set(55.0f - 30.0f, 3.1f);

				Body ground = _world.CreateBody(bd);
				ground.CreateShape(box);
			}

			{	// more ground
				PolygonDef box = new PolygonDef();
				BodyDef bd = new BodyDef();

				box.SetAsBox(9.5f, 0.5f, Vec2.Zero, 0.03f * Box2DX.Common.Settings.Pi);
				box.Friction = 0.62f;
				bd.Position.Set(41.0f, 2.0f);

				Body ground = _world.CreateBody(bd);
				ground.CreateShape(box);
			}

			{	// more ground
				PolygonDef box = new PolygonDef();
				BodyDef bd = new BodyDef();

				box.SetAsBox(5.0f, 0.5f, Vec2.Zero, 0.15f * Box2DX.Common.Settings.Pi);
				box.Friction = 0.62f;
				bd.Position.Set(50.0f, 4.0f);

				Body ground = _world.CreateBody(bd);
				ground.CreateShape(box);
			}

			{	// more ground
				PolygonDef box = new PolygonDef();
				BodyDef bd = new BodyDef();

				box.SetAsBox(20.0f, 0.5f);
				box.Friction = 0.62f;
				bd.Position.Set(85.0f, 2.0f);

				Body ground = _world.CreateBody(bd);
				ground.CreateShape(box);
			}
		}
Example #52
0
		public void LaunchBomb()
		{
			if (_bomb != null)
			{
				_world.DestroyBody(_bomb);
				_bomb = null;
			}

			BodyDef bd = new BodyDef();
			bd.AllowSleep = true;
			bd.Position.Set(Box2DX.Common.Math.Random(-15.0f, 15.0f), 30.0f);
			bd.IsBullet = true;
			_bomb = _world.CreateBody(bd);
			_bomb.SetLinearVelocity(-5.0f * bd.Position);

			CircleDef sd = new CircleDef();
			sd.Radius = 0.3f;
			sd.Density = 20.0f;
			sd.Restitution = 0.1f;
			_bomb.CreateShape(sd);

			_bomb.SetMassFromShapes();
		}
Example #53
0
		public CollisionProcessing()
		{
			// Ground body
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);
				sd.Friction = 0.3f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);

				Body ground = _world.CreateBody(bd);
				ground.CreateShape(sd);
			}

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

			// Small triangle
			PolygonDef triangleShapeDef = new PolygonDef();
			triangleShapeDef.VertexCount = 3;
			triangleShapeDef.Vertices[0].Set(-1.0f, 0.0f);
			triangleShapeDef.Vertices[1].Set(1.0f, 0.0f);
			triangleShapeDef.Vertices[2].Set(0.0f, 2.0f);
			triangleShapeDef.Density = 1.0f;

			BodyDef triangleBodyDef = new BodyDef();
			//triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
			triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 35f);

			Body body1 = _world.CreateBody(triangleBodyDef);
			body1.CreateShape(triangleShapeDef);
			body1.SetMassFromShapes();

			// Large triangle (recycle definitions)
			triangleShapeDef.Vertices[0] *= 2.0f;
			triangleShapeDef.Vertices[1] *= 2.0f;
			triangleShapeDef.Vertices[2] *= 2.0f;
			//triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
			triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 30f);

			Body body2 = _world.CreateBody(triangleBodyDef);
			body2.CreateShape(triangleShapeDef);
			body2.SetMassFromShapes();

			// Small box
			PolygonDef boxShapeDef = new PolygonDef();
			boxShapeDef.SetAsBox(1.0f, 0.5f);
			boxShapeDef.Density = 1.0f;

			BodyDef boxBodyDef = new BodyDef();
			//boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
			boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 25f);

			Body body3 = _world.CreateBody(boxBodyDef);
			body3.CreateShape(boxShapeDef);
			body3.SetMassFromShapes();

			// Large box (recycle definitions)
			boxShapeDef.SetAsBox(2.0f, 1.0f);
			//boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
			boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 15f);

			Body body4 = _world.CreateBody(boxBodyDef);
			body4.CreateShape(boxShapeDef);
			body4.SetMassFromShapes();

			// Small circle
			CircleDef circleShapeDef = new CircleDef();
			circleShapeDef.Radius = 1.0f;
			circleShapeDef.Density = 1.0f;

			BodyDef circleBodyDef = new BodyDef();
			//circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
			circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 10f);

			Body body5 = _world.CreateBody(circleBodyDef);
			body5.CreateShape(circleShapeDef);
			body5.SetMassFromShapes();

			// Large circle
			circleShapeDef.Radius *= 2.0f;
			//circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi));
			circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 5f);

			Body body6 = _world.CreateBody(circleBodyDef);
			body6.CreateShape(circleShapeDef);
			body6.SetMassFromShapes();
		}
Example #54
0
		public CCDTest()
		{
			const float k_restitution = 1.4f;

			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, 20.0f);
				Body body = _world.CreateBody(bd);

				PolygonDef sd = new PolygonDef();
				sd.Density = 0.0f;
				sd.Restitution = k_restitution;

				sd.SetAsBox(0.1f, 10.0f, new Vec2(-10.0f, 0.0f), 0.0f);
				body.CreateShape(sd);

				sd.SetAsBox(0.1f, 10.0f, new Vec2(10.0f, 0.0f), 0.0f);
				body.CreateShape(sd);

				sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, -10.0f), 0.5f * Box2DX.Common.Settings.Pi);
				body.CreateShape(sd);

				sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, 10.0f), -0.5f * Box2DX.Common.Settings.Pi);
				body.CreateShape(sd);
			}

			{
				PolygonDef sd_bottom = new PolygonDef();
				sd_bottom.SetAsBox( 1.5f, 0.15f );
				sd_bottom.Density = 4.0f;

				PolygonDef sd_left = new PolygonDef();
				sd_left.SetAsBox(0.15f, 2.7f, new Vec2(-1.45f, 2.35f), 0.2f);
				sd_left.Density = 4.0f;

				PolygonDef sd_right = new PolygonDef();
				sd_right.SetAsBox(0.15f, 2.7f, new Vec2(1.45f, 2.35f), -0.2f);
				sd_right.Density = 4.0f;

				BodyDef bd = new BodyDef();
				bd.Position.Set( 0.0f, 15.0f );
				Body body = _world.CreateBody(bd);
				body.CreateShape(sd_bottom);
				body.CreateShape(sd_left);
				body.CreateShape(sd_right);
				body.SetMassFromShapes();
			}

			for (int i = 0; i < 0; ++i)
			{
				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, 15.0f + i);
				bd.IsBullet = true;
				Body body = _world.CreateBody(bd);
				body.SetAngularVelocity(Box2DX.Common.Math.Random(-50.0f, 50.0f));

				CircleDef sd = new CircleDef();
				sd.Radius = 0.25f;
				sd.Density = 1.0f;
				sd.Restitution = 0.0f;
				body.CreateShape(sd);
				body.SetMassFromShapes();
			}
		}
        private Body CreatePole(Vec2 basePos, float angle, float radius, float friction, float restitution, float density, ushort layers)
        {
            // ==== Create bar. ====
            // Determine position of top of pole relative to its center of mass.
            Vec2 polePosTopRelative = new Vec2(__ArmLength * (float)-SysMath.Sin(angle), __ArmLength * (float)SysMath.Cos(angle));
            Vec2 polePosTop = polePosTopRelative + basePos;
            Vec2 polePosCenter = (polePosTopRelative * 0.5f) + basePos;

            BodyDef bodyDef = new BodyDef();
            bodyDef.Position.Set(polePosCenter.X, polePosCenter.Y);
            bodyDef.Angle = angle;

            // Create body object; The body is also added to the world.
            Body body = _world.CreateBody(bodyDef);
            PolygonDef shapeDef = new PolygonDef();
            shapeDef.SetAsBox(radius, __ArmLength * 0.5f);
            shapeDef.Friction = friction;
            shapeDef.Restitution = restitution;
            shapeDef.Density = density;
            shapeDef.Filter.MaskBits = layers;
            shapeDef.Filter.CategoryBits = 0x3;
            body.CreateShape(shapeDef);

            // ==== Place some end caps on the bar. ====
            CircleDef circleDef = new CircleDef();
            circleDef.Radius = radius;
            circleDef.Friction = friction;
            circleDef.Restitution = restitution;
            circleDef.Density = 0f;
            circleDef.Filter.MaskBits = layers;
            circleDef.Filter.CategoryBits = 0x3;
            // Top cap.
            circleDef.LocalPosition.Set(0f, __ArmLength * 0.5f);
            body.CreateShape(circleDef);

            // Bottom cap.
            circleDef.LocalPosition.Set(0f, -__ArmLength * 0.5f);
            body.CreateShape(circleDef);

            body.SetMassFromShapes();
            return body;
        }
Example #56
0
		public CollisionFiltering()
		{
			// Ground body
			{
				PolygonDef sd = new PolygonDef();
				sd.SetAsBox(50.0f, 10.0f);
				sd.Friction = 0.3f;

				BodyDef bd = new BodyDef();
				bd.Position.Set(0.0f, -10.0f);

				Body ground = _world.CreateBody(bd);
				ground.CreateShape(sd);
			}

			// Small triangle
			PolygonDef triangleShapeDef = new PolygonDef();
			triangleShapeDef.VertexCount = 3;
			triangleShapeDef.Vertices[0].Set(-1.0f, 0.0f);
			triangleShapeDef.Vertices[1].Set(1.0f, 0.0f);
			triangleShapeDef.Vertices[2].Set(0.0f, 2.0f);
			triangleShapeDef.Density = 1.0f;

			triangleShapeDef.Filter.GroupIndex = k_smallGroup;
			triangleShapeDef.Filter.CategoryBits = k_triangleCategory;
			triangleShapeDef.Filter.MaskBits = k_triangleMask;

			BodyDef triangleBodyDef = new BodyDef();
			triangleBodyDef.Position.Set(-5.0f, 2.0f);

			Body body1 = _world.CreateBody(triangleBodyDef);
			body1.CreateShape(triangleShapeDef);
			body1.SetMassFromShapes();

			// Large triangle (recycle definitions)
			triangleShapeDef.Vertices[0] *= 2.0f;
			triangleShapeDef.Vertices[1] *= 2.0f;
			triangleShapeDef.Vertices[2] *= 2.0f;
			triangleShapeDef.Filter.GroupIndex = k_largeGroup;
			triangleBodyDef.Position.Set(-5.0f, 6.0f);
			triangleBodyDef.FixedRotation = true; // look at me!

			Body body2 = _world.CreateBody(triangleBodyDef);
			body2.CreateShape(triangleShapeDef);
			body2.SetMassFromShapes();

			// Small box
			PolygonDef boxShapeDef = new PolygonDef();
			boxShapeDef.SetAsBox(1.0f, 0.5f);
			boxShapeDef.Density = 1.0f;

			boxShapeDef.Filter.GroupIndex = k_smallGroup;
			boxShapeDef.Filter.CategoryBits = k_boxCategory;
			boxShapeDef.Filter.MaskBits = k_boxMask;

			BodyDef boxBodyDef = new BodyDef();
			boxBodyDef.Position.Set(0.0f, 2.0f);

			Body body3 = _world.CreateBody(boxBodyDef);
			body3.CreateShape(boxShapeDef);
			body3.SetMassFromShapes();

			// Large box (recycle definitions)
			boxShapeDef.SetAsBox(2.0f, 1.0f);
			boxShapeDef.Filter.GroupIndex = k_largeGroup;
			boxBodyDef.Position.Set(0.0f, 6.0f);

			Body body4 = _world.CreateBody(boxBodyDef);
			body4.CreateShape(boxShapeDef);
			body4.SetMassFromShapes();

			// Small circle
			CircleDef circleShapeDef = new CircleDef();
			circleShapeDef.Radius = 1.0f;
			circleShapeDef.Density = 1.0f;

			circleShapeDef.Filter.GroupIndex = k_smallGroup;
			circleShapeDef.Filter.CategoryBits = k_circleCategory;
			circleShapeDef.Filter.MaskBits = k_circleMask;

			BodyDef circleBodyDef = new BodyDef();
			circleBodyDef.Position.Set(5.0f, 2.0f);

			Body body5 = _world.CreateBody(circleBodyDef);
			body5.CreateShape(circleShapeDef);
			body5.SetMassFromShapes();

			// Large circle
			circleShapeDef.Radius *= 2.0f;
			circleShapeDef.Filter.GroupIndex = k_largeGroup;
			circleBodyDef.Position.Set(5.0f, 6.0f);

			Body body6 = _world.CreateBody(circleBodyDef);
			body6.CreateShape(circleShapeDef);
			body6.SetMassFromShapes();
		}