コード例 #1
0
ファイル: BodyExt.cs プロジェクト: alanmbennett/Diez
 public static MotorJoint CreateMotorJoint(this Body body, Body bodyB, bool useWorldCoordinates = false)
 {
     return(JointFactory.CreateMotorJoint(body.World, body, bodyB, useWorldCoordinates));
 }
コード例 #2
0
        /// <summary>
        /// Updates the state of the game. This method checks the GameScreen.IsActive
        /// property, so the game will stop updating when the pause menu is active,
        /// or if you tab away to a different application.
        /// </summary>
        public override void Update(GameTime gameTime, bool otherScreenHasFocus,
                                    bool coveredByOtherScreen)
        {
            base.Update(gameTime, otherScreenHasFocus, false);

            // Gradually fade in or out depending on whether we are covered by the pause screen.
            if (coveredByOtherScreen)
            {
                pauseAlpha = Math.Min(pauseAlpha + 1f / 32, 1);
            }
            else
            {
                pauseAlpha = Math.Max(pauseAlpha - 1f / 32, 0);
            }

            if (IsActive)
            {
                mouse = Mouse.GetState();
                // bloom
                bloom.Visible  = true;
                bloom.Settings = BloomSettings.PresetSettings[bloomSettingsIndex];

                // update entites

                playerBody.update(gameTime);

                foreach (Pickupable pickupable in pickuables)
                {
                    if (pickupable.getSetIsTouchingPlayer && playerBody.getSetWantsToPickUp && !playerBody.getSetHasPickedUp)
                    {
                        // joints.Add ( JointFactory.CreateRevoluteJoint(world,playerBody.playerBody,
                        //   pickupable.getBody, new Vector2(0,0)));

                        Joints.Add(JointFactory.CreateDistanceJoint(world, playerBody.playerBody, pickupable.getBody, new Vector2(0, 0), new Vector2(0, 0)));


                        playerBody.getSetWantsToPickUp      = false;
                        pickupable.getSetIsAttachedToPlayer = true;



                        playerBody.getSetHasPickedUp = true;
                    }

                    if (Joints.Count > 0 && playerBody.getSetWantsTodrop && playerBody.getSetHasPickedUp && pickupable.getSetIsAttachedToPlayer)
                    {
                        // for some reason the on seperation dosn't work when removing a joint. So we force the pickupable to not touching the player
                        world.RemoveJoint(Joints[0]);
                        Joints.RemoveAt(0);
                        playerBody.getSetHasPickedUp        = false;
                        pickupable.getSetIsAttachedToPlayer = false;
                        pickupable.getSetIsTouchingPlayer   = false;
                    }
                }


                if (playerBody.isAlive == false)
                {
                    bloom.Visible = false;

                    world.Clear();


                    this.ExitScreen();

                    LoadingScreen.Load(ScreenManager, false, PlayerIndex.One, new DeadScreen(0));
                }



                //game script


                if (GreenTestStarted == false)
                {
                    Timer += gameTime.ElapsedGameTime.Milliseconds;
                }
                if (Timer > timerForGreenTest && GreenTestStarted == false && MediaPlayer.State == MediaState.Stopped)
                {
                    Timer            = 0;
                    GreenTestStarted = true;


                    UI.setSub = "Welcome my name is Vivi. Move to and touch the red square to continue.";
                    Squares.Add(new Square(content.Load <Texture2D>("Squares/redSquare"), new Vector2(800, 100), true, world));
                    //      MediaPlayer.Play(Welcome);
                    WelcomeSFXInstance.Play();
                }

                if (GreenTestStarted == true && GreenTestComplete == false)
                {
                    if (Squares[0].isTouching)
                    {
                        GreenTestComplete = true;
                        BlueTestStarted   = true;
                        UI.setSub         = "Wonderful, now fire your laser at the blue square.";
                        //  MediaPlayer.Play(Blue);
                        if (WelcomeSFXInstance.State == SoundState.Stopped)
                        {
                            WelcomeSFXInstance.Stop();
                            BlueSFX.Play();
                        }

                        Squares.Add(new Square(content.Load <Texture2D>("Squares/blueSquare"), new Vector2(100, 500), true, world));
                        playerBody.getSetLaserStatus = true;
                        world.RemoveBody(Squares[0].squareBody);
                        Squares.RemoveAt(0);
                    }
                }


                if (BlueTestStarted && BlueTestComplete == false)
                {
                    if (Squares[0].isTouchingLaser)
                    {
                        BlueTestComplete = true;
                        world.RemoveBody(Squares[0].squareBody);
                        Squares.RemoveAt(0);

                        UI.setSub = "Excellent, now pick up and move the pink square into the pink area.";
                        //    MediaPlayer.Play(Pink);

                        PinkSFX.Play();
                        pickuables.Add(new Pickupable(content.Load <Texture2D>("Squares/pinkSquare"), new Vector2(10, 50), world));
                        Areas.Add(new Area(content.Load <Texture2D>("pinkArea"), new Vector2(800, 500), 1.57f, world));

                        Timer = 0;
                    }
                }

                if (BlueTestComplete && GreenTestComplete)
                {
                    PinkTestStarted = true;

                    if (PinkTestCompleted == false)
                    {
                        if (Areas[0].getIsPickUpTouching && playerBody.getSetHasPickedUp == false)
                        {
                            PinkTestCompleted = true;
                            pickuables.RemoveAt(0);
                            Areas.RemoveAt(0);
                        }
                    }
                }

                // need to add bool for sound fx here.
                if (PinkTestCompleted && UI.Acitve == false && countDownStated == false)
                {
                    if (questionsSpoken == false)
                    {
                        UI.setSub = "You are confirmed operational. Remember only blue, red and pink neon is safe to touch. Questions?";
                        QuestionsSFX.Play();
                        questionsSpoken = true;
                    }
                    Timer += gameTime.ElapsedGameTime.Milliseconds;
                    if (Timer > 2500)
                    {
                        UI.Acitve = true;
                        playerBody.getSetChoicePoint = true;
                        countDownStated = true;
                        Timer           = 0;
                    }
                }
                if (BlueTestComplete && GreenTestComplete && PinkTestCompleted && pressedOk == false)
                {
                    if (playerBody.choiceValue == 2 && questionOneAsked == false)
                    {
                        UI.setSub   = "You are designated as an Operational Perpetuating Organism. Or Opo.";
                        UI.setTextA = "Ok, let's go!";
                        OpoSFXInstance.Play();
                        questionOneAsked = true;
                    }
                    else if (playerBody.choiceValue == 3 && questionTwoAsked == false)
                    {
                        UI.setSub   = "You are in the System.";
                        UI.setTextA = "Ok, let's go!";
                        SystemSFXInstance.Play();
                        questionTwoAsked = true;
                    }
                    else if (playerBody.choiceValue == 1)
                    {
                        pressedOk = true;
                        UI.Acitve = false;
                        UI.setSub = "Loading progress tracker.";
                        Timer     = 0;
                        iniProgressSFXInstance.Play();
                    }
                }

                if (pressedOk && progressLoaded == false)
                {
                    Timer += gameTime.ElapsedGameTime.Milliseconds;
                    if (iniProgressSFXInstance.State != SoundState.Playing && sayThree == false)
                    {
                        UI.setSub = "Three...";
                        ThreeSFXInstance.Play();
                        sayThree = true;
                    }
                    if (ThreeSFXInstance.State != SoundState.Playing && sayTwo == false)
                    {
                        UI.setSub = "Two...";
                        TwoSFXInstance.Play();
                        sayTwo = true;
                    }

                    if (TwoSFXInstance.State != SoundState.Playing && sayOne == false)
                    {
                        UI.setSub = "One...";
                        OneSFXInstance.Play();
                        sayOne = true;
                    }
                    if (OneSFXInstance.State != SoundState.Playing)
                    {
                        UI.setSub = "Progress module loaded.";
                        progressLoadedSFXInstance.Play();
                        playerBody.getSetDrawScore = true;
                        progressLoaded             = true;
                        Timer = 0;
                    }
                }

                if (progressLoaded)
                {
                    Timer += gameTime.ElapsedGameTime.Milliseconds;
                    if (Timer > 2000 && Timer < 4000 && EntryPointSFXInstance.State != SoundState.Playing)
                    {
                        UI.setSub = "Loading courpution entry point.";
                        EntryPointSFXInstance.Play();
                    }
                    if (Timer > 4000 && Timer < 6000 && ThreeSFXInstance.State != SoundState.Playing)
                    {
                        UI.setSub = "Three...";
                        ThreeSFXInstance.Play();
                    }
                    if (Timer > 6000 && Timer < 8000 && TwoSFXInstance.State != SoundState.Playing)
                    {
                        UI.setSub = "Two...";
                        TwoSFXInstance.Play();
                    }
                    if (Timer > 8000 && Timer < 10000 && OneSFXInstance.State != SoundState.Playing)
                    {
                        UI.setSub = "One...";
                        OneSFXInstance.Play();
                    }
                    if (Timer > 10000)
                    {
                        bloom.Visible = false;
                        ExitScreen();
                        LoadingScreen.Load(ScreenManager, true, PlayerIndex.One, new ChapterOne());
                    }
                }


                // limts on the cam.

                cam2D.MaxRotation = 0.001f;
                cam2D.MinRotation = -0.001f;

                cam2D.MaxPosition = new Vector2(((playerBody.playerBody.Position.X) * 64 + 1), ((playerBody.playerBody.Position.Y) * 64) + 1);
                cam2D.MinPosition = new Vector2(((playerBody.playerBody.Position.X) * 64) + 2, ((playerBody.playerBody.Position.Y) * 64) + 1);
                cam2D.Update(gameTime);



                world.Step((float)gameTime.ElapsedGameTime.TotalMilliseconds * 0.001f);
            }
        }
