using System.Text; using FarseerPhysics.Dynamics; using FarseerPhysics.Factories; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace FarseerPhysics.SamplesFramework { internal class SimpleDemo3 : PhysicsGameScreen, IDemoScreen { private Agent _agent; private Border _border; private Sprite _obstacle; private Body[] _obstacles = new Body[5]; #region IDemoScreen Members public string GetTitle() { return "Multiple fixtures and static bodies"; } public string GetDetails() { StringBuilder sb = new StringBuilder(); sb.AppendLine("This demo shows a single body with multiple shapes attached."); sb.AppendLine(string.Empty); sb.AppendLine("This demo also shows the use of static bodies."); sb.AppendLine(string.Empty); sb.AppendLine("GamePad:"); sb.AppendLine(" - Rotate agent: left and right triggers"); sb.AppendLine(" - Move agent: right thumbstick"); sb.AppendLine(" - Move cursor: left thumbstick"); sb.AppendLine(" - Grab object (beneath cursor): A button"); sb.AppendLine(" - Drag grabbed object: left thumbstick"); sb.AppendLine(" - Exit to menu: Back button"); sb.AppendLine(string.Empty); sb.AppendLine("Keyboard:"); sb.AppendLine(" - Rotate agent: left and right arrows"); sb.AppendLine(" - Move agent: A,S,D,W"); sb.AppendLine(" - Exit to menu: Escape"); sb.AppendLine(string.Empty); sb.AppendLine("Mouse / Touchscreen"); sb.AppendLine(" - Grab object (beneath cursor): Left click"); sb.AppendLine(" - Drag grabbed object: move mouse / finger"); return sb.ToString(); } #endregion public override void LoadContent() { base.LoadContent(); World.Gravity = new Vector2(0f, 20f); _border = new Border(World, this, ScreenManager.GraphicsDevice.Viewport); _agent = new Agent(World, this, new Vector2(-6.9f, -11f)); LoadObstacles(); SetUserAgent(_agent.Body, 1000f, 400f); } private void LoadObstacles() { for (int i = 0; i < 5; ++i) { _obstacles[i] = BodyFactory.CreateRectangle(World, 5f, 1f, 1f); _obstacles[i].IsStatic = true; _obstacles[i].Restitution = 0.2f; _obstacles[i].Friction = 0.2f; } _obstacles[0].Position = new Vector2(-5f, 9f); _obstacles[1].Position = new Vector2(15f, 6f); _obstacles[2].Position = new Vector2(10f, -3f); _obstacles[3].Position = new Vector2(-10f, -9f); _obstacles[4].Position = new Vector2(-17f, 0f); // create sprite based on body _obstacle = new Sprite(ScreenManager.Assets.TextureFromShape(_obstacles[0].FixtureList[0].Shape, MaterialType.Dots, Color.SandyBrown, 0.8f)); } public override void Draw(GameTime gameTime) { ScreenManager.SpriteBatch.Begin(0, null, null, null, null, null, Camera.View); for (int i = 0; i < 5; ++i) { ScreenManager.SpriteBatch.Draw(_obstacle.Texture, ConvertUnits.ToDisplayUnits(_obstacles[i].Position), null, Color.White, _obstacles[i].Rotation, _obstacle.Origin, 1f, SpriteEffects.None, 0f); } _agent.Draw(); ScreenManager.SpriteBatch.End(); _border.Draw(); base.Draw(gameTime); } } }