public static bool AreAdjacent(Polygon first, Polygon second) { int counter = 0; foreach (Vector2 point in first.nodes) { if (second.nodes.Contains(point)) { ++counter; if (counter == 2) break; } } return counter == 2; }
/// <summary> /// Calculates the character's polygon /// </summary> /// <param name="character">Kinematic of the character</param> /// <returns>The polygon of the character</returns> protected Polygon GetPolygon(Kinematic character) { Vector2 vect = new Vector2(character.position.X, character.position.Y); float min = float.PositiveInfinity; Polygon closest = new Polygon(new List<Vector2>()); foreach (Polygon poly in GameMode.polygons) if (poly.Contains(vect)) { return poly; } else if ((poly.center - vect).Length() < min) { min = (poly.center - vect).Length(); closest = poly; } return closest; }
/// <summary> /// Calculates the character's polygon /// </summary> /// <param name="character">Kinematic of the character</param> /// <returns>The polygon of the character</returns> protected Polygon GetPolygon(Kinematic character) { float min = float.PositiveInfinity; Polygon polygon = new Polygon(new List<Vector2>()); Vector2 vect = new Vector2(character.position.X, character.position.Y); foreach (Polygon poly in GameMode.polygons) { float diff = Vector2.Distance(poly.center, vect); if (poly.Contains(vect) && diff < min) { min = diff; polygon = poly; } } return polygon; }
public override SteeringOutput GetSteering(Kinematic character, Kinematic target) { // If the characters are in the same polygon, do nothing Polygon targetPolygon = GetPolygon(target); if (lastPolygon.center != targetPolygon.center) { // Generate a new path AStar star = new AStar(GameMode.movement); Node c = GetNearestNode(character); Node t = GetNearestNode(target); if (heuristic == 's') path = star.Pathfind(c, t, new SafestHeuristic(t)); else path = star.Pathfind(c, t, new ClosestHeuristic(t)); lastPolygon = targetPolygon; } return base.GetSteering(character, target); }