コード例 #3
0
        public override void LoadContent()
        {
            base.LoadContent();

            World.Gravity = new Vector2(0f, -10f);

            HasCursor           = false;
            EnableCameraControl = true;
            HasVirtualStick     = true;

            // terrain
            _ground = World.CreateBody();
            {
                Vertices terrain = new Vertices();
                terrain.Add(new Vector2(-20f, 5f));
                terrain.Add(new Vector2(-20f, 0f));
                terrain.Add(new Vector2(20f, 0f));
                terrain.Add(new Vector2(25f, 0.25f));
                terrain.Add(new Vector2(30f, 1f));
                terrain.Add(new Vector2(35f, 4f));
                terrain.Add(new Vector2(40f, 0f));
                terrain.Add(new Vector2(45f, 0f));
                terrain.Add(new Vector2(50f, -1f));
                terrain.Add(new Vector2(55f, -2f));
                terrain.Add(new Vector2(60f, -2f));
                terrain.Add(new Vector2(65f, -1.25f));
                terrain.Add(new Vector2(70f, 0f));
                terrain.Add(new Vector2(75f, 0.3f));
                terrain.Add(new Vector2(80f, 1.5f));
                terrain.Add(new Vector2(85f, 3.5f));
                terrain.Add(new Vector2(90f, 0f));
                terrain.Add(new Vector2(95f, -0.5f));
                terrain.Add(new Vector2(100f, -1f));
                terrain.Add(new Vector2(105f, -2f));
                terrain.Add(new Vector2(110f, -2.5f));
                terrain.Add(new Vector2(115f, -1.3f));
                terrain.Add(new Vector2(120f, 0f));
                terrain.Add(new Vector2(160f, 0f));
                terrain.Add(new Vector2(159f, -10f));
                terrain.Add(new Vector2(201f, -10f));
                terrain.Add(new Vector2(200f, 0f));
                terrain.Add(new Vector2(240f, 0f));
                terrain.Add(new Vector2(250f, 5f));
                terrain.Add(new Vector2(250f, -10f));
                terrain.Add(new Vector2(270f, -10f));
                terrain.Add(new Vector2(270f, 0));
                terrain.Add(new Vector2(310f, 0));
                terrain.Add(new Vector2(310f, 5));

                for (int i = 0; i < terrain.Count - 1; ++i)
                {
                    _ground.CreateEdge(terrain[i], terrain[i + 1]);
                }

                _ground.SetFriction(0.6f);
            }

            // teeter board
            {
                _board          = World.CreateBody();
                _board.BodyType = BodyType.Dynamic;
                _board.Position = new Vector2(140.0f, 1.0f);

                PolygonShape box = new PolygonShape(PolygonTools.CreateRectangle(20.0f / 2f, 0.5f / 2f), 1);
                _teeter =
                    new Sprite(ScreenManager.Assets.TextureFromShape(box, MaterialType.Pavement, Color.LightGray, 1.2f));

                _board.CreateFixture(box);

                RevoluteJoint teeterAxis = JointFactory.CreateRevoluteJoint(World, _ground, _board, Vector2.Zero);
                teeterAxis.LowerLimit   = -8.0f * MathHelper.Pi / 180.0f;
                teeterAxis.UpperLimit   = 8.0f * MathHelper.Pi / 180.0f;
                teeterAxis.LimitEnabled = true;

                _board.ApplyAngularImpulse(100.0f);
            }

            // bridge
            {
                _bridgeSegments = new List <Body>();

                const int    segmentCount = 20;
                PolygonShape shape        = new PolygonShape(PolygonTools.CreateRectangle(1.0f, 0.125f), 1f);
                _bridge = new Sprite(ScreenManager.Assets.TextureFromShape(shape, MaterialType.Dots, Color.SandyBrown, 1f));

                Body prevBody = _ground;
                for (int i = 0; i < segmentCount; ++i)
                {
                    Body body = World.CreateBody();
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(161f + 2f * i, -0.125f);
                    Fixture fix = body.CreateFixture(shape);
                    fix.Friction = 0.6f;
                    JointFactory.CreateRevoluteJoint(World, prevBody, body, -Vector2.UnitX);

                    prevBody = body;
                    _bridgeSegments.Add(body);
                }
                JointFactory.CreateRevoluteJoint(World, _ground, prevBody, Vector2.UnitX);
            }

            // boxes
            {
                _boxes = new List <Body>();
                PolygonShape box = new PolygonShape(PolygonTools.CreateRectangle(0.5f, 0.5f), 1f);
                _box = new Sprite(ScreenManager.Assets.TextureFromShape(box, MaterialType.Squares, Color.SaddleBrown, 2f));

                Body body = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(220f, 0.5f);
                body.CreateFixture(box);
                _boxes.Add(body);

                body          = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(220f, 1.5f);
                body.CreateFixture(box);
                _boxes.Add(body);

                body          = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(220f, 2.5f);
                body.CreateFixture(box);
                _boxes.Add(body);
            }

            // car
            {
                Vertices vertices = new Vertices(8);
                vertices.Add(new Vector2(-2.5f, -0.08f));
                vertices.Add(new Vector2(-2.375f, 0.46f));
                vertices.Add(new Vector2(-0.58f, 0.92f));
                vertices.Add(new Vector2(0.46f, 0.92f));
                vertices.Add(new Vector2(2.5f, 0.17f));
                vertices.Add(new Vector2(2.5f, -0.205f));
                vertices.Add(new Vector2(2.3f, -0.33f));
                vertices.Add(new Vector2(-2.25f, -0.35f));

                PolygonShape chassis    = new PolygonShape(vertices, 2);
                CircleShape  wheelShape = new CircleShape(0.5f, 0.8f);

                _car          = World.CreateBody();
                _car.BodyType = BodyType.Dynamic;
                _car.Position = new Vector2(0.0f, 1.0f);
                _car.CreateFixture(chassis);

                _wheelBack          = World.CreateBody();
                _wheelBack.BodyType = BodyType.Dynamic;
                _wheelBack.Position = new Vector2(-1.709f, 0.78f);
                _wheelBack.CreateFixture(wheelShape);
                _wheelBack.SetFriction(0.9f);

                wheelShape.Density   = 1;
                _wheelFront          = World.CreateBody();
                _wheelFront.BodyType = BodyType.Dynamic;
                _wheelFront.Position = new Vector2(1.54f, 0.8f);
                _wheelFront.CreateFixture(wheelShape);

                Vector2 axis = new Vector2(0.0f, 1.2f);
                _springBack                = new WheelJoint(_car, _wheelBack, _wheelBack.Position, axis, true);
                _springBack.MotorSpeed     = 0.0f;
                _springBack.MaxMotorTorque = 20.0f;
                _springBack.MotorEnabled   = true;
                _springBack.Frequency      = 4.0f;
                _springBack.DampingRatio   = 0.7f;
                World.Add(_springBack);

                _springFront                = new WheelJoint(_car, _wheelFront, _wheelFront.Position, axis, true);
                _springFront.MotorSpeed     = 0.0f;
                _springFront.MaxMotorTorque = 10.0f;
                _springFront.MotorEnabled   = false;
                _springFront.Frequency      = 4.0f;
                _springFront.DampingRatio   = 0.7f;
                World.Add(_springFront);

                _carBody = new Sprite(ScreenManager.Content.Load <Texture2D>("Samples/car"), AssetCreator.CalculateOrigin(_car, 24f));
                _wheel   = new Sprite(ScreenManager.Content.Load <Texture2D>("Samples/wheel"));
            }

            Camera.MinRotation = -0.05f;
            Camera.MaxRotation = 0.05f;

            Camera.TrackingBody   = _car;
            Camera.EnableTracking = true;
        }
