Spider.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using FarseerPhysics.Dynamics;
  2. using FarseerPhysics.Dynamics.Joints;
  3. using FarseerPhysics.Factories;
  4. using Microsoft.Xna.Framework;
  5. using Microsoft.Xna.Framework.Graphics;
  6. namespace FarseerPhysics.SamplesFramework
  7. {
  8. public class Spider
  9. {
  10. private const float SpiderBodyRadius = 0.65f;
  11. private bool _kneeFlexed;
  12. private float _kneeTargetAngle = -0.4f;
  13. private AngleJoint _leftKneeAngleJoint;
  14. private AngleJoint _leftShoulderAngleJoint;
  15. private Sprite _lowerLeg;
  16. private Vector2 _lowerLegSize = new Vector2(1.8f, 0.3f);
  17. private AngleJoint _rightKneeAngleJoint;
  18. private AngleJoint _rightShoulderAngleJoint;
  19. private float _s;
  20. private PhysicsGameScreen _screen;
  21. private bool _shoulderFlexed;
  22. private float _shoulderTargetAngle = -0.2f;
  23. private Sprite _torso;
  24. private Sprite _upperLeg;
  25. private Vector2 _upperLegSize = new Vector2(1.8f, 0.3f);
  26. private Body _circle;
  27. private Body _leftLower;
  28. private Body _leftUpper;
  29. private Body _rightLower;
  30. private Body _rightUpper;
  31. public Spider(World world, PhysicsGameScreen screen, Vector2 position)
  32. {
  33. //Load bodies
  34. _circle = BodyFactory.CreateCircle(world, SpiderBodyRadius, 0.1f, position);
  35. _circle.BodyType = BodyType.Dynamic;
  36. //Left upper leg
  37. _leftUpper = BodyFactory.CreateRectangle(world, _upperLegSize.X, _upperLegSize.Y, 0.1f,
  38. _circle.Position - new Vector2(SpiderBodyRadius, 0f) -
  39. new Vector2(_upperLegSize.X / 2f, 0f));
  40. _leftUpper.BodyType = BodyType.Dynamic;
  41. //Left lower leg
  42. _leftLower = BodyFactory.CreateRectangle(world, _lowerLegSize.X, _lowerLegSize.Y, 0.1f,
  43. _circle.Position - new Vector2(SpiderBodyRadius, 0f) -
  44. new Vector2(_upperLegSize.X, 0f) -
  45. new Vector2(_lowerLegSize.X / 2f, 0f));
  46. _leftLower.BodyType = BodyType.Dynamic;
  47. //Right upper leg
  48. _rightUpper = BodyFactory.CreateRectangle(world, _upperLegSize.X, _upperLegSize.Y, 0.1f,
  49. _circle.Position + new Vector2(SpiderBodyRadius, 0f) +
  50. new Vector2(_upperLegSize.X / 2f, 0f));
  51. _rightUpper.BodyType = BodyType.Dynamic;
  52. //Right lower leg
  53. _rightLower = BodyFactory.CreateRectangle(world, _lowerLegSize.X, _lowerLegSize.Y, 0.1f,
  54. _circle.Position + new Vector2(SpiderBodyRadius, 0f) +
  55. new Vector2(_upperLegSize.X, 0f) +
  56. new Vector2(_lowerLegSize.X / 2f, 0f));
  57. _rightLower.BodyType = BodyType.Dynamic;
  58. //Create joints
  59. JointFactory.CreateRevoluteJoint(world, _circle, _leftUpper, new Vector2(_upperLegSize.X / 2f, 0f));
  60. _leftShoulderAngleJoint = JointFactory.CreateAngleJoint(world, _circle, _leftUpper);
  61. _leftShoulderAngleJoint.MaxImpulse = 3f;
  62. JointFactory.CreateRevoluteJoint(world, _circle, _rightUpper, new Vector2(-_upperLegSize.X / 2f, 0f));
  63. _rightShoulderAngleJoint = JointFactory.CreateAngleJoint(world, _circle, _rightUpper);
  64. _rightShoulderAngleJoint.MaxImpulse = 3f;
  65. JointFactory.CreateRevoluteJoint(world, _leftUpper, _leftLower, new Vector2(_lowerLegSize.X / 2f, 0f));
  66. _leftKneeAngleJoint = JointFactory.CreateAngleJoint(world, _leftUpper, _leftLower);
  67. _leftKneeAngleJoint.MaxImpulse = 3f;
  68. JointFactory.CreateRevoluteJoint(world, _rightUpper, _rightLower, new Vector2(-_lowerLegSize.X / 2f, 0f));
  69. _rightKneeAngleJoint = JointFactory.CreateAngleJoint(world, _rightUpper, _rightLower);
  70. _rightKneeAngleJoint.MaxImpulse = 3;
  71. _screen = screen;
  72. //GFX
  73. AssetCreator creator = _screen.ScreenManager.Assets;
  74. _torso = new Sprite(creator.CircleTexture(SpiderBodyRadius, MaterialType.Waves, Color.Gray, 1f));
  75. _upperLeg = new Sprite(creator.TextureFromShape(_leftUpper.FixtureList[0].Shape,
  76. MaterialType.Blank, Color.DimGray, 1f));
  77. _lowerLeg = new Sprite(creator.TextureFromShape(_leftLower.FixtureList[0].Shape,
  78. MaterialType.Blank, Color.DarkSlateGray, 1f));
  79. }
  80. public void Update(GameTime gameTime)
  81. {
  82. _s += gameTime.ElapsedGameTime.Milliseconds;
  83. if (_s > 4000)
  84. {
  85. _s = 0;
  86. _kneeFlexed = !_kneeFlexed;
  87. _shoulderFlexed = !_shoulderFlexed;
  88. if (_kneeFlexed)
  89. _kneeTargetAngle = -1.4f;
  90. else
  91. _kneeTargetAngle = -0.4f;
  92. if (_kneeFlexed)
  93. _shoulderTargetAngle = -1.2f;
  94. else
  95. _shoulderTargetAngle = -0.2f;
  96. }
  97. _leftKneeAngleJoint.TargetAngle = _kneeTargetAngle;
  98. _rightKneeAngleJoint.TargetAngle = -_kneeTargetAngle;
  99. _leftShoulderAngleJoint.TargetAngle = _shoulderTargetAngle;
  100. _rightShoulderAngleJoint.TargetAngle = -_shoulderTargetAngle;
  101. }
  102. public void Draw()
  103. {
  104. SpriteBatch batch = _screen.ScreenManager.SpriteBatch;
  105. batch.Draw(_lowerLeg.Texture, ConvertUnits.ToDisplayUnits(_leftLower.Position), null,
  106. Color.White, _leftLower.Rotation, _lowerLeg.Origin, 1f, SpriteEffects.None, 0f);
  107. batch.Draw(_lowerLeg.Texture, ConvertUnits.ToDisplayUnits(_rightLower.Position), null,
  108. Color.White, _rightLower.Rotation, _lowerLeg.Origin, 1f, SpriteEffects.None, 0f);
  109. batch.Draw(_upperLeg.Texture, ConvertUnits.ToDisplayUnits(_leftUpper.Position), null,
  110. Color.White, _leftUpper.Rotation, _upperLeg.Origin, 1f, SpriteEffects.None, 0f);
  111. batch.Draw(_upperLeg.Texture, ConvertUnits.ToDisplayUnits(_rightUpper.Position), null,
  112. Color.White, _rightUpper.Rotation, _upperLeg.Origin, 1f, SpriteEffects.None, 0f);
  113. batch.Draw(_torso.Texture, ConvertUnits.ToDisplayUnits(_circle.Position), null,
  114. Color.White, _circle.Rotation, _torso.Origin, 1f, SpriteEffects.None, 0f);
  115. }
  116. }
  117. }