GoalManager.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. static class GoalManager
  10. {
  11. #region Declarations
  12. private static List<ComputerTerminal> computerTerminals =
  13. new List<ComputerTerminal>();
  14. private static int activeCount = 0;
  15. private static int minDistanceFromPlayer = 250;
  16. private static Random rand = new Random();
  17. private static Texture2D texture;
  18. private static Rectangle initialActiveFrame;
  19. private static Rectangle initialDisabledFrame;
  20. private static int activeFrameCount;
  21. private static int disabledFrameCount;
  22. #endregion
  23. #region Properties
  24. public static int ActiveTerminals
  25. {
  26. get { return activeCount; }
  27. }
  28. #endregion
  29. #region Initialization
  30. public static void Initialize(
  31. Texture2D textureSheet,
  32. Rectangle initialActiveRectangle,
  33. Rectangle initialDisabledRectangle,
  34. int activeFrames,
  35. int disabledFrames)
  36. {
  37. texture = textureSheet;
  38. initialActiveFrame = initialActiveRectangle;
  39. initialDisabledFrame = initialDisabledRectangle;
  40. activeFrameCount = activeFrames;
  41. disabledFrameCount = disabledFrames;
  42. }
  43. #endregion
  44. #region Terminal Management
  45. public static ComputerTerminal TerminalInSquare(
  46. Vector2 mapLocation)
  47. {
  48. foreach (ComputerTerminal terminal in computerTerminals)
  49. {
  50. if (terminal.MapLocation == mapLocation)
  51. {
  52. return terminal;
  53. }
  54. }
  55. return null;
  56. }
  57. public static void DetectShutdowns()
  58. {
  59. foreach (ComputerTerminal terminal in computerTerminals)
  60. {
  61. if (terminal.Active)
  62. {
  63. if (terminal.IsCircleColliding(
  64. Player.BaseSprite.WorldCenter,
  65. Player.BaseSprite.CollisionRadius))
  66. {
  67. terminal.Deactivate();
  68. activeCount--;
  69. GameManager.Score += 100;
  70. }
  71. }
  72. }
  73. }
  74. public static void AddComputerTerminal()
  75. {
  76. int startX = rand.Next(2, TileMap.MapWidth - 2);
  77. int startY = rand.Next(0, TileMap.MapHeight - 2);
  78. Vector2 tileLocation = new Vector2(startX, startY);
  79. if ((TerminalInSquare(tileLocation) != null) ||
  80. (TileMap.IsWallTile(tileLocation)))
  81. {
  82. return;
  83. }
  84. if (Vector2.Distance(
  85. TileMap.GetSquareCenter(startX, startY),
  86. Player.BaseSprite.WorldCenter) < minDistanceFromPlayer)
  87. {
  88. return;
  89. }
  90. List<Vector2> path =
  91. PathFinder.FindPath(
  92. new Vector2(startX, startY),
  93. TileMap.GetSquareAtPixel(
  94. Player.BaseSprite.WorldCenter));
  95. if (path != null)
  96. {
  97. Rectangle squareRect =
  98. TileMap.SquareWorldRectangle(startX, startY);
  99. Sprite activeSprite = new Sprite(
  100. new Vector2(squareRect.X, squareRect.Y),
  101. texture,
  102. initialActiveFrame,
  103. Vector2.Zero);
  104. for (int x = 1; x < 3; x++)
  105. {
  106. activeSprite.AddFrame(
  107. new Rectangle(
  108. initialActiveFrame.X + (x *
  109. initialActiveFrame.Width),
  110. initialActiveFrame.Y,
  111. initialActiveFrame.Width,
  112. initialActiveFrame.Height));
  113. }
  114. activeSprite.CollisionRadius = 15;
  115. Sprite disabledSprite = new Sprite(
  116. new Vector2(squareRect.X, squareRect.Y),
  117. texture,
  118. initialDisabledFrame,
  119. Vector2.Zero);
  120. ComputerTerminal terminal = new ComputerTerminal(
  121. activeSprite,
  122. disabledSprite,
  123. new Vector2(startX, startY));
  124. float timerOffset = (float)rand.Next(1, 100);
  125. terminal.LastSpawnCounter = timerOffset / 100f;
  126. computerTerminals.Add(terminal);
  127. activeCount++;
  128. }
  129. }
  130. #endregion
  131. #region Public Methods
  132. public static void GenerateComputers(int computerCount)
  133. {
  134. computerTerminals.Clear();
  135. activeCount = 0;
  136. while (activeCount < computerCount)
  137. {
  138. AddComputerTerminal();
  139. }
  140. }
  141. public static void Update(GameTime gameTime)
  142. {
  143. DetectShutdowns();
  144. foreach (ComputerTerminal terminal in
  145. computerTerminals)
  146. {
  147. terminal.Update(gameTime);
  148. }
  149. }
  150. public static void Draw(SpriteBatch spriteBatch)
  151. {
  152. foreach (ComputerTerminal terminal in
  153. computerTerminals)
  154. {
  155. terminal.Draw(spriteBatch);
  156. }
  157. }
  158. #endregion
  159. }
  160. }