/// <summary> /// 计算移动方式 /// <para>必须保证 p1 p2相临再跑一步的距离内</para> /// </summary> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <returns></returns> public RunType CalculationRunType(PositionInfo position, Point p2) { var xd = position.Point.X - p2.X; var yd = position.Point.Y - p2.Y; if (Math.Abs(xd) <= 1 && Math.Abs(yd) <= 1) { return(RunType.Normal); } else { //Point p3 = new Point(p2.X + x, p2.Y + y); var maze = MirContext.Maze(position.MapInfo); int x = p2.X + xd; int y = p2.Y + yd; if (x > MirContext.ReadMap.Width || y > MirContext.ReadMap.Height)//跑步终点坐标超出地图 { return(RunType.Normal); } else { //跑步终点坐标有障碍物则走,否则跑 return(maze[x, y] == 1 ? RunType.Normal : RunType.FastRun); } } }
public MirAction(dmsoft _dmsoft, MirContext _mirContext) { dmsoft = _dmsoft; mirContext = _mirContext; }
/// <summary> /// 走到坐标 /// </summary> /// <param name="mapInfo"></param> /// <param name="point"></param> /// <param name="cancellationTokenSource"></param> /// <param name="distance"></param> /// <returns></returns> public MirResult MoveToPoint(MapInfo mapInfo, Point point, CancellationTokenSource cancellationTokenSource, int distance = 2, Func <bool> func = null) { var position = MirContext.Position; //同一个地图判断 if (!position.MapInfo.Equals(mapInfo)) { return(new MirResult(Consts.NotSameMap, "不在同一个地图")); } //距离判断 if (CalculationDistance(position.Point, point) <= distance) { return(new MirResult()); } /** * 1.找到两个点的路径 * 2.循环路径,一个个点的走过去(需要考虑人怪卡位问题) */ string message = string.Empty; #region 1.找到两个点的路径 var findPath = FindPath(position, point); var pathPoints = findPath.Data; if (findPath.Success && !pathPoints.Any()) { return(new MirResult(Consts.AutoRoteFail, findPath.Message)); } #endregion #region 循环路径,一个个点的走过去(需要考虑人怪卡位问题) Point firstPoint = pathPoints.FirstOrDefault(); //Point secondPoint = null; MirDirection mirDirection = MirDirection.None; RunType runType = RunType.FastRun; //移动是否成功 bool moveState = false; bool reFindPath = false; //循环条件 //还有点位没有走到 //没有被取消 //同一个地图 //距离大于 distance while (firstPoint != null && !cancellationTokenSource.IsCancellationRequested && position.MapInfo.Equals(mapInfo) && CalculationDistance(position.Point, point) > distance) { try { #region 计算移动方向 mirDirection = CalculationDirection(position.Point, firstPoint); if (mirDirection == MirDirection.None) { pathPoints.Remove(firstPoint); //已经到达位置,需要重新计算路线 //findPath = FindPath(MirContext.Position, point); //if(findPath.Success && findPath.Data.Any()) //{ // pathPoints = findPath.Data; //} //else //{ // pathPoints = new List<Point>(); //} continue; } #endregion #region 计算移动方式 runType = CalculationRunType(position, firstPoint); #endregion #region 移动 var actionResult = MirAction.Move(mirDirection, runType); //#TODO 判断 actionResult 状态,并输入日志 moveState = actionResult.Data; if (moveState) { //更新最后移动时间 MirContext.LastMoveTime = new DateTime(); pathPoints.Remove(firstPoint); //打怪过程有移动过,这重新寻路 if (func != null) { reFindPath = func(); } } else { var nextPoint = GetNextPoint(position.Point, mirDirection, runType); //#TODO,如果是跑,需要再处理下 //移动失败,15秒内不走这个点 MirContext.AddBartPoint(nextPoint, position.MapInfo, DateTime.Now.AddSeconds(15)); if (LongTimeNotMove()) { //长时间被堵住,随用随机飞 } //被堵后,重新寻路 reFindPath = true; } if (reFindPath) { findPath = FindPath(MirContext.Position, point); if (findPath.Success && findPath.Data.Any()) { pathPoints = findPath.Data; } else { pathPoints = new List <Point>(); return(new MirResult(findPath.Code, findPath.Message)); } } #endregion } finally { firstPoint = pathPoints.FirstOrDefault(); position = MirContext.Position; } } #endregion return(new MirResult()); }
public AbstractMirService(MirContext mirContext, CancellationTokenSource cancellationTokenSource) { this.MirContext = mirContext; }
/// <summary> /// 寻路 /// </summary> /// <param name="position"></param> /// <param name="to"></param> /// <returns></returns> protected ActionResult <List <APoint> > FindPath(PositionInfo position, APoint to) { PathGrid pathGrid = new PathGrid(MirContext.ReadMap.Width, MirContext.ReadMap.Height, MirContext.Maze(position.MapInfo)); return(new ActionResult <List <APoint> >(pathGrid.FindPath(position.Point, to))); }