public static MotorJoint CreateMotorJoint(this Body body, Body bodyB, bool useWorldCoordinates = false) { return(JointFactory.CreateMotorJoint(body.World, body, bodyB, useWorldCoordinates)); }
/// <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); } }
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; }
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); } }
protected override Joint CreateJoint(Body bodyA, Body bodyB) { return(bodyA != null && bodyB != null?JointFactory.CreateRevoluteJoint(Scene.PhysicsWorld, bodyA, bodyB, Vector2.Zero) : null); }
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); } }
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); } }
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)); }
public static FixedMouseJoint CreateFixedMouseJoint(this Body body, Vector2 worldAnchor) { return(JointFactory.CreateFixedMouseJoint(body.World, body, FSConvert.DisplayToSim * worldAnchor)); }
public static AngleJoint CreateAngleJoint(this Body body, Body bodyB) { return(JointFactory.CreateAngleJoint(body.World, body, bodyB)); }
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)); }
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)); }
public static RevoluteJoint CreateRevoluteJoint(this Body body, Body bodyB, Vector2 anchor) { return(JointFactory.CreateRevoluteJoint(body.World, body, bodyB, FSConvert.DisplayToSim * anchor)); }
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)); }
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); }
// 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(); }
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); } }
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; } } }
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); } }
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); } }
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); } }
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]; } }
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); }
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); } }
protected override Joint CreateJoint(Body bodyA, Body bodyB) { return(bodyA != null?JointFactory.CreateFixedAngleJoint(Scene.PhysicsWorld, bodyA) : null); }
protected override Joint CreateJoint(World world, Body bodyA, Body bodyB) { return(bodyA != null && bodyB != null?JointFactory.CreateWeldJoint(world, bodyA, bodyB, Vector2.Zero) : null); }
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; }
protected override Joint CreateJoint(World world, Body bodyA, Body bodyB) { return(bodyA != null && bodyB != null?JointFactory.CreateAngleJoint(world, bodyA, bodyB) : null); }
protected override Joint CreateJoint(Body bodyA, Body bodyB) { return(bodyA != null && bodyB != null?JointFactory.CreatePrismaticJoint(Scene.PhysicsWorld, bodyA, bodyB, Vector2.Zero, Vector2.UnitX) : null); }
protected override Joint CreateJoint(Body bodyA, Body bodyB) { return(bodyA != null?JointFactory.CreateFixedDistanceJoint(Scene.PhysicsWorld, bodyA, Vector2.Zero, Vector2.Zero) : null); }