2
0

Objects.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System.Collections.Generic;
  2. using FarseerPhysics.Common;
  3. using FarseerPhysics.Dynamics;
  4. using FarseerPhysics.Factories;
  5. using Microsoft.Xna.Framework;
  6. using Microsoft.Xna.Framework.Graphics;
  7. namespace FarseerPhysics.SamplesFramework
  8. {
  9. public enum ObjectType
  10. {
  11. Circle,
  12. Rectangle,
  13. Gear,
  14. Star
  15. }
  16. public class Objects
  17. {
  18. private List<Body> _bodies;
  19. private Category _collidesWith;
  20. private Category _collisionCategories;
  21. private Sprite _object;
  22. private PhysicsGameScreen _screen;
  23. public Objects(World world, PhysicsGameScreen screen, Vector2 startPosition, Vector2 endPosition, int count,
  24. float radius, ObjectType type)
  25. {
  26. _bodies = new List<Body>(count);
  27. CollidesWith = Category.All;
  28. CollisionCategories = Category.All;
  29. for (int i = 0; i < count; ++i)
  30. {
  31. switch (type)
  32. {
  33. case ObjectType.Circle:
  34. _bodies.Add(BodyFactory.CreateCircle(world, radius, 1f));
  35. break;
  36. case ObjectType.Rectangle:
  37. _bodies.Add(BodyFactory.CreateRectangle(world, radius, radius, 1f));
  38. break;
  39. case ObjectType.Star:
  40. _bodies.Add(BodyFactory.CreateGear(world, radius, 10, 0f, 1f, 1f));
  41. break;
  42. case ObjectType.Gear:
  43. _bodies.Add(BodyFactory.CreateGear(world, radius, 10, 100f, 1f, 1f));
  44. break;
  45. }
  46. }
  47. for (int i = 0; i < _bodies.Count; ++i)
  48. {
  49. Body body = _bodies[i];
  50. body.BodyType = BodyType.Dynamic;
  51. body.Position = Vector2.Lerp(startPosition, endPosition, i / (float)(count - 1));
  52. body.Restitution = .7f;
  53. body.Friction = .2f;
  54. body.CollisionCategories = CollisionCategories;
  55. body.CollidesWith = CollidesWith;
  56. }
  57. _screen = screen;
  58. //GFX
  59. AssetCreator creator = _screen.ScreenManager.Assets;
  60. switch (type)
  61. {
  62. case ObjectType.Circle:
  63. _object = new Sprite(creator.CircleTexture(radius, MaterialType.Dots, Color.DarkRed, 0.8f));
  64. break;
  65. case ObjectType.Rectangle:
  66. _object =
  67. new Sprite(creator.TextureFromVertices(PolygonTools.CreateRectangle(radius / 2f, radius / 2f),
  68. MaterialType.Dots, Color.Blue, 0.8f));
  69. break;
  70. case ObjectType.Star:
  71. _object = new Sprite(creator.TextureFromVertices(PolygonTools.CreateGear(radius, 10, 0f, 1f),
  72. MaterialType.Dots, Color.Yellow, 0.8f));
  73. break;
  74. case ObjectType.Gear:
  75. _object = new Sprite(creator.TextureFromVertices(PolygonTools.CreateGear(radius, 10, 100f, 1f),
  76. MaterialType.Dots, Color.DarkGreen, 0.8f));
  77. break;
  78. }
  79. }
  80. public Category CollisionCategories
  81. {
  82. get { return _collisionCategories; }
  83. set
  84. {
  85. _collisionCategories = value;
  86. foreach (Body body in _bodies)
  87. {
  88. body.CollisionCategories = _collisionCategories;
  89. }
  90. }
  91. }
  92. public Category CollidesWith
  93. {
  94. get { return _collidesWith; }
  95. set
  96. {
  97. _collidesWith = value;
  98. foreach (Body body in _bodies)
  99. {
  100. body.CollidesWith = _collidesWith;
  101. }
  102. }
  103. }
  104. public void Draw()
  105. {
  106. SpriteBatch batch = _screen.ScreenManager.SpriteBatch;
  107. for (int i = 0; i < _bodies.Count; ++i)
  108. {
  109. batch.Draw(_object.Texture, ConvertUnits.ToDisplayUnits(_bodies[i].Position), null,
  110. Color.White, _bodies[i].Rotation, _object.Origin, 1f, SpriteEffects.None, 0f);
  111. }
  112. }
  113. }
  114. }