コード例 #4
0
        public Weapon(SPRWorld sprWorld, Bot bot, Vector2 relativePosition, float relativeRotation, String textureName, Vector2 scale, WeaponType weaponType, float health, float power)
        {
            m_SPRWorld        = sprWorld;
            m_Time            = 0;
            this.m_owner      = bot;
            this.m_firing     = false;
            this.m_reloadTime = weaponType == WeaponType.melee ? 0 : .2f;
            this.m_reloading  = 0;
            this.weaponType   = weaponType;
            this.m_power      = power;
            m_Position        = relativePosition;
            m_Rotation        = relativeRotation;
            m_Texture         = TextureStatic.Get(textureName);
            m_Scale           = scale;
            this.m_health     = health;

            Vertices v = SPRWorld.computedSpritePolygons[textureName];

            // Simplify the object until it has few enough verticies.
            while (v.Count > Physics.Settings.MaxPolygonVertices) // Infinite loop potential?
            {
                v = SimplifyTools.DouglasPeuckerSimplify(v, 2);   // Where 2 is a completely arbitrary number?
            }

            v.Scale(ref scale);
            //v.Translate(ref relativePosition);
            v.Rotate(relativeRotation);

            Fixture f = FixtureFactory.CreatePolygon(v, 1f, bot.Body, relativePosition);

            m_Fixture     = f;
            f.Friction    = 0.5f;
            f.Restitution = 0f;
            f.UserData    = this;
            if (this.weaponType == WeaponType.melee)
            {
                Body tempBody = BodyFactory.CreateBody(m_SPRWorld.World);
                tempBody.BodyType = BodyType.Dynamic;
                Vertices v2 = SPRWorld.computedSpritePolygons["Axe"];
                // Simplify the object until it has few enough verticies.
                while (v2.Count > Physics.Settings.MaxPolygonVertices) // Infinite loop potential?
                {
                    v2 = SimplifyTools.DouglasPeuckerSimplify(v2, 2);  // Where 2 is a completely arbitrary number?
                }
                Fixture f2 = FixtureFactory.CreatePolygon(SPRWorld.computedSpritePolygons[textureName], 0.1f, tempBody);
                f2.Friction    = 0.5f;
                f2.Restitution = 0f;
                tempBody.SetTransform(this.GetAbsPosition(), this.GetAbsRotation());
                Projectile justFired = new Projectile(m_SPRWorld, tempBody, TextureStatic.Get("Axe"), new Vector2(0, 0), this.GetRelRotation(), 5, Settings.MetersPerPixel * 80, 80 * Settings.MetersPerPixel, m_power, m_health);
                f2.UserData     = justFired;
                f2.OnCollision += Projectile.OnMeleeHit;
                RevoluteJoint joint = JointFactory.CreateRevoluteJoint(m_SPRWorld.World, this.m_owner.Body, tempBody, Vector2.Zero);
                joint.MaxMotorTorque = 160;
                joint.LimitEnabled   = true;
                joint.MotorEnabled   = true;
                joint.LowerLimit     = -(float)Math.PI / 4f;
                joint.UpperLimit     = (float)Math.PI / 4f;
                m_AxeJoint           = joint;
                m_SPRWorld.AddEntity(justFired);
            }
        }
コード例 #5
0
ファイル: RevoluteJointInfo.cs プロジェクト: Banbury/duality
 protected override Joint CreateJoint(Body bodyA, Body bodyB)
 {
     return(bodyA != null && bodyB != null?JointFactory.CreateRevoluteJoint(Scene.PhysicsWorld, bodyA, bodyB, Vector2.Zero) : null);
 }
コード例 #6
0
        private BodyTypesTest()
        {
            Body ground;
            {
                BodyDef bd = new BodyDef();
                ground = BodyFactory.CreateFromDef(World, bd);

                EdgeShape shape = new EdgeShape(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f));

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

                ground.AddFixture(fd);
            }

            // Define attachment
            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(0.0f, 3.0f);
                _attachment = BodyFactory.CreateFromDef(World, bd);

                PolygonShape shape = new PolygonShape(2.0f);
                shape.SetAsBox(0.5f, 2.0f);
                _attachment.AddFixture(shape);
            }

            // Define platform
            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(-4.0f, 5.0f);
                _platform   = BodyFactory.CreateFromDef(World, bd);

                PolygonShape shape = new PolygonShape(2.0f);
                shape.SetAsBox(0.5f, 4.0f, new Vector2(4.0f, 0.0f), 0.5f * MathConstants.Pi);

                FixtureDef fd = new FixtureDef();
                fd.Shape    = shape;
                fd.Friction = 0.6f;
                _platform.AddFixture(fd);

                RevoluteJointDef rjd = new RevoluteJointDef();
                rjd.Initialize(_attachment, _platform, new Vector2(0.0f, 5.0f));
                rjd.MaxMotorTorque = 50.0f;
                rjd.EnableMotor    = true;
                JointFactory.CreateFromDef(World, rjd);

                PrismaticJointDef pjd = new PrismaticJointDef();
                pjd.Initialize(ground, _platform, new Vector2(0.0f, 5.0f), new Vector2(1.0f, 0.0f));

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

                JointFactory.CreateFromDef(World, pjd);

                _speed = 3.0f;
            }

            // Create a payload
            {
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(0.0f, 8.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);

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

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

                body.AddFixture(fd);
            }
        }
コード例 #7
0
        private RevoluteJointTest()
        {
            Body ground;

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

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

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

                //fd.Filter.Category = 2;

                ground.AddFixture(fd);
            }

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

            {
                PolygonShape shape = new PolygonShape(5.0f);
                shape.SetAsBox(0.25f, 3.0f, new Vector2(0.0f, 3.0f), 0.0f);

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

                RevoluteJointDef jd = new RevoluteJointDef();
                jd.Initialize(ground, body, new Vector2(-10.0f, 20.5f));
                jd.MotorSpeed     = _motorSpeed;
                jd.MaxMotorTorque = 10000.0f;
                jd.EnableMotor    = _enableMotor;
                jd.LowerAngle     = -0.25f * MathConstants.Pi;
                jd.UpperAngle     = 0.5f * MathConstants.Pi;
                jd.EnableLimit    = _enableLimit;

                _joint1 = (RevoluteJoint)JointFactory.CreateFromDef(World, jd);
            }

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

                BodyDef circle_bd = new BodyDef();
                circle_bd.Type     = BodyType.Dynamic;
                circle_bd.Position = new Vector2(5.0f, 30.0f);

                FixtureDef fd = new FixtureDef();
                fd.Filter.CategoryMask = Category.Cat1;
                fd.Shape = circle_shape;

                _ball = BodyFactory.CreateFromDef(World, circle_bd);
                _ball.AddFixture(fd);

                PolygonShape polygon_shape = new PolygonShape(2.0f);
                polygon_shape.SetAsBox(10.0f, 0.5f, new Vector2(-10.0f, 0.0f), 0.0f);

                BodyDef polygon_bd = new BodyDef();
                polygon_bd.Position = new Vector2(20.0f, 10.0f);
                polygon_bd.Type     = BodyType.Dynamic;
                polygon_bd.IsBullet = true;
                Body polygon_body = BodyFactory.CreateFromDef(World, polygon_bd);
                polygon_body.AddFixture(polygon_shape);

                RevoluteJointDef jd = new RevoluteJointDef();
                jd.Initialize(ground, polygon_body, new Vector2(19.0f, 10.0f));
                jd.LowerAngle     = -0.25f * MathConstants.Pi;
                jd.UpperAngle     = 0.0f * MathConstants.Pi;
                jd.EnableLimit    = true;
                jd.EnableMotor    = true;
                jd.MotorSpeed     = 0.0f;
                jd.MaxMotorTorque = 10000.0f;

                _joint2 = (RevoluteJoint)JointFactory.CreateFromDef(World, jd);
            }
        }
コード例 #8
0
ファイル: BodyExt.cs プロジェクト: alanmbennett/Diez
 public static GearJoint CreateGearJoint(this Body body, Body bodyB, Joint jointA, Joint jointB, float ratio)
 {
     return(JointFactory.CreateGearJoint(body.World, body, bodyB, jointA, jointB, ratio));
 }
コード例 #9
0
ファイル: BodyExt.cs プロジェクト: alanmbennett/Diez
 public static FixedMouseJoint CreateFixedMouseJoint(this Body body, Vector2 worldAnchor)
 {
     return(JointFactory.CreateFixedMouseJoint(body.World, body, FSConvert.DisplayToSim * worldAnchor));
 }
コード例 #10
0
ファイル: BodyExt.cs プロジェクト: alanmbennett/Diez
 public static AngleJoint CreateAngleJoint(this Body body, Body bodyB)
 {
     return(JointFactory.CreateAngleJoint(body.World, body, bodyB));
 }
コード例 #11
0
ファイル: BodyExt.cs プロジェクト: alanmbennett/Diez
 public static FrictionJoint CreateFrictionJoint(this Body body, Body bodyB, Vector2 anchor,
                                                 bool useWorldCoordinates = false)
 {
     return(JointFactory.CreateFrictionJoint(body.World, body, bodyB, FSConvert.DisplayToSim * anchor,
                                             useWorldCoordinates));
 }
