// 根据地图坐标点获得tiledmap坐标 public static APoint GetAPointByPosition(Vector2 pos, TILEDMAP_TYPE type = TILEDMAP_TYPE.START) { float x = (pos.x + 204) / JsonTest.getMe().m_mapData.getgeziw(); float y = (pos.y + 118) / JsonTest.getMe().m_mapData.getgezih(); if (x < 0) { x = 0; } if (y < 0) { y = 0; } return(new APoint((int)x, (int)y, type)); }
/** * 搜索算法 */ public static List <APoint> Search() { MinHeap heap = new MinHeap(); // 用最小堆来记录扩展的点 XyData[] directs = new XyData[4]; // 可以扩展的四个方向 //[{ x: 1, y: 0}, { x: 0, y: 1}, { x: -1, y: 0}, { x: 0, y: -1}]; directs[0] = new XyData(1, 0); directs[1] = new XyData(0, 1); directs[2] = new XyData(-1, 0); directs[3] = new XyData(0, -1); heap.add(new PointData(Astar.mStartPos, 0, 0, null)); // 把起始点放入堆 PointData lastData = null; // 找到的最后一个点的数据,用来反推路径 for (bool finish = false; !finish && !heap.isEmpty();) { PointData data = heap.getAndRemoveMin(); // 取出f值最小的点 APoint point = data.point; if (MapMgr.width <= point.x) { continue; } if (Astar.mRoadPointArr[point.x] == null) { continue; } if (Astar.mRoadPointArr[point.x][point.y] == TILEDMAP_TYPE.SPACE) // 将取出的点标识为已访问点 { Astar.mRoadPointArr[point.x][point.y] = TILEDMAP_TYPE.VISITED; } for (int i = 0; i < directs.Length; ++i) // 遍历四个方向的点 { APoint newPnt = new APoint(point.x + directs[i].x, point.y + directs[i].y); if (newPnt.x >= 0 && newPnt.x < MapMgr.width && newPnt.y >= 0 && newPnt.y < MapMgr.height) { TILEDMAP_TYPE e = Astar.mRoadPointArr[newPnt.x][newPnt.y]; if (Astar.mEndPos.equals(newPnt)) // 如果是终点,则跳出循环,不用再找 { lastData = data; finish = true; break; } if (e != TILEDMAP_TYPE.SPACE) // 如果不是空地,就不需要再扩展 { continue; } PointData inQueueData = heap.find(newPnt); if (inQueueData != null) // 如果在堆里,则更新g值 { if (inQueueData.g > data.g + 1) { inQueueData.g = data.g + 1; inQueueData.parent = data; } } else // 如果不在堆里,则放入堆中 { float h = Astar.h(newPnt); PointData newData = new PointData(newPnt, data.g + 1, h, data); heap.add(newData); } } } } List <APoint> arr = new List <APoint>(); // 反向找出路径 for (PointData pathData = lastData; pathData != null;) { APoint pnt = pathData.point; if (Astar.mRoadPointArr[pnt.x][pnt.y] == TILEDMAP_TYPE.VISITED) { Astar.mRoadPointArr[pnt.x][pnt.y] = TILEDMAP_TYPE.ON_PATH; arr.Add(pnt); } pathData = pathData.parent; } return(arr); }
public APoint(APoint p) { this.x = p.x; this.y = p.y; this.type = p.type; }
public APoint(int x, int y, TILEDMAP_TYPE type) { this.x = x; this.y = y; this.type = type; }