/// <summary> /// floyed line smooth func /// </summary> /// <param name="path"></param> /// <returns></returns> private static void Floyd(ref List <Point> path) { if (path == null) { return; } var index = 0; if (path.Count > 2) { while (index < path.Count - 2) { if (Math.Abs(path[index + 2].X - path[index].X) == 1 && Math.Abs(path[index + 2].Y - path[index].Y) == 1) { path.RemoveAt(index + 1); } index++; } } var len = path.Count; if (len > 2) { var vector = new Point(0, 0); var tempVector = new Point(0, 0); // loop all the node in the path and unite all the points which are in a same row FloydVector(ref vector, path[len - 1], path[len - 2]); for (var i = path.Count - 3; i >= 0; i--) { FloydVector(ref tempVector, path[i + 1], path[i]); if (vector.X == tempVector.X && vector.Y == tempVector.Y) { path.RemoveAt(i + 1); } else { vector.X = tempVector.X; vector.Y = tempVector.Y; } } } // delete the inflexions len = path.Count; for (var i = len - 1; i >= 0; i--) { for (var j = 0; j <= i - 2; j++) { if (!MathUi.HasBarrier(path[i], path[j])) { for (var k = i - 1; k > j; k--) { path.RemoveAt(k); } i = j; break; } } } }
/// <summary> /// find the path /// </summary> /// <returns></returns> protected List <Vector2> PathFinding(Vector2 start, Vector2 end) { var result = new List <Vector2>(); var startPosX = Math.Round(start.X / 32f) > 99 ? 99 : Math.Round(start.X / 32f); var startPosY = Math.Round(start.Y / 32f) > 99 ? 99 : Math.Round(start.Y / 32f); var startPos = new Point((int)startPosX, (int)startPosY); var endPosX = Math.Round(end.X / 32) > 99 ? 99 : Math.Round(end.X / 32); var endPosY = Math.Round(end.Y / 32) > 99 ? 99 : Math.Round(end.Y / 32); var endPos = new Point((int)endPosX, (int)endPosY); if ((startPosX < 0 && startPosY < 0) || (startPosX > 99 && startPosY > 99) || (endPosX < 0 && endPosY < 0) || (endPosX > 99 && endPosY > 99)) { return(result); } if (ScreenManager.mPlayScreen.mObjectHandler.mAbstractMap.mStaticBarriers.ContainsKey(endPos) || ScreenManager.mPlayScreen.mObjectHandler.mAbstractMap.mDynamicBarriers.ContainsKey(endPos)) { endPos = ScreenManager.mPlayScreen.mObjectHandler.mAbstractMap.FindSubstitutePosition(endPos); if (endPos == Point.Zero) { return(result); } } var hasBarrier = MathUi.HasBarrier(startPos, endPos); if (hasBarrier) { var path = BidirectionAStar(startPos, endPos); result.AddRange(path.Select(node => new Vector2(node.X * 32, node.Y * 32))); } else { result.Add(new Vector2(endPos.X * 32, endPos.Y * 32)); } return(result); }