Enemy.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.Xna.Framework;
  6. using Microsoft.Xna.Framework.Graphics;
  7. namespace Robot_Rampage
  8. {
  9. class Enemy
  10. {
  11. #region Declarations
  12. public Sprite EnemyBase;
  13. public Sprite EnemyClaws;
  14. public float EnemySpeed = 60f;
  15. public Vector2 currentTargetSquare;
  16. public bool Destroyed = false;
  17. private int collisionRadius = 14;
  18. #endregion
  19. #region Constructor
  20. public Enemy(
  21. Vector2 worldLocation,
  22. Texture2D texture,
  23. Rectangle initialFrame)
  24. {
  25. EnemyBase = new Sprite(
  26. worldLocation,
  27. texture,
  28. initialFrame,
  29. Vector2.Zero);
  30. EnemyBase.CollisionRadius = collisionRadius;
  31. Rectangle turretFrame = initialFrame;
  32. turretFrame.Offset(0, initialFrame.Height);
  33. EnemyClaws = new Sprite(
  34. worldLocation,
  35. texture,
  36. turretFrame,
  37. Vector2.Zero);
  38. }
  39. #endregion
  40. #region AI Methods
  41. private Vector2 determineMoveDirection()
  42. {
  43. if (reachedTargetSquare())
  44. {
  45. currentTargetSquare = getNewTargetSquare();
  46. }
  47. Vector2 squareCenter = TileMap.GetSquareCenter(
  48. currentTargetSquare);
  49. return squareCenter - EnemyBase.WorldCenter;
  50. }
  51. private bool reachedTargetSquare()
  52. {
  53. return (
  54. Vector2.Distance(
  55. EnemyBase.WorldCenter,
  56. TileMap.GetSquareCenter(currentTargetSquare))
  57. <= 2);
  58. }
  59. private Vector2 getNewTargetSquare()
  60. {
  61. List<Vector2> path = PathFinder.FindPath(
  62. TileMap.GetSquareAtPixel(EnemyBase.WorldCenter),
  63. TileMap.GetSquareAtPixel(Player.BaseSprite.WorldCenter));
  64. if (path.Count > 1)
  65. {
  66. return new Vector2(path[1].X, path[1].Y);
  67. }
  68. else
  69. {
  70. return TileMap.GetSquareAtPixel(
  71. Player.BaseSprite.WorldCenter);
  72. }
  73. }
  74. #endregion
  75. #region Public Methods
  76. public void Update(GameTime gameTime)
  77. {
  78. if (!Destroyed)
  79. {
  80. Vector2 direction = determineMoveDirection();
  81. direction.Normalize();
  82. EnemyBase.Velocity = direction * EnemySpeed;
  83. EnemyBase.RotateTo(direction);
  84. EnemyBase.Update(gameTime);
  85. Vector2 directionToPlayer =
  86. Player.BaseSprite.WorldCenter -
  87. EnemyBase.WorldCenter;
  88. directionToPlayer.Normalize();
  89. EnemyClaws.WorldLocation = EnemyBase.WorldLocation;
  90. EnemyClaws.RotateTo(directionToPlayer);
  91. }
  92. }
  93. public void Draw(SpriteBatch spriteBatch)
  94. {
  95. if (!Destroyed)
  96. {
  97. EnemyBase.Draw(spriteBatch);
  98. EnemyClaws.Draw(spriteBatch);
  99. }
  100. }
  101. #endregion
  102. }
  103. }