public Node SetNode(GridPos iPos, bool? iWalkable = null) { if (iWalkable.HasValue) { if (iWalkable.Value == true) { if (m_nodes.ContainsKey(iPos)) return m_nodes[iPos]; Node newNode = new Node(iPos.x, iPos.y, iWalkable); m_nodes.Add(iPos, newNode); return newNode; } else { removeNode(iPos); } } else { Node newNode = new Node(iPos.x, iPos.y, true); m_nodes.Add(iPos, newNode); return newNode; } return null; }
public JumpPointParam(BaseGrid iGrid, GridPos iStartPos, GridPos iEndPos, bool iAllowEndNodeUnWalkable = true, bool iCrossCorner = true, bool iCrossAdjacentPoint = true, HeuristicMode iMode = HeuristicMode.EUCLIDEAN) { switch (iMode) { case HeuristicMode.MANHATTAN: m_heuristic = new HeuristicDelegate(Heuristic.Manhattan); break; case HeuristicMode.EUCLIDEAN: m_heuristic = new HeuristicDelegate(Heuristic.Euclidean); break; case HeuristicMode.CHEBYSHEV: m_heuristic = new HeuristicDelegate(Heuristic.Chebyshev); break; default: m_heuristic = new HeuristicDelegate(Heuristic.Euclidean); break; } m_allowEndNodeUnWalkable = iAllowEndNodeUnWalkable; m_crossAdjacentPoint = iCrossAdjacentPoint; m_crossCorner = iCrossCorner; openList = new List<Node>(); m_searchGrid = iGrid; m_startNode = m_searchGrid.GetNodeAt(iStartPos.x, iStartPos.y); m_endNode = m_searchGrid.GetNodeAt(iEndPos.x, iEndPos.y); if (m_startNode == null) m_startNode = new Node(iStartPos.x, iStartPos.y, true); if (m_endNode == null) m_endNode = new Node(iEndPos.x, iEndPos.y, true); m_useRecursive = false; }
public Node GetNode(GridPos iPos) { if (m_nodes.ContainsKey(iPos)) return m_nodes[iPos]; return null; }
public override Node GetNodeAt(GridPos iPos) { if (m_nodes.ContainsKey(iPos)) { return m_nodes[iPos]; } return null; }
public override bool SetWalkableAt(GridPos iPos, bool iWalkable) { return SetWalkableAt(iPos.x, iPos.y, iWalkable); }
public override bool IsWalkableAt(GridPos iPos) { return m_nodes.ContainsKey(iPos); }
public override Node GetNodeAt(GridPos iPos) { return GetNodeAt(iPos.x, iPos.y); }
public override bool IsWalkableAt(GridPos iPos) { if (!IsInside(iPos)) return false; return m_nodePool.Nodes.ContainsKey(iPos); }
public override Node GetNodeAt(GridPos iPos) { if (!IsInside(iPos)) return null; return m_nodePool.GetNode(iPos); }
public abstract Node GetNodeAt(GridPos iPos);
public override Node GetNodeAt(GridPos iPos) { return m_nodePool.GetNode(iPos); }
public override bool SetWalkableAt(int iX, int iY, bool iWalkable) { GridPos pos = new GridPos(iX, iY); m_nodePool.SetNode(pos, iWalkable); if (iWalkable) { if (iX < m_gridRect.minX || m_notSet) m_gridRect.minX = iX; if (iX > m_gridRect.maxX || m_notSet) m_gridRect.maxX = iX; if (iY < m_gridRect.minY || m_notSet) m_gridRect.minY = iY; if (iY > m_gridRect.maxY || m_notSet) m_gridRect.maxY = iY; m_notSet = false; } else { if (iX == m_gridRect.minX || iX == m_gridRect.maxX || iY == m_gridRect.minY || iY == m_gridRect.maxY) m_notSet = true; } return true; }
protected void removeNode(GridPos iPos) { if (m_nodes.ContainsKey(iPos)) m_nodes.Remove(iPos); }
protected void removeNode(int iX, int iY) { GridPos pos = new GridPos(iX, iY); removeNode(pos); }
public Node SetNode(int iX, int iY, bool? iWalkable = null) { GridPos pos = new GridPos(iX, iY); return SetNode(pos,iWalkable); }
public override void Reset() { int rectCount=(m_gridRect.maxX-m_gridRect.minX) * (m_gridRect.maxY-m_gridRect.minY); if (m_nodePool.Nodes.Count > rectCount) { GridPos travPos = new GridPos(0, 0); for (int xTrav = m_gridRect.minX; xTrav <= m_gridRect.maxX; xTrav++) { travPos.x = xTrav; for (int yTrav = m_gridRect.minY; yTrav <= m_gridRect.maxY; yTrav++) { travPos.y = yTrav; Node curNode=m_nodePool.GetNode(travPos); if (curNode!=null) curNode.Reset(); } } } else { foreach (KeyValuePair<GridPos, Node> keyValue in m_nodePool.Nodes) { keyValue.Value.Reset(); } } }
public override bool SetWalkableAt(int iX, int iY, bool iWalkable) { if (!IsInside(iX,iY)) return false; GridPos pos = new GridPos(iX, iY); m_nodePool.SetNode(pos, iWalkable); return true; }
public abstract bool IsWalkableAt(GridPos iPos);
public bool IsInside(GridPos iPos) { return IsInside(iPos.x, iPos.y); }
public abstract bool SetWalkableAt(GridPos iPos, bool iWalkable);
protected bool isInside(GridPos iPos) { return isInside(iPos.x, iPos.y); }
public List<Node> GetNeighbors(Node iNode, bool iCrossCorners, bool iCrossAdjacentPoint) { int tX = iNode.x; int tY = iNode.y; List<Node> neighbors = new List<Node>(); bool tS0 = false, tD0 = false, tS1 = false, tD1 = false, tS2 = false, tD2 = false, tS3 = false, tD3 = false; GridPos pos = new GridPos(); if (this.IsWalkableAt(pos.Set(tX, tY - 1))) { neighbors.Add(GetNodeAt(pos)); tS0 = true; } if (this.IsWalkableAt(pos.Set(tX + 1, tY))) { neighbors.Add(GetNodeAt(pos)); tS1 = true; } if (this.IsWalkableAt(pos.Set(tX, tY + 1))) { neighbors.Add(GetNodeAt(pos)); tS2 = true; } if (this.IsWalkableAt(pos.Set(tX - 1, tY))) { neighbors.Add(GetNodeAt(pos)); tS3 = true; } if (iCrossCorners && iCrossAdjacentPoint) { tD0 = true; tD1 = true; tD2 = true; tD3 = true; } else if (iCrossCorners) { tD0 = tS3 || tS0; tD1 = tS0 || tS1; tD2 = tS1 || tS2; tD3 = tS2 || tS3; } else { tD0 = tS3 && tS0; tD1 = tS0 && tS1; tD2 = tS1 && tS2; tD3 = tS2 && tS3; } if (tD0 && this.IsWalkableAt(pos.Set(tX - 1, tY - 1))) { neighbors.Add(GetNodeAt(pos)); } if (tD1 && this.IsWalkableAt(pos.Set(tX + 1, tY - 1))) { neighbors.Add(GetNodeAt(pos)); } if (tD2 && this.IsWalkableAt(pos.Set(tX + 1, tY + 1))) { neighbors.Add(GetNodeAt(pos)); } if (tD3 && this.IsWalkableAt(pos.Set(tX - 1, tY + 1))) { neighbors.Add(GetNodeAt(pos)); } return neighbors; }
public override bool IsWalkableAt(GridPos iPos) { return IsWalkableAt(iPos.x, iPos.y); }
public static Path generatePath(Vector2 _StartPosition, Vector2 _EndPosition) { try { int var_SizeX = 20;//(int)Math.Abs(_StartPosition.X - _EndPosition.X)/16 + 2;//20; int var_SizeY = 20;//(int)Math.Abs(_StartPosition.Y - _EndPosition.Y)/16 + 2;//20; int var_StartX = (int)((_StartPosition.X % (Region.regionSizeX * Chunk.chunkSizeX * Block.BlockSize)) % (Chunk.chunkSizeX * Block.BlockSize) / Block.BlockSize); int var_StartY = (int)((_StartPosition.Y % (Region.regionSizeY * Chunk.chunkSizeY * Block.BlockSize)) % (Chunk.chunkSizeY * Block.BlockSize) / Block.BlockSize); int var_TargetX = (int)((_EndPosition.X % (Region.regionSizeX * Chunk.chunkSizeX * Block.BlockSize)) % (Chunk.chunkSizeX * Block.BlockSize) / Block.BlockSize); int var_TargetY = (int)((_EndPosition.Y % (Region.regionSizeY * Chunk.chunkSizeY * Block.BlockSize)) % (Chunk.chunkSizeY * Block.BlockSize) / Block.BlockSize); var_TargetX = var_TargetX - var_StartX + var_SizeX/2; var_TargetY = var_TargetY - var_StartY + var_SizeY/2; BaseGrid searchGrid = new DynamicGridWPool(SingletonHolder<NodePool>.Instance); JumpPointParam jumpParam = new JumpPointParam(searchGrid, true, true, false, HeuristicMode.EUCLIDEAN); GridPos startPos = new GridPos(var_SizeX / 2, var_SizeX / 2); GridPos endPos = new GridPos(var_TargetX, var_TargetY); for (int x = 0; x < var_SizeX; x++) { for (int y = 0; y < var_SizeY; y++) { int var_X = (int)_StartPosition.X + (-var_SizeX / 2 + x) * Block.BlockSize; int var_Y = (int)_StartPosition.Y + (-var_SizeX / 2 + y) * Block.BlockSize; Block var_Block = World.world.getBlockAtCoordinate(new Vector3(var_X, var_Y, 0)); bool var_IsWalkAble = false; if (var_Block != null) { if (var_Block.IsWalkAble) { var_IsWalkAble = true; } else if (var_Block.Objects.Count > 0) { if (x == var_SizeX / 2 && y == var_SizeY / 2) { var_IsWalkAble = true; } if (x == var_TargetX && y == var_TargetY) { var_IsWalkAble = true; } } } searchGrid.SetWalkableAt(new GridPos(x, y), var_IsWalkAble); } } jumpParam.CrossCorner = true; jumpParam.CrossAdjacentPoint = false; jumpParam.UseRecursive = false; // KP ;D jumpParam.Reset(startPos, endPos); List<GridPos> resultList = JumpPointFinder.FindPath(jumpParam); LinkedList<PathNode> var_PathNodes = new LinkedList<PathNode>(); foreach (GridPos var_GridPos in resultList) { PathNode var_PathNode = new PathNode(); var_PathNode.X = var_GridPos.x; var_PathNode.Y = var_GridPos.y; int var_X = (int)_StartPosition.X + (-var_SizeX / 2 + var_PathNode.X) * Block.BlockSize; int var_Y = (int)_StartPosition.Y + (-var_SizeX / 2 + var_PathNode.Y) * Block.BlockSize; Block var_Block = World.world.getBlockAtCoordinate(new Vector3(var_X, var_Y, 0)); var_PathNode.block = var_Block; var_PathNodes.AddLast(var_PathNode); } /*for (int y = 0; y < var_SizeY; y++) { for (int x = 0; x < var_SizeY; x++) { Console.ForegroundColor = ConsoleColor.White; if (x == 10 && y == 10) { Console.ForegroundColor = ConsoleColor.Green; } foreach (PathNode var_PathNode in var_PathNodes) { if (var_PathNode.X == x && var_PathNode.Y == y) { Console.ForegroundColor = ConsoleColor.Red; } } if (!searchGrid.IsWalkableAt(x,y)) { Console.Write("x"); } else { Console.Write("-"); } } Console.WriteLine(); }*/ Path var_Result = new Path(var_PathNodes); return var_Result; } catch (Exception ex) { Logger.Logger.LogErr(ex.ToString()); } return null; }
public override bool SetWalkableAt(int iX, int iY, bool iWalkable) { GridPos pos = new GridPos(iX, iY); if (iWalkable) { if (m_nodes.ContainsKey(pos)) { // this.m_nodes[pos].walkable = iWalkable; return true; } else { if (iX < m_gridRect.minX || m_notSet) m_gridRect.minX = iX; if (iX > m_gridRect.maxX || m_notSet) m_gridRect.maxX = iX; if (iY < m_gridRect.minY || m_notSet) m_gridRect.minY = iY; if (iY > m_gridRect.maxY || m_notSet) m_gridRect.maxY = iY; m_nodes.Add(new GridPos(pos.x, pos.y), new Node(pos.x, pos.y, iWalkable)); m_notSet = false; } } else { if (m_nodes.ContainsKey(pos)) { m_nodes.Remove(pos); if (iX == m_gridRect.minX || iX == m_gridRect.maxX || iY == m_gridRect.minY || iY == m_gridRect.maxY) m_notSet = true; } } return true; }
public void Reset(GridPos iStartPos, GridPos iEndPos, BaseGrid iSearchGrid = null) { openList.Clear(); m_startNode = null; m_endNode = null; if (iSearchGrid != null) m_searchGrid = iSearchGrid; m_searchGrid.Reset(); m_startNode = m_searchGrid.GetNodeAt(iStartPos.x, iStartPos.y); m_endNode = m_searchGrid.GetNodeAt(iEndPos.x, iEndPos.y); if (m_startNode == null) m_startNode = new Node(iStartPos.x, iStartPos.y, true); if (m_endNode == null) m_endNode = new Node(iEndPos.x, iEndPos.y, true); }
public override Node GetNodeAt(int iX, int iY) { GridPos pos = new GridPos(iX, iY); return GetNodeAt(pos); }
private static GridPos? jumpLoop(JumpPointParam iParam, int iX, int iY, int iPx, int iPy) { GridPos? retVal = null; Stack<JumpSnapshot> stack = new Stack<JumpSnapshot>(); JumpSnapshot currentSnapshot = new JumpSnapshot(); JumpSnapshot newSnapshot = null; currentSnapshot.iX = iX; currentSnapshot.iY = iY; currentSnapshot.iPx = iPx; currentSnapshot.iPy = iPy; currentSnapshot.stage = 0; stack.Push(currentSnapshot); while (stack.Count != 0) { currentSnapshot = stack.Pop(); switch (currentSnapshot.stage) { case 0: if (!iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY)) { retVal = null; continue; } else if (iParam.SearchGrid.GetNodeAt(currentSnapshot.iX, currentSnapshot.iY).Equals(iParam.EndNode)) { retVal = new GridPos(currentSnapshot.iX, currentSnapshot.iY); continue; } currentSnapshot.tDx = currentSnapshot.iX - currentSnapshot.iPx; currentSnapshot.tDy = currentSnapshot.iY - currentSnapshot.iPy; currentSnapshot.jx = null; currentSnapshot.jy = null; if (iParam.CrossCorner) { // check for forced neighbors // along the diagonal if (currentSnapshot.tDx != 0 && currentSnapshot.tDy != 0) { if ((iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX - currentSnapshot.tDx, currentSnapshot.iY + currentSnapshot.tDy) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX - currentSnapshot.tDx, currentSnapshot.iY)) || (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY - currentSnapshot.tDy) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY - currentSnapshot.tDy))) { retVal= new GridPos(currentSnapshot.iX, currentSnapshot.iY); continue; } } // horizontally/vertically else { if (currentSnapshot.tDx != 0) { // moving along x if ((iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY + 1) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY + 1)) || (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY - 1) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY - 1))) { retVal= new GridPos(currentSnapshot.iX, currentSnapshot.iY); continue; } } else { if ((iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + 1, currentSnapshot.iY + currentSnapshot.tDy) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + 1, currentSnapshot.iY)) || (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX - 1, currentSnapshot.iY + currentSnapshot.tDy) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX - 1, currentSnapshot.iY))) { retVal= new GridPos(currentSnapshot.iX, currentSnapshot.iY); continue; } } } // when moving diagonally, must check for vertical/horizontal jump points if (currentSnapshot.tDx != 0 && currentSnapshot.tDy != 0) { currentSnapshot.stage = 1; stack.Push(currentSnapshot); newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX + currentSnapshot.tDx; newSnapshot.iY = currentSnapshot.iY; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); continue; } // moving diagonally, must make sure one of the vertical/horizontal // neighbors is open to allow the path // moving diagonally, must make sure one of the vertical/horizontal // neighbors is open to allow the path if (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY) || iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY + currentSnapshot.tDy)) { newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX + currentSnapshot.tDx; newSnapshot.iY = currentSnapshot.iY + currentSnapshot.tDy; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); continue; } else if (iParam.CrossAdjacentPoint) { newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX + currentSnapshot.tDx; newSnapshot.iY = currentSnapshot.iY + currentSnapshot.tDy; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); continue; } } else //if (!iParam.CrossCorner) { // check for forced neighbors // along the diagonal if (currentSnapshot.tDx != 0 && currentSnapshot.tDy != 0) { if ((iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY + currentSnapshot.tDy) && iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY + currentSnapshot.tDy) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY)) || (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY + currentSnapshot.tDy) && iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY + currentSnapshot.tDy))) { retVal = new GridPos(currentSnapshot.iX, currentSnapshot.iY); continue; } } // horizontally/vertically else { if (currentSnapshot.tDx != 0) { // moving along x if ((iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY + 1) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX - currentSnapshot.tDx, currentSnapshot.iY + 1)) || (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY - 1) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX - currentSnapshot.tDx, currentSnapshot.iY - 1))) { retVal= new GridPos(currentSnapshot.iX, currentSnapshot.iY); continue; } } else { if ((iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + 1, currentSnapshot.iY) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + 1, currentSnapshot.iY - currentSnapshot.tDy)) || (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX - 1, currentSnapshot.iY) && !iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX - 1, currentSnapshot.iY - currentSnapshot.tDy))) { retVal= new GridPos(currentSnapshot.iX, currentSnapshot.iY); continue; } } } // when moving diagonally, must check for vertical/horizontal jump points if (currentSnapshot.tDx != 0 && currentSnapshot.tDy != 0) { currentSnapshot.stage = 3; stack.Push(currentSnapshot); newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX + currentSnapshot.tDx; newSnapshot.iY = currentSnapshot.iY; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); continue; } // moving diagonally, must make sure both of the vertical/horizontal // neighbors is open to allow the path if (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY) && iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY + currentSnapshot.tDy)) { newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX + currentSnapshot.tDx; newSnapshot.iY = currentSnapshot.iY + currentSnapshot.tDy; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); continue; } } retVal = null; break; case 1: currentSnapshot.jx = retVal; currentSnapshot.stage = 2; stack.Push(currentSnapshot); newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX; newSnapshot.iY = currentSnapshot.iY + currentSnapshot.tDy; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); break; case 2: currentSnapshot.jy = retVal; if (currentSnapshot.jx != null || currentSnapshot.jy != null) { retVal = new GridPos(currentSnapshot.iX, currentSnapshot.iY); continue; } // moving diagonally, must make sure one of the vertical/horizontal // neighbors is open to allow the path if (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY) || iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY + currentSnapshot.tDy)) { newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX + currentSnapshot.tDx; newSnapshot.iY = currentSnapshot.iY + currentSnapshot.tDy; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); continue; } else if (iParam.CrossAdjacentPoint) { newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX + currentSnapshot.tDx; newSnapshot.iY = currentSnapshot.iY + currentSnapshot.tDy; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); continue; } retVal = null; break; case 3: currentSnapshot.jx = retVal; currentSnapshot.stage = 4; stack.Push(currentSnapshot); newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX; newSnapshot.iY = currentSnapshot.iY + currentSnapshot.tDy; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); break; case 4: currentSnapshot.jy = retVal; if (currentSnapshot.jx != null || currentSnapshot.jy != null) { retVal = new GridPos(currentSnapshot.iX, currentSnapshot.iY); continue; } // moving diagonally, must make sure both of the vertical/horizontal // neighbors is open to allow the path if (iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX + currentSnapshot.tDx, currentSnapshot.iY) && iParam.SearchGrid.IsWalkableAt(currentSnapshot.iX, currentSnapshot.iY + currentSnapshot.tDy)) { newSnapshot = new JumpSnapshot(); newSnapshot.iX = currentSnapshot.iX + currentSnapshot.tDx; newSnapshot.iY = currentSnapshot.iY + currentSnapshot.tDy; newSnapshot.iPx = currentSnapshot.iX; newSnapshot.iPy = currentSnapshot.iY; newSnapshot.stage = 0; stack.Push(newSnapshot); continue; } retVal = null; break; } } return retVal; }
public override bool IsWalkableAt(int iX, int iY) { GridPos pos = new GridPos(iX, iY); return IsWalkableAt(pos); }
public Node GetNode(int iX, int iY) { GridPos pos = new GridPos(iX, iY); return GetNode(pos); }