コード例 #12
0
ファイル: BodyExt.cs プロジェクト: alanmbennett/Diez
 public static PrismaticJoint CreatePrismaticJoint(this Body body, Body bodyB, Vector2 anchor, Vector2 axis,
                                                   bool useWorldCoordinates = false)
 {
     return(JointFactory.CreatePrismaticJoint(body.World, body, bodyB, FSConvert.DisplayToSim * anchor, axis,
                                              useWorldCoordinates));
 }
コード例 #13
0
ファイル: BodyExt.cs プロジェクト: alanmbennett/Diez
 public static RevoluteJoint CreateRevoluteJoint(this Body body, Body bodyB, Vector2 anchor)
 {
     return(JointFactory.CreateRevoluteJoint(body.World, body, bodyB, FSConvert.DisplayToSim * anchor));
 }
コード例 #14
0
ファイル: BodyExt.cs プロジェクト: alanmbennett/Diez
 public static RevoluteJoint CreateRevoluteJoint(this Body body, Body bodyB, Vector2 anchorA, Vector2 anchorB,
                                                 bool useWorldCoordinates = false)
 {
     return(JointFactory.CreateRevoluteJoint(body.World, body, bodyB, FSConvert.DisplayToSim * anchorA,
                                             FSConvert.DisplayToSim * anchorB, useWorldCoordinates));
 }
コード例 #15
0
        private TheoJansenTest()
        {
            _offset     = new Vector2(0.0f, 8.0f);
            _motorSpeed = 2.0f;
            _motorOn    = true;
            Vector2 pivot = new Vector2(0.0f, 0.8f);

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

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

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

                shape.SetTwoSided(new Vector2(50.0f, 0.0f), new Vector2(50.0f, 10.0f));
                ground.AddFixture(shape);
            }

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

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

                Body body = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(shape);
            }

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

                FixtureDef sd = new FixtureDef();
                sd.Shape        = shape;
                sd.Filter.Group = -1;
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = pivot + _offset;
                _chassis    = BodyFactory.CreateFromDef(World, bd);
                _chassis.AddFixture(sd);
            }

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

                FixtureDef sd = new FixtureDef();
                sd.Shape        = shape;
                sd.Filter.Group = -1;
                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = pivot + _offset;
                _wheel      = BodyFactory.CreateFromDef(World, bd);
                _wheel.AddFixture(sd);
            }

            {
                RevoluteJointDef jd = new RevoluteJointDef();
                jd.Initialize(_wheel, _chassis, pivot + _offset);
                jd.CollideConnected = false;
                jd.MotorSpeed       = _motorSpeed;
                jd.MaxMotorTorque   = 400.0f;
                jd.EnableMotor      = _motorOn;
                _motorJoint         = (RevoluteJoint)JointFactory.CreateFromDef(World, jd);
            }

            Vector2 wheelAnchor;

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

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

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

            _wheel.SetTransform(_wheel.Position, -120.0f * MathConstants.Pi / 180.0f);
            CreateLeg(-1.0f, wheelAnchor);
            CreateLeg(1.0f, wheelAnchor);
        }
コード例 #16
0
ファイル: Game1.cs プロジェクト: AlienScribble/Tutorial-Repo
        // I N I T
        protected override void Initialize()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            pixel    = new Rectangle(382, 0, 1, 1);
            gras1    = new Rectangle(12, 144, 45, 92);
            gras2    = new Rectangle(76, 144, 45, 92);
            gras3    = new Rectangle(138, 144, 45, 92);
            BigGrass = new Rectangle(0, 0, 380, 122);

            world = new World(new Vector2(0f, 9.8f)); // world physics sim (provide gravity direction)

            collider_body                     = BodyFactory.CreateCircle(world, con.ToSimUnits(8.0f), 1.0f);
            collider_body.Position            = con.ToSimUnits(400, 10);
            collider_body.BodyType            = BodyType.Dynamic; // moves
            collider_body.Mass                = 0.4f;
            collider_body.Restitution         = 0.2f;             // bounciness
            collider_body.Friction            = 0.4f;             // grip
            collider_body.CollisionCategories = Category.Cat1; collider_body.CollidesWith = Category.All;
            collider_body.FixedRotation       = false;

            // attach collider_body to mouse:
            mouse_joint          = JointFactory.CreateFixedMouseJoint(world, collider_body, collider_body.Position);
            mouse_joint.MaxForce = 500.0f;


            #region 大きな 草
            // <image url="..\..\Images\grass.png" bgcolor="0" /> ookina kusa
            #endregion
            big_grass_body                     = BodyFactory.CreateRectangle(world, con.ToSimUnits(BigGrass.Width * 0.88f), con.ToSimUnits(BigGrass.Height * 0.6f), 1.0f);
            big_grass_body.Position            = con.ToSimUnits(300f + BigGrass.Width / 2f - 10, 600 + BigGrass.Height / 2f);
            big_grass_body.BodyType            = BodyType.Static;
            big_grass_body.Restitution         = 0.2f; // bounciness
            big_grass_body.Friction            = 0.8f; // surface grip
            big_grass_body.Mass                = 1.0f;
            big_grass_body.CollisionCategories = Category.Cat2;
            big_grass_body.CollidesWith        = Category.Cat1;


            // DYNAMIC GRASS (BOTTOM PART):
            gras_bod1                     = BodyFactory.CreateRectangle(world, con.ToSimUnits(gras1.Width * 0.5f), con.ToSimUnits(gras1.Height * 0.4f), 1.0f);
            gras_bod1.Position            = con.ToSimUnits(360, 600 - gras1.Height * 0.2f); // use mid of rect (0.4/2)
            gras_bod1.BodyType            = BodyType.Dynamic;
            gras_bod1.Mass                = 0.2f;
            gras_bod1.Restitution         = 0.2f;
            gras_bod1.Friction            = 0.2f;
            gras_bod1.IgnoreGravity       = true;
            gras_bod1.CollisionCategories = Category.Cat3; gras_bod1.CollidesWith = Category.Cat1;

            float DAMP = 0.23f, HZ = 17.0f;
            gras_joint1 = JointFactory.CreateWeldJoint(world, big_grass_body, gras_bod1,
                                                       con.ToSimUnits(new Vector2(360, 600)), con.ToSimUnits(new Vector2(360, 600)), true);
            gras_joint1.CollideConnected = false;
            gras_joint1.FrequencyHz      = HZ;
            gras_joint1.DampingRatio     = DAMP;


            gras_bod2                     = BodyFactory.CreateRectangle(world, con.ToSimUnits(gras1.Width * 0.5f), con.ToSimUnits(gras1.Height * 0.4f), 1.0f);
            gras_bod2.Position            = con.ToSimUnits(360, 600 - gras1.Height * 0.6);
            gras_bod2.BodyType            = BodyType.Dynamic;
            gras_bod2.Mass                = 0.2f;
            gras_bod1.Restitution         = 0.2f;
            gras_bod2.Friction            = 0.2f;
            gras_bod2.IgnoreGravity       = true;
            gras_bod2.CollisionCategories = Category.Cat3; gras_bod1.CollidesWith = Category.Cat1;

            gras_joint2 = JointFactory.CreateWeldJoint(world, gras_bod1, gras_bod2,
                                                       con.ToSimUnits(new Vector2(360, 600 - gras1.Height * 0.4f)), con.ToSimUnits(new Vector2(360, 600 - gras1.Height * 0.4f)), true);
            gras_joint2.CollideConnected = false;
            gras_joint2.FrequencyHz      = HZ;
            gras_joint2.DampingRatio     = DAMP;

            base.Initialize();
        }
