- Harlinn.WindowsPhone.XNA.zip
- AnatomyOfAGame
- AnatomyOfAGame
- AnatomyOfAGameContent
- AnatomyOfAGameContent.contentproj
- bin
- Windows Phone
- Debug
- obj
- Windows Phone
- Debug
- DesignTimeResolveAssemblyReferencesInput.cache
- TempPE
- Farseer Physics Engine 3.3.1 XNA
- DebugView XNA
- Farseer Physics Engine 3.3 XNA
- Samples XNA WP7.sln
- Samples XNA Xbox360.sln
- Samples XNA.sln
- Samples XNA
- Samples XNA
- Samples XNAContent
- Common
- arrow.png
- buttons.png
- cursor.png
- gradient.png
- logo.png
- popup.png
- slider.png
- socket.png
- stick.png
- Fonts
- detailsFont.spritefont
- frameRateCounterFont.spritefont
- menufont.spritefont
- Materials
- blank.png
- dots.png
- pavement.png
- squares.png
- waves.png
- Samples XNA Content.contentproj
- Samples
- alphabet.png
- car.png
- goo.png
- link.png
- object.png
- wheel.png
- FarseerPhysicsIntro
- FarseerPhysicsIntro
- FarseerPhysicsIntroContent
- bin
- Windows Phone
- Debug
- Release
- DefaultSpriteFont.spritefont
- FarseerPhysicsIntroContent.contentproj
- FarseerPhysicsIntroContent.contentproj.user
- Thumbs.db
- white.png
- Harlinn.WindowsPhone.XNA.sln
- HarlinnFarseerXNA
- XNAImageIntro
- XNAImageIntro
- XNAImageIntroContent
- bin
- Windows Phone
- Debug
- XNAImageIntroContent.contentproj
|
using System.Collections.Generic;
using System.Text;
using FarseerPhysics.Collision;
using FarseerPhysics.Common;
using FarseerPhysics.Common.Decomposition;
using FarseerPhysics.Common.PolygonManipulation;
using FarseerPhysics.Dynamics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace FarseerPhysics.SamplesFramework
{
internal class AdvancedDemo5 : PhysicsGameScreen, IDemoScreen
{
private Border _border;
#region IDemoScreen Members
public string GetTitle()
{
return "Breakable bodies and explosions";
}
public string GetDetails()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("TODO: Add sample description!");
sb.AppendLine(string.Empty);
sb.AppendLine("GamePad:");
sb.AppendLine(" - Explode (at cursor): B button");
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(" - Exit to menu: Escape");
sb.AppendLine(string.Empty);
sb.AppendLine("Mouse / Touchscreen");
sb.AppendLine(" - Explode (at cursor): Right click");
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();
DebugView.AppendFlags(DebugViewFlags.Shape);
World.Gravity = Vector2.Zero;
_border = new Border(World, this, ScreenManager.GraphicsDevice.Viewport);
Texture2D alphabet = ScreenManager.Content.Load<Texture2D>("Samples/alphabet");
uint[] data = new uint[alphabet.Width * alphabet.Height];
alphabet.GetData(data);
List<Vertices> list = PolygonTools.CreatePolygon(data, alphabet.Width, 3.5f, 20, true, true);
float yOffset = -5f;
float xOffset = -14f;
for (int i = 0; i < list.Count; i++)
{
if (i == 9)
{
yOffset = 0f;
xOffset = -14f;
}
if (i == 18)
{
yOffset = 5f;
xOffset = -12.25f;
}
Vertices polygon = list[i];
Vector2 centroid = -polygon.GetCentroid();
polygon.Translate(ref centroid);
polygon = SimplifyTools.CollinearSimplify(polygon);
polygon = SimplifyTools.ReduceByDistance(polygon, 4);
List<Vertices> triangulated = BayazitDecomposer.ConvexPartition(polygon);
#if WINDOWS_PHONE
const float scale = 0.6f;
#else
const float scale = 1f;
#endif
Vector2 vertScale = new Vector2(ConvertUnits.ToSimUnits(1)) * scale;
foreach (Vertices vertices in triangulated)
{
vertices.Scale(ref vertScale);
}
BreakableBody breakableBody = new BreakableBody(triangulated, World, 1);
breakableBody.MainBody.Position = new Vector2(xOffset, yOffset);
breakableBody.Strength = 100;
World.AddBreakableBody(breakableBody);
xOffset += 3.5f;
}
}
public override void HandleInput(InputHelper input, GameTime gameTime)
{
if (input.IsNewMouseButtonPress(MouseButtons.RightButton) ||
input.IsNewButtonPress(Buttons.B))
{
Vector2 cursorPos = Camera.ConvertScreenToWorld(input.Cursor);
Vector2 min = cursorPos - new Vector2(10, 10);
Vector2 max = cursorPos + new Vector2(10, 10);
AABB aabb = new AABB(ref min, ref max);
World.QueryAABB(fixture =>
{
Vector2 fv = fixture.Body.Position - cursorPos;
fv.Normalize();
fv *= 40;
fixture.Body.ApplyLinearImpulse(ref fv);
return true;
}, ref aabb);
}
base.HandleInput(input, gameTime);
}
public override void Draw(GameTime gameTime)
{
_border.Draw();
base.Draw(gameTime);
}
public override void UnloadContent()
{
DebugView.RemoveFlags(DebugViewFlags.Shape);
base.UnloadContent();
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Chief Architect - Sea Surveillance AS.
Specializing in integrated operations and high performance computing solutions.
I’ve been fooling around with computers since the early eighties, I’ve even done work on CP/M and MP/M.
Wrote my first “real” program on a BBC micro model B based on a series in a magazine at that time. It was fun and I got hooked on this thing called programming ...
A few Highlights:
- High performance application server development
- Model Driven Architecture and Code generators
- Real-Time Distributed Solutions
- C, C++, C#, Java, TSQL, PL/SQL, Delphi, ActionScript, Perl, Rexx
- Microsoft SQL Server, Oracle RDBMS, IBM DB2, PostGreSQL
- AMQP, Apache qpid, RabbitMQ, Microsoft Message Queuing, IBM WebSphereMQ, Oracle TuxidoMQ
- Oracle WebLogic, IBM WebSphere
- Corba, COM, DCE, WCF
- AspenTech InfoPlus.21(IP21), OsiSoft PI
More information about what I do for a living can be found at:
harlinn.com or
LinkedIn
You can contact me at
espen@harlinn.no