Agent.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using FarseerPhysics.Common;
  2. using FarseerPhysics.Dynamics;
  3. using FarseerPhysics.Factories;
  4. using Microsoft.Xna.Framework;
  5. using Microsoft.Xna.Framework.Graphics;
  6. namespace FarseerPhysics.SamplesFramework
  7. {
  8. public class Agent
  9. {
  10. private Body _agentBody;
  11. private Sprite _box;
  12. private Category _collidesWith;
  13. private Category _collisionCategories;
  14. private Sprite _knob;
  15. private float _offset;
  16. private PhysicsGameScreen _screen;
  17. public Agent(World world, PhysicsGameScreen screen, Vector2 position)
  18. {
  19. _collidesWith = Category.All;
  20. _collisionCategories = Category.All;
  21. _agentBody = BodyFactory.CreateBody(world, position);
  22. _agentBody.BodyType = BodyType.Dynamic;
  23. //Center
  24. FixtureFactory.AttachCircle(0.5f, 0.5f, _agentBody);
  25. //Left arm
  26. FixtureFactory.AttachRectangle(1.5f, 0.4f, 1f, new Vector2(-1f, 0f), _agentBody);
  27. FixtureFactory.AttachCircle(0.5f, 0.5f, _agentBody, new Vector2(-2f, 0f));
  28. //Right arm
  29. FixtureFactory.AttachRectangle(1.5f, 0.4f, 1f, new Vector2(1f, 0f), _agentBody);
  30. FixtureFactory.AttachCircle(0.5f, 0.5f, _agentBody, new Vector2(2f, 0f));
  31. //Top arm
  32. FixtureFactory.AttachRectangle(0.4f, 1.5f, 1f, new Vector2(0f, 1f), _agentBody);
  33. FixtureFactory.AttachCircle(0.5f, 0.5f, _agentBody, new Vector2(0f, 2f));
  34. //Bottom arm
  35. FixtureFactory.AttachRectangle(0.4f, 1.5f, 1f, new Vector2(0f, -1f), _agentBody);
  36. FixtureFactory.AttachCircle(0.5f, 0.5f, _agentBody, new Vector2(0f, -2f));
  37. _screen = screen;
  38. //GFX
  39. AssetCreator creator = _screen.ScreenManager.Assets;
  40. _box = new Sprite(creator.TextureFromVertices(PolygonTools.CreateRectangle(1.75f, 0.2f),
  41. MaterialType.Blank, Color.White, 1f));
  42. _knob = new Sprite(creator.CircleTexture(0.5f, MaterialType.Blank, Color.Orange, 1f));
  43. _offset = ConvertUnits.ToDisplayUnits(2f);
  44. }
  45. public Category CollisionCategories
  46. {
  47. get { return _collisionCategories; }
  48. set
  49. {
  50. _collisionCategories = value;
  51. Body.CollisionCategories = value;
  52. }
  53. }
  54. public Category CollidesWith
  55. {
  56. get { return _collidesWith; }
  57. set
  58. {
  59. _collidesWith = value;
  60. Body.CollidesWith = value;
  61. }
  62. }
  63. public Body Body
  64. {
  65. get { return _agentBody; }
  66. }
  67. public void Draw()
  68. {
  69. SpriteBatch batch = _screen.ScreenManager.SpriteBatch;
  70. //cross
  71. batch.Draw(_box.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
  72. Color.White, _agentBody.Rotation, _box.Origin, 1f, SpriteEffects.None, 0f);
  73. batch.Draw(_box.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
  74. Color.White, _agentBody.Rotation + MathHelper.Pi / 2f, _box.Origin, 1f, SpriteEffects.None, 0f);
  75. //knobs
  76. batch.Draw(_knob.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
  77. Color.White, _agentBody.Rotation, _knob.Origin, 1f, SpriteEffects.None, 0f);
  78. batch.Draw(_knob.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
  79. Color.White, _agentBody.Rotation, _knob.Origin + new Vector2(0f, _offset), 1f,
  80. SpriteEffects.None, 0f);
  81. batch.Draw(_knob.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
  82. Color.White, _agentBody.Rotation, _knob.Origin - new Vector2(0f, _offset), 1f,
  83. SpriteEffects.None, 0f);
  84. batch.Draw(_knob.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
  85. Color.White, _agentBody.Rotation, _knob.Origin + new Vector2(_offset, 0f), 1f,
  86. SpriteEffects.None, 0f);
  87. batch.Draw(_knob.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
  88. Color.White, _agentBody.Rotation, _knob.Origin - new Vector2(_offset, 0f), 1f,
  89. SpriteEffects.None, 0f);
  90. }
  91. }
  92. }