コード例 #17
0
        private void CreateLeg(float s, Vector2 wheelAnchor)
        {
            Vector2 p1 = new Vector2(5.4f * s, -6.1f);
            Vector2 p2 = new Vector2(7.2f * s, -1.2f);
            Vector2 p3 = new Vector2(4.3f * s, -1.9f);
            Vector2 p4 = new Vector2(3.1f * s, 0.8f);
            Vector2 p5 = new Vector2(6.0f * s, 1.5f);
            Vector2 p6 = new Vector2(2.5f * s, 3.7f);

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

            fd1.Filter.Group = -1;
            fd2.Filter.Group = -1;

            PolygonShape poly1 = new PolygonShape(1.0f), poly2 = new PolygonShape(1.0f);

            if (s > 0.0f)
            {
                Vertices vertices = new Vertices(3);

                vertices.Add(p1);
                vertices.Add(p2);
                vertices.Add(p3);
                poly1.Vertices = vertices;

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

                vertices.Add(p1);
                vertices.Add(p3);
                vertices.Add(p2);
                poly1.Vertices = vertices;

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

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

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

            bd1.Type     = BodyType.Dynamic;
            bd2.Type     = BodyType.Dynamic;
            bd1.Position = _offset;
            bd2.Position = p4 + _offset;

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

            Body body1 = BodyFactory.CreateFromDef(World, bd1);
            Body body2 = BodyFactory.CreateFromDef(World, bd2);

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

            {
                DistanceJointDef jd = new DistanceJointDef();

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

                jd.Initialize(body1, body2, p2 + _offset, p5 + _offset);
                JointHelper.LinearStiffness(frequencyHz, dampingRatio, jd.BodyA, jd.BodyB, out float stiffness, out float damping);
                jd.Stiffness = stiffness;
                jd.Damping   = damping;
                JointFactory.CreateFromDef(World, jd);

                jd.Initialize(body1, body2, p3 + _offset, p4 + _offset);
                JointHelper.LinearStiffness(frequencyHz, dampingRatio, jd.BodyA, jd.BodyB, out stiffness, out damping);
                jd.Stiffness = stiffness;
                jd.Damping   = damping;
                JointFactory.CreateFromDef(World, jd);

                jd.Initialize(body1, _wheel, p3 + _offset, wheelAnchor + _offset);
                JointHelper.LinearStiffness(frequencyHz, dampingRatio, jd.BodyA, jd.BodyB, out stiffness, out damping);
                jd.Stiffness = stiffness;
                jd.Damping   = damping;
                JointFactory.CreateFromDef(World, jd);

                jd.Initialize(body2, _wheel, p6 + _offset, wheelAnchor + _offset);
                JointHelper.LinearStiffness(frequencyHz, dampingRatio, jd.BodyA, jd.BodyB, out stiffness, out damping);
                jd.Stiffness = stiffness;
                jd.Damping   = damping;
                JointFactory.CreateFromDef(World, jd);
            }

            {
                RevoluteJointDef jd = new RevoluteJointDef();
                jd.Initialize(body2, _chassis, p4 + _offset);
                JointFactory.CreateFromDef(World, jd);
            }
        }
コード例 #18
0
ファイル: Spiderweb.cs プロジェクト: grzdrz/gms
        public Spiderweb(World world, Body ground, Vector2 position, float radius, int rings, int sides)
        {
            _world  = world;
            _radius = radius;

            const float breakpoint = 100f;


            List <List <Body> > ringBodys = new List <List <Body> >(rings);

            for (int i = 1; i < rings; ++i)
            {
                Vertices    vertices = PolygonTools.CreateCircle(i * 2.9f, sides);
                List <Body> bodies   = new List <Body>(sides);

                //Create the first goo
                Body prev = world.CreateCircle(radius, 0.2f, vertices[0]);
                prev.FixedRotation = true;
                prev.Position     += position;
                prev.BodyType      = BodyType.Dynamic;

                bodies.Add(prev);

                //Connect the first goo to the next
                for (int j = 1; j < vertices.Count; ++j)
                {
                    Body bod = world.CreateCircle(radius, 0.2f, vertices[j]);
                    bod.FixedRotation = true;
                    bod.BodyType      = BodyType.Dynamic;
                    bod.Position     += position;

                    DistanceJoint dj = JointFactory.CreateDistanceJoint(world, prev, bod, Vector2.Zero, Vector2.Zero);
                    dj.Frequency    = 4.0f;
                    dj.DampingRatio = 0.5f;
                    dj.Breakpoint   = breakpoint;

                    prev = bod;
                    bodies.Add(bod);
                }

                //Connect the first and the last goo
                DistanceJoint djEnd = JointFactory.CreateDistanceJoint(world, bodies[0], bodies[bodies.Count - 1], Vector2.Zero, Vector2.Zero);
                djEnd.Frequency    = 4.0f;
                djEnd.DampingRatio = 0.5f;
                djEnd.Breakpoint   = breakpoint;

                ringBodys.Add(bodies);
            }

            //Create an outer ring
            Vertices lastRing = PolygonTools.CreateCircle(rings * 2.9f, sides);

            lastRing.Translate(ref position);

            List <Body> lastRingBodies = ringBodys[ringBodys.Count - 1];

            //Fix each of the body of the outer ring
            for (int j = 0; j < lastRingBodies.Count; ++j)
            {
                lastRingBodies[j].BodyType = BodyType.Static;
            }

            //Interconnect the rings
            for (int i = 1; i < ringBodys.Count; i++)
            {
                List <Body> prev    = ringBodys[i - 1];
                List <Body> current = ringBodys[i];

                for (int j = 0; j < prev.Count; j++)
                {
                    Body prevFixture    = prev[j];
                    Body currentFixture = current[j];

                    DistanceJoint dj = JointFactory.CreateDistanceJoint(world, prevFixture, currentFixture, Vector2.Zero, Vector2.Zero);
                    dj.Frequency    = 4.0f;
                    dj.DampingRatio = 0.5f;
                }
            }
        }
コード例 #19
0
        private BridgeTest()
        {
            Body ground;

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

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

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

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

                RevoluteJointDef jd = new RevoluteJointDef();

                Body prevBody = ground;
                for (int i = 0; i < _count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(-14.5f + 1.0f * i, 5.0f);
                    Body body = BodyFactory.CreateFromDef(World, bd);
                    body.AddFixture(fd);

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

                    prevBody = body;
                }

                Vector2 anchor2 = new Vector2(-15.0f + 1.0f * _count, 5.0f);
                jd.Initialize(prevBody, ground, anchor2);
                JointFactory.CreateFromDef(World, jd);
            }

            for (int i = 0; i < 2; ++i)
            {
                Vertices vertices = new Vertices(3);
                vertices.Add(new Vector2(-0.5f, 0.0f));
                vertices.Add(new Vector2(0.5f, 0.0f));
                vertices.Add(new Vector2(0.0f, 1.5f));

                PolygonShape shape = new PolygonShape(vertices, 1.0f);

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

                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(-8.0f + 8.0f * i, 12.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(fd);
            }

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

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

                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(-6.0f + 6.0f * i, 10.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(fd);
            }
        }
コード例 #20
0
        private SerializationTest()
        {
            Body ground = BodyFactory.CreateEdge(World, new Vector2(-20, 0), new Vector2(20, 0));

            //Friction and distance joint
            {
                Body bodyA = BodyFactory.CreateCircle(World, 1, 1.5f, new Vector2(10, 25));
                bodyA.BodyType = BodyType.Dynamic;

                Body bodyB = BodyFactory.CreateRectangle(World, 1, 1, 1, new Vector2(-1, 25));
                bodyB.BodyType = BodyType.Dynamic;

                FrictionJoint frictionJoint = JointFactory.CreateFrictionJoint(World, bodyB, ground, Vector2.Zero);
                frictionJoint.CollideConnected = true;
                frictionJoint.MaxForce         = 100;

                JointFactory.CreateDistanceJoint(World, bodyA, bodyB);
            }

            //Wheel joint
            {
                Vertices vertices = new Vertices(6);
                vertices.Add(new Vector2(-1.5f, -0.5f));
                vertices.Add(new Vector2(1.5f, -0.5f));
                vertices.Add(new Vector2(1.5f, 0.0f));
                vertices.Add(new Vector2(0.0f, 0.9f));
                vertices.Add(new Vector2(-1.15f, 0.9f));
                vertices.Add(new Vector2(-1.5f, 0.2f));

                Body carBody = BodyFactory.CreatePolygon(World, vertices, 1, new Vector2(0, 1));
                carBody.BodyType = BodyType.Dynamic;

                Body wheel1 = BodyFactory.CreateCircle(World, 0.4f, 1, new Vector2(-1.0f, 0.35f));
                wheel1.BodyType = BodyType.Dynamic;
                wheel1.Friction = 0.9f;

                Body wheel2 = BodyFactory.CreateCircle(World, 0.4f, 1, new Vector2(1.0f, 0.4f));
                wheel2.BodyType = BodyType.Dynamic;
                wheel2.Friction = 0.9f;

                Vector2 axis = new Vector2(0.0f, 1.0f);

                WheelJoint spring1 = JointFactory.CreateWheelJoint(World, carBody, wheel1, axis);
                spring1.MotorSpeed     = 0.0f;
                spring1.MaxMotorTorque = 20.0f;
                spring1.MotorEnabled   = true;
                spring1.Frequency      = 4;
                spring1.DampingRatio   = 0.7f;

                WheelJoint spring2 = JointFactory.CreateWheelJoint(World, carBody, wheel2, axis);
                spring2.MotorSpeed     = 0.0f;
                spring2.MaxMotorTorque = 10.0f;
                spring2.MotorEnabled   = false;
                spring2.Frequency      = 4;
                spring2.DampingRatio   = 0.7f;
            }

            //Prismatic joint
            {
                Body body = BodyFactory.CreateRectangle(World, 2, 2, 5, new Vector2(-10.0f, 10.0f));
                body.BodyType = BodyType.Dynamic;
                body.Rotation = 0.5f * Settings.Pi;

                Vector2 axis = new Vector2(2.0f, 1.0f);
                axis.Normalize();

                PrismaticJoint joint = JointFactory.CreatePrismaticJoint(World, ground, body, Vector2.Zero, axis);
                joint.MotorSpeed    = 5.0f;
                joint.MaxMotorForce = 1000.0f;
                joint.MotorEnabled  = true;
                joint.LowerLimit    = -10.0f;
                joint.UpperLimit    = 20.0f;
                joint.LimitEnabled  = true;
            }

            // Pulley joint
            {
                Body body1 = BodyFactory.CreateRectangle(World, 2, 4, 5, new Vector2(-10.0f, 16.0f));
                body1.BodyType = BodyType.Dynamic;

                Body body2 = BodyFactory.CreateRectangle(World, 2, 4, 5, new Vector2(10.0f, 16.0f));
                body2.BodyType = BodyType.Dynamic;

                Vector2 anchor1      = new Vector2(-10.0f, 16.0f + 2.0f);
                Vector2 anchor2      = new Vector2(10.0f, 16.0f + 2.0f);
                Vector2 worldAnchor1 = new Vector2(-10.0f, 16.0f + 2.0f + 12.0f);
                Vector2 worldAnchor2 = new Vector2(10.0f, 16.0f + 2.0f + 12.0f);

                JointFactory.CreatePulleyJoint(World, body1, body2, anchor1, anchor2, worldAnchor1, worldAnchor2, 1.5f, true);
            }

            //Revolute joint
            {
                Body ball = BodyFactory.CreateCircle(World, 3.0f, 5.0f, new Vector2(5.0f, 30.0f));
                ball.BodyType = BodyType.Dynamic;

                Body polygonBody = BodyFactory.CreateRectangle(World, 20, 0.4f, 2, new Vector2(10, 10));
                polygonBody.BodyType = BodyType.Dynamic;
                polygonBody.IsBullet = true;

                RevoluteJoint joint = JointFactory.CreateRevoluteJoint(World, ground, polygonBody, new Vector2(10, 0));
                joint.LowerLimit   = -0.25f * Settings.Pi;
                joint.UpperLimit   = 0.0f * Settings.Pi;
                joint.LimitEnabled = true;
            }

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

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

                    Vector2 anchor = new Vector2(0.5f, 0);

                    if (i == 0)
                    {
                        anchor = new Vector2(-15f, 5);
                    }

                    JointFactory.CreateWeldJoint(World, prevBody, body, anchor, new Vector2(-0.5f, 0));
                    prevBody = body;
                }
            }

            //Rope joint
            {
                LinkFactory.CreateChain(World, new Vector2(-10, 10), new Vector2(-20, 10), 0.1f, 0.5f, 10, 0.1f, true);
            }

            //Angle joint
            {
                Body fA = BodyFactory.CreateRectangle(World, 4, 4, 1, new Vector2(-5, 4));
                fA.BodyType = BodyType.Dynamic;
                fA.Rotation = (float)(Math.PI / 3);

                Body fB = BodyFactory.CreateRectangle(World, 4, 4, 1, new Vector2(5, 4));
                fB.BodyType = BodyType.Dynamic;

                AngleJoint joint = new AngleJoint(fA, fB);
                joint.TargetAngle = (float)Math.PI / 2;
                World.AddJoint(joint);
            }

            //Motor joint
            {
                Body body = BodyFactory.CreateRectangle(World, 4, 1, 2, new Vector2(0, 35));
                body.BodyType = BodyType.Dynamic;
                body.Friction = 0.6f;

                MotorJoint motorJoint = JointFactory.CreateMotorJoint(World, ground, body);
                motorJoint.MaxForce      = 1000.0f;
                motorJoint.MaxTorque     = 1000.0f;
                motorJoint.LinearOffset  = new Vector2(0, 35);
                motorJoint.AngularOffset = (float)(Math.PI / 3f);
            }
        }
