PageRenderTime 42ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Classes/Object/ObjectSearcher.cs

http://github.com/Concliff/Maze
C# | 151 lines | 107 code | 28 blank | 16 comment | 24 complexity | 59d782eb19f66a559de6a0bf8b479451 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Maze.Forms;
  6. namespace Maze.Classes
  7. {
  8. /// <summary>
  9. /// Provides static methods to search the <see cref="Object"/>s and its derived classes in <see cref="ObjectContainer"/>.
  10. /// </summary>
  11. public static class ObjectSearcher
  12. {
  13. //
  14. // Within Range Methods:
  15. //
  16. public static List<Object> GetObjectsWithinRange(Object searcher, int rangeDistance)
  17. {
  18. List<Object> objects = GetObjectsInArea(searcher.Position, rangeDistance);
  19. // exclude itself
  20. objects.Remove(searcher);
  21. return objects;
  22. }
  23. public static List<GridObject> GetGridObjectsWithinRange(Object searcher, int rangeDistance)
  24. {
  25. List<GridObject> gridObjects = GetGridObjectsInArea(searcher.Position, rangeDistance);
  26. // exclude itself
  27. if (searcher.ObjectType == ObjectTypes.GridObject)
  28. gridObjects.Remove((GridObject)searcher);
  29. return gridObjects;
  30. }
  31. public static List<Unit> GetUnitsWithinRange(Object searcher, int rangeDistance)
  32. {
  33. return GetUnitsWithinRange(searcher, rangeDistance, true, true);
  34. }
  35. public static List<Unit> GetUnitsWithinRange(Object searcher, int rangeDistance, bool isVisibleOnly, bool isAliveOnly)
  36. {
  37. List<Unit> units = GetUnitsInArea(searcher.Position, rangeDistance, isVisibleOnly, isAliveOnly);
  38. // exclude itself
  39. if (searcher.ObjectType == ObjectTypes.Unit || searcher.ObjectType == ObjectTypes.Slug)
  40. units.Remove((Unit)searcher);
  41. return units;
  42. }
  43. //
  44. // In Area Methods:
  45. //
  46. public static List<GridObject> GetGridObjectsInArea(GPS centralPosition, int radius)
  47. {
  48. List<GridLocation> locations = GetMatchedLocations(centralPosition, radius);
  49. List<GridObject> objects = new List<GridObject>();
  50. foreach (GridLocation location in locations)
  51. {
  52. List<GridObject> foundObject = ObjectContainer.Instance.GetGridObjects(location);
  53. if (foundObject.Count == 0)
  54. continue;
  55. foundObject = FilterInRangeObjects<GridObject>(foundObject, centralPosition, radius);
  56. if (foundObject.Count > 0)
  57. objects.AddRange(foundObject);
  58. }
  59. return objects;
  60. }
  61. public static List<Unit> GetUnitsInArea(GPS centralPosition, int radius, bool isVisibleOnly, bool isAliveOnly)
  62. {
  63. List<GridLocation> locations = GetMatchedLocations(centralPosition, radius);
  64. List<Unit> units = new List<Unit>();
  65. foreach (GridLocation location in locations)
  66. {
  67. List<Unit> foundUnits = ObjectContainer.Instance.GetUnits(location);
  68. if (foundUnits.Count == 0)
  69. continue;
  70. foundUnits = FilterInRangeObjects<Unit>(foundUnits, centralPosition, radius);
  71. if (foundUnits.Count > 0)
  72. foreach (Unit unit in foundUnits)
  73. if ((!isVisibleOnly || (isVisibleOnly && unit.IsVisible)) && (!isAliveOnly || (isAliveOnly && unit.IsAlive)))
  74. units.Add(unit);
  75. }
  76. return units;
  77. }
  78. public static List<Object> GetObjectsInArea(GPS centralPosition, int radius)
  79. {
  80. List<GridLocation> locations = GetMatchedLocations(centralPosition, radius);
  81. List<Object> objects = new List<Object>();
  82. foreach (GridLocation location in locations)
  83. {
  84. List<Object> foundObjects = ObjectContainer.Instance.GetObjects(location);
  85. if (foundObjects.Count == 0)
  86. continue;
  87. foundObjects = FilterInRangeObjects<Object>(foundObjects, centralPosition, radius);
  88. if (foundObjects.Count > 0)
  89. objects.AddRange(foundObjects);
  90. }
  91. return objects;
  92. }
  93. //
  94. // Helper Methods:
  95. //
  96. private static List<GridLocation> GetMatchedLocations(GPS position, int radius)
  97. {
  98. List<GridLocation> locations = new List<GridLocation>();
  99. // How much cells use for search
  100. int cellsToNorth = (int)Math.Ceiling(Math.Abs(position.Location.Y - radius) * 1d / GlobalConstants.CELL_HEIGHT);
  101. int cellsToSouth = (int)Math.Floor(Math.Abs(position.Location.Y + radius) * 1d / GlobalConstants.CELL_HEIGHT);
  102. int cellsToWest = (int)Math.Ceiling(Math.Abs(position.Location.X - radius) * 1d / GlobalConstants.CELL_WIDTH);
  103. int cellsToEast = (int)Math.Floor(Math.Abs(position.Location.X + radius) * 1d / GlobalConstants.CELL_WIDTH);
  104. GridLocation searchLocation = position.Location;
  105. for (int width = position.Location.X - cellsToWest; width <= position.Location.X + cellsToEast; ++width)
  106. for (int height = position.Location.Y - cellsToNorth; height <= position.Location.Y + cellsToSouth; ++height)
  107. {
  108. searchLocation.X = width;
  109. searchLocation.Y = height;
  110. locations.Add(searchLocation);
  111. }
  112. return locations;
  113. }
  114. private static List<T> FilterInRangeObjects<T>(List<T> objects, GPS position, int range) where T : Object
  115. {
  116. List<T> matchedObjects = new List<T>();
  117. foreach (T obj in objects)
  118. if (obj.Position.GetDistance(position) <= range)
  119. matchedObjects.Add(obj);
  120. return matchedObjects;
  121. }
  122. }
  123. }