コード例 #21
0
ファイル: CarTest.cs プロジェクト: andrew-sidereal/AetherX
        private CarTest()
        {
            _hz    = 4.0f;
            _zeta  = 0.7f;
            _speed = 50.0f;

            Body ground = World.CreateEdge(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f));
            {
                float[] hs = new[] { 0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f };

                float       x = 20.0f, y1 = 0.0f;
                const float dx = 5.0f;

                for (int i = 0; i < 10; ++i)
                {
                    float y2 = hs[i];
                    ground.CreateEdge(new Vector2(x, y1), new Vector2(x + dx, y2));
                    y1 = y2;
                    x += dx;
                }

                for (int i = 0; i < 10; ++i)
                {
                    float y2 = hs[i];
                    ground.CreateEdge(new Vector2(x, y1), new Vector2(x + dx, y2));
                    y1 = y2;
                    x += dx;
                }

                ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f));
                x += 80.0f;
                ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f));
                x += 40.0f;
                ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x + 10.0f, 5.0f));
                x += 20.0f;
                ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f));
                x += 40.0f;
                ground.CreateEdge(new Vector2(x, 0.0f), new Vector2(x, 20.0f));

                ground.SetFriction(0.6f);
            }

            // Teeter
            {
                Body body = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(140.0f, 1.0f);

                PolygonShape box = new PolygonShape(1);
                box.Vertices = PolygonTools.CreateRectangle(10.0f, 0.25f);
                body.CreateFixture(box);

                RevoluteJoint jd = JointFactory.CreateRevoluteJoint(World, ground, body, Vector2.Zero);
                jd.LowerLimit   = -8.0f * MathHelper.Pi / 180.0f;
                jd.UpperLimit   = 8.0f * MathHelper.Pi / 180.0f;
                jd.LimitEnabled = true;

                body.ApplyAngularImpulse(100.0f);
            }

            //Bridge
            {
                const int    N     = 20;
                PolygonShape shape = new PolygonShape(1);
                shape.Vertices = PolygonTools.CreateRectangle(1.0f, 0.125f);

                Body prevBody = ground;
                for (int i = 0; i < N; ++i)
                {
                    Body body = World.CreateBody();
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(161.0f + 2.0f * i, -0.125f);
                    Fixture fix = body.CreateFixture(shape);
                    fix.Friction = 0.6f;

                    Vector2 anchor = new Vector2(-1, 0);
                    JointFactory.CreateRevoluteJoint(World, prevBody, body, anchor);

                    prevBody = body;
                }

                Vector2 anchor2 = new Vector2(1.0f, 0);
                JointFactory.CreateRevoluteJoint(World, ground, prevBody, anchor2);
            }

            // Boxes
            {
                PolygonShape box = new PolygonShape(0.5f);
                box.Vertices = PolygonTools.CreateRectangle(0.5f, 0.5f);

                Body body = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(230.0f, 0.5f);
                body.CreateFixture(box);

                body          = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(230.0f, 1.5f);
                body.CreateFixture(box);

                body          = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(230.0f, 2.5f);
                body.CreateFixture(box);

                body          = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(230.0f, 3.5f);
                body.CreateFixture(box);

                body          = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(230.0f, 4.5f);
                body.CreateFixture(box);
            }

            // Car
            {
                Vertices vertices = new Vertices(8);
                vertices.Add(new Vector2(-1.5f, -0.5f));
                vertices.Add(new Vector2(1.5f, -0.5f));
                vertices.Add(new Vector2(1.5f, 0.0f));
                vertices.Add(new Vector2(0.0f, 0.9f));
                vertices.Add(new Vector2(-1.15f, 0.9f));
                vertices.Add(new Vector2(-1.5f, 0.2f));

                PolygonShape chassis = new PolygonShape(vertices, 1);

                CircleShape circle = new CircleShape(0.4f, 1);

                _car          = World.CreateBody();
                _car.BodyType = BodyType.Dynamic;
                _car.Position = new Vector2(0.0f, 1.0f);
                _car.CreateFixture(chassis);

                _wheel1          = World.CreateBody();
                _wheel1.BodyType = BodyType.Dynamic;
                _wheel1.Position = new Vector2(-1.0f, 0.35f);
                _wheel1.CreateFixture(circle);
                _wheel1.SetFriction(0.9f);

                _wheel2          = World.CreateBody();
                _wheel2.BodyType = BodyType.Dynamic;
                _wheel2.Position = new Vector2(1.0f, 0.4f);
                _wheel2.CreateFixture(circle);
                _wheel2.SetFriction(0.9f);

                Vector2 axis = new Vector2(0.0f, 1.0f);
                _spring1                = new WheelJoint(_car, _wheel1, _wheel1.Position, axis, true);
                _spring1.MotorSpeed     = 0.0f;
                _spring1.MaxMotorTorque = 20.0f;
                _spring1.MotorEnabled   = true;
                _spring1.Frequency      = _hz;
                _spring1.DampingRatio   = _zeta;
                World.Add(_spring1);

                _spring2                = new WheelJoint(_car, _wheel2, _wheel2.Position, axis, true);
                _spring2.MotorSpeed     = 0.0f;
                _spring2.MaxMotorTorque = 10.0f;
                _spring2.MotorEnabled   = false;
                _spring2.Frequency      = _hz;
                _spring2.DampingRatio   = _zeta;
                World.Add(_spring2);
            }
        }
コード例 #22
0
ファイル: Rope.cs プロジェクト: kachnov/Barotrauma
        public Rope(Item item, XElement element)
            : base(item, element)
        {
            string spritePath = element.GetAttributeString("sprite", "");

            if (spritePath == "")
            {
                DebugConsole.ThrowError("Sprite " + spritePath + " in " + element + " not found!");
            }

            float length = ConvertUnits.ToSimUnits(element.GetAttributeFloat("length", 200.0f));

            pullForce = element.GetAttributeFloat("pullforce", 10.0f);

            projectileAnchor   = Vector2.Zero;
            projectileAnchor.X = element.GetAttributeFloat("projectileanchorx", 0.0f);
            projectileAnchor.Y = element.GetAttributeFloat("projectileanchory", 0.0f);
            projectileAnchor   = ConvertUnits.ToSimUnits(projectileAnchor);

            characterUsable = element.GetAttributeBool("characterusable", false);

            sprite        = new Sprite(spritePath, new Vector2(0.5f, 0.5f));
            sectionLength = ConvertUnits.ToSimUnits(sprite.size.X);


            Path ropePath = new Path();

            ropePath.Add(item.body.SimPosition);
            ropePath.Add(item.body.SimPosition + new Vector2(length, 0.0f));
            ropePath.Closed = false;

            Vertices     box   = PolygonTools.CreateRectangle(sectionLength, 0.05f);
            PolygonShape shape = new PolygonShape(box, 5);

            List <Body> ropeList = PathManager.EvenlyDistributeShapesAlongPath(GameMain.World, ropePath, shape, BodyType.Dynamic, (int)(length / sectionLength));

            ropeBodies = new PhysicsBody[ropeList.Count];
            for (int i = 0; i < ropeBodies.Length; i++)
            {
                ropeList[i].Mass    = 0.01f;
                ropeList[i].Enabled = false;
                //only collide with the map
                ropeList[i].CollisionCategories = Physics.CollisionItem;
                ropeList[i].CollidesWith        = Physics.CollisionWall;

                //ropeBodies[i] = new PhysicsBody(ropeList[i]);
            }

            List <RevoluteJoint> joints = PathManager.AttachBodiesWithRevoluteJoint(GameMain.World, ropeList,
                                                                                    new Vector2(-sectionLength / 2, 0.0f), new Vector2(sectionLength / 2, 0.0f), false, false);

            ropeJoints = new RevoluteJoint[joints.Count + 1];
            //ropeJoints[0] = JointFactory.CreateRevoluteJoint(Game1.world, item.body, ropeList[0], new Vector2(0f, -0.0f));
            for (int i = 0; i < joints.Count; i++)
            {
                var distanceJoint = JointFactory.CreateDistanceJoint(GameMain.World, ropeList[i], ropeList[i + 1]);

                distanceJoint.Length       = sectionLength;
                distanceJoint.DampingRatio = 1.0f;
                ropeJoints[i] = joints[i];
            }
        }
コード例 #23
0
ファイル: AdvancedDemo2.cs プロジェクト: dv00d00/XNA_GAME
        public override void LoadContent()
        {
            base.LoadContent();

            World.Gravity = new Vector2(0, 9.82f);

            _border = new Border(World, this, ScreenManager.GraphicsDevice.Viewport);

            /* Bridge */
            //We make a path using 2 points.
            Path bridgePath = new Path();

            bridgePath.Add(new Vector2(-15, 5));
            bridgePath.Add(new Vector2(15, 5));
            bridgePath.Closed = false;

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

            _bridgeBodies = PathManager.EvenlyDistributeShapesAlongPath(World, bridgePath, shape,
                                                                        BodyType.Dynamic, 29);
            _bridgeBox =
                new Sprite(ScreenManager.Assets.TextureFromShape(shape, MaterialType.Dots, Color.SandyBrown, 1f));

            //Attach the first and last fixtures to the world
            JointFactory.CreateFixedRevoluteJoint(World, _bridgeBodies[0], new Vector2(0f, -0.5f),
                                                  _bridgeBodies[0].Position);
            JointFactory.CreateFixedRevoluteJoint(World, _bridgeBodies[_bridgeBodies.Count - 1], new Vector2(0, 0.5f),
                                                  _bridgeBodies[_bridgeBodies.Count - 1].Position);

            PathManager.AttachBodiesWithRevoluteJoint(World, _bridgeBodies, new Vector2(0f, -0.5f),
                                                      new Vector2(0f, 0.5f),
                                                      false, true);

            /* Soft body */
            //We make a rectangular path.
            Path rectanglePath = new Path();

            rectanglePath.Add(new Vector2(-6, -11));
            rectanglePath.Add(new Vector2(-6, 1));
            rectanglePath.Add(new Vector2(6, 1));
            rectanglePath.Add(new Vector2(6, -11));
            rectanglePath.Closed = true;

            //Creating two shapes. A circle to form the circle and a rectangle to stabilize the soft body.
            List <Shape> shapes = new List <Shape>(2);

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

            //We distribute the shapes in the rectangular path.
            _softBodies = PathManager.EvenlyDistributeShapesAlongPath(World, rectanglePath, shapes,
                                                                      BodyType.Dynamic, 30);
            _softBodyBox =
                new Sprite(ScreenManager.Assets.TextureFromShape(shapes[0], MaterialType.Blank, Color.Silver * 0.8f, 1f));
            _softBodyBox.Origin += new Vector2(ConvertUnits.ToDisplayUnits(0.1f), 0f);
            _softBodyCircle      =
                new Sprite(ScreenManager.Assets.TextureFromShape(shapes[1], MaterialType.Waves, Color.Silver, 1f));

            //Attach the bodies together with revolute joints. The rectangular form will converge to a circular form.
            PathManager.AttachBodiesWithRevoluteJoint(World, _softBodies, new Vector2(0f, -0.5f), new Vector2(0f, 0.5f),
                                                      true, true);
        }
コード例 #24
0
        private CantileverTest()
        {
            Body ground = BodyFactory.CreateEdge(World, new Vector2(-40, 0), new Vector2(40, 0));

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

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

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < _count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(-14.5f + 1.0f * i, 5.0f);
                    Body body = BodyFactory.CreateFromDef(World, bd);
                    body.AddFixture(fd);

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

                    prevBody = body;
                }
            }

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

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

                WeldJointDef jd = new WeldJointDef();

                float frequencyHz  = 5.0f;
                float dampingRatio = 0.7f;

                Body prevBody = ground;
                for (int i = 0; i < 3; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(-14.0f + 2.0f * i, 15.0f);
                    Body body = BodyFactory.CreateFromDef(World, bd);
                    body.AddFixture(fd);

                    Vector2 anchor = new Vector2(-15.0f + 2.0f * i, 15.0f);
                    jd.Initialize(prevBody, body, anchor);
                    JointHelper.AngularStiffness(frequencyHz, dampingRatio, jd.BodyA, jd.BodyB, out float stiffness, out float damping);
                    jd.Stiffness = stiffness;
                    jd.Damping   = damping;

                    JointFactory.CreateFromDef(World, jd);

                    prevBody = body;
                }
            }

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

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

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < _count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(-4.5f + 1.0f * i, 5.0f);
                    Body body = BodyFactory.CreateFromDef(World, bd);
                    body.AddFixture(fd);

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

                    prevBody = body;
                }
            }

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

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

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

                Body prevBody = ground;
                for (int i = 0; i < _count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.Type     = BodyType.Dynamic;
                    bd.Position = new Vector2(5.5f + 1.0f * i, 10.0f);
                    Body body = BodyFactory.CreateFromDef(World, bd);
                    body.AddFixture(fd);

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

                        JointHelper.AngularStiffness(frequencyHz, dampingRatio, jd.BodyA, jd.BodyB, out float stiffness, out float damping);
                        jd.Stiffness = stiffness;
                        jd.Damping   = damping;

                        JointFactory.CreateFromDef(World, jd);
                    }

                    prevBody = body;
                }
            }

            for (int i = 0; i < 2; ++i)
            {
                Vertices vertices = new Vertices(3);
                vertices.Add(new Vector2(-0.5f, 0.0f));
                vertices.Add(new Vector2(0.5f, 0.0f));
                vertices.Add(new Vector2(0.0f, 1.5f));

                PolygonShape shape = new PolygonShape(vertices, 1.0f);

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

                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(-8.0f + 8.0f * i, 12.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(fd);
            }

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

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

                BodyDef bd = new BodyDef();
                bd.Type     = BodyType.Dynamic;
                bd.Position = new Vector2(-6.0f + 6.0f * i, 10.0f);
                Body body = BodyFactory.CreateFromDef(World, bd);
                body.AddFixture(fd);
            }
        }
コード例 #25
0
 protected override Joint CreateJoint(Body bodyA, Body bodyB)
 {
     return(bodyA != null?JointFactory.CreateFixedAngleJoint(Scene.PhysicsWorld, bodyA) : null);
 }
コード例 #26
0
ファイル: WeldJointInfo.cs プロジェクト: pyneer/case
 protected override Joint CreateJoint(World world, Body bodyA, Body bodyB)
 {
     return(bodyA != null && bodyB != null?JointFactory.CreateWeldJoint(world, bodyA, bodyB, Vector2.Zero) : null);
 }
コード例 #27
0
        public override void LoadContent()
        {
            base.LoadContent();

            World.Gravity = new Vector2(0f, -10f);

            HasCursor           = false;
            EnableCameraControl = true;

            _hzFront  = 8.5f;
            _hzBack   = 5.0f;
            _zeta     = 0.85f;
            _maxSpeed = 50.0f;

            // terrain
            _ground = World.CreateBody();
            {
                Vertices terrain = new Vertices();
                terrain.Add(new Vector2(-20f, 5f));
                terrain.Add(new Vector2(-20f, 0f));
                terrain.Add(new Vector2(20f, 0f));
                terrain.Add(new Vector2(25f, 0.25f));
                terrain.Add(new Vector2(30f, 1f));
                terrain.Add(new Vector2(35f, 4f));
                terrain.Add(new Vector2(40f, 0f));
                terrain.Add(new Vector2(45f, 0f));
                terrain.Add(new Vector2(50f, -1f));
                terrain.Add(new Vector2(55f, -2f));
                terrain.Add(new Vector2(60f, -2f));
                terrain.Add(new Vector2(65f, -1.25f));
                terrain.Add(new Vector2(70f, 0f));
                terrain.Add(new Vector2(75f, 0.3f));
                terrain.Add(new Vector2(80f, 1.5f));
                terrain.Add(new Vector2(85f, 3.5f));
                terrain.Add(new Vector2(90f, 0f));
                terrain.Add(new Vector2(95f, -0.5f));
                terrain.Add(new Vector2(100f, -1f));
                terrain.Add(new Vector2(105f, -2f));
                terrain.Add(new Vector2(110f, -2.5f));
                terrain.Add(new Vector2(115f, -1.3f));
                terrain.Add(new Vector2(120f, 0f));
                terrain.Add(new Vector2(160f, 0f));
                terrain.Add(new Vector2(159f, -10f));
                terrain.Add(new Vector2(201f, -10f));
                terrain.Add(new Vector2(200f, 0f));
                terrain.Add(new Vector2(240f, 0f));
                terrain.Add(new Vector2(250f, 5f));
                terrain.Add(new Vector2(250f, -10f));
                terrain.Add(new Vector2(270f, -10f));
                terrain.Add(new Vector2(270f, 0));
                terrain.Add(new Vector2(310f, 0));
                terrain.Add(new Vector2(310f, 5));

                for (int i = 0; i < terrain.Count - 1; ++i)
                {
                    var gfixture = _ground.CreateEdge(terrain[i], terrain[i + 1]);
                    gfixture.Friction = 0.6f;
                }
            }

            // teeter board
            {
                _board          = World.CreateBody();
                _board.BodyType = BodyType.Dynamic;
                _board.Position = new Vector2(140.0f, 1.0f);

                PolygonShape box = new PolygonShape(1f);
                box.Vertices = PolygonTools.CreateRectangle(20.0f / 2f, 0.5f / 2f);
                _teeter      = new Sprite(ContentWrapper.TextureFromShape(box, "Stripe", ContentWrapper.Gold, ContentWrapper.Black, ContentWrapper.Black, 1f, 24f));

                _board.CreateFixture(box);

                RevoluteJoint teeterAxis = JointFactory.CreateRevoluteJoint(World, _ground, _board, Vector2.Zero);
                teeterAxis.LowerLimit   = -8.0f * MathHelper.Pi / 180.0f;
                teeterAxis.UpperLimit   = 8.0f * MathHelper.Pi / 180.0f;
                teeterAxis.LimitEnabled = true;

                _board.ApplyAngularImpulse(100.0f);
            }

            // bridge
            {
                _bridgeSegments = new List <Body>();

                const int    segmentCount = 20;
                PolygonShape shape        = new PolygonShape(1f);
                shape.Vertices = PolygonTools.CreateRectangle(1.0f, 0.125f);

                _bridge = new Sprite(ContentWrapper.TextureFromShape(shape, ContentWrapper.Gold, ContentWrapper.Black, 24f));

                Body prevBody = _ground;
                for (int i = 0; i < segmentCount; ++i)
                {
                    Body body = World.CreateBody();
                    body.BodyType = BodyType.Dynamic;
                    body.Position = new Vector2(161f + 2f * i, -0.125f);
                    Fixture fix = body.CreateFixture(shape);
                    fix.Friction = 0.6f;
                    JointFactory.CreateRevoluteJoint(World, prevBody, body, -Vector2.UnitX);

                    prevBody = body;
                    _bridgeSegments.Add(body);
                }
                JointFactory.CreateRevoluteJoint(World, _ground, prevBody, Vector2.UnitX);
            }

            // boxes
            {
                _boxes = new List <Body>();
                PolygonShape box = new PolygonShape(1f);
                box.Vertices = PolygonTools.CreateRectangle(0.5f, 0.5f);
                _box         = new Sprite(ContentWrapper.TextureFromShape(box, "Square", ContentWrapper.Sky, ContentWrapper.Sunset, ContentWrapper.Black, 1f, 24f));

                Body body = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(220f, 0.5f);
                body.CreateFixture(box);
                _boxes.Add(body);

                body          = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(220f, 1.5f);
                body.CreateFixture(box);
                _boxes.Add(body);

                body          = World.CreateBody();
                body.BodyType = BodyType.Dynamic;
                body.Position = new Vector2(220f, 2.5f);
                body.CreateFixture(box);
                _boxes.Add(body);
            }

            // car
            {
                Vertices vertices = new Vertices(8);
                vertices.Add(new Vector2(-2.5f, -0.08f));
                vertices.Add(new Vector2(-2.375f, 0.46f));
                vertices.Add(new Vector2(-0.58f, 0.92f));
                vertices.Add(new Vector2(0.46f, 0.92f));
                vertices.Add(new Vector2(2.5f, 0.17f));
                vertices.Add(new Vector2(2.5f, -0.205f));
                vertices.Add(new Vector2(2.3f, -0.33f));
                vertices.Add(new Vector2(-2.25f, -0.35f));

                PolygonShape chassis = new PolygonShape(vertices, 2f);

                _car          = World.CreateBody();
                _car.BodyType = BodyType.Dynamic;
                _car.Position = new Vector2(0.0f, 1.0f);
                _car.CreateFixture(chassis);

                _wheelBack          = World.CreateBody();
                _wheelBack.BodyType = BodyType.Dynamic;
                _wheelBack.Position = new Vector2(-1.709f, 0.78f);
                Fixture fix = _wheelBack.CreateFixture(new CircleShape(0.5f, 0.8f));
                fix.Friction = 0.9f;

                _wheelFront          = World.CreateBody();
                _wheelFront.BodyType = BodyType.Dynamic;
                _wheelFront.Position = new Vector2(1.54f, 0.8f);
                _wheelFront.CreateFixture(new CircleShape(0.5f, 1f));

                Vector2 axis = new Vector2(0.0f, 1.2f);
                _springBack                = new WheelJoint(_car, _wheelBack, _wheelBack.Position, axis, true);
                _springBack.MotorSpeed     = 0.0f;
                _springBack.MaxMotorTorque = 20.0f;
                _springBack.MotorEnabled   = true;
                _springBack.Frequency      = _hzBack;
                _springBack.DampingRatio   = _zeta;
                World.Add(_springBack);

                _springFront                = new WheelJoint(_car, _wheelFront, _wheelFront.Position, axis, true);
                _springFront.MotorSpeed     = 0.0f;
                _springFront.MaxMotorTorque = 10.0f;
                _springFront.MotorEnabled   = false;
                _springFront.Frequency      = _hzFront;
                _springFront.DampingRatio   = _zeta;
                World.Add(_springFront);

                // GFX
                _carBody = new Sprite(ContentWrapper.GetTexture("Car"), ContentWrapper.CalculateOrigin(_car, 24f));
                _wheel   = new Sprite(ContentWrapper.GetTexture("Wheel"));
            }

            Camera.MinRotation = -0.05f;
            Camera.MaxRotation = 0.05f;

            Camera.TrackingBody   = _car;
            Camera.EnableTracking = true;
        }
コード例 #28
0
ファイル: AngleJointInfo.cs プロジェクト: pyneer/case
 protected override Joint CreateJoint(World world, Body bodyA, Body bodyB)
 {
     return(bodyA != null && bodyB != null?JointFactory.CreateAngleJoint(world, bodyA, bodyB) : null);
 }
コード例 #29
0
 protected override Joint CreateJoint(Body bodyA, Body bodyB)
 {
     return(bodyA != null && bodyB != null?JointFactory.CreatePrismaticJoint(Scene.PhysicsWorld, bodyA, bodyB, Vector2.Zero, Vector2.UnitX) : null);
 }
コード例 #30
0
 protected override Joint CreateJoint(Body bodyA, Body bodyB)
 {
     return(bodyA != null?JointFactory.CreateFixedDistanceJoint(Scene.PhysicsWorld, bodyA, Vector2.Zero, Vector2.Zero) : null);
 }