// void FindPath() { if (null == m_target || !CanControl) { return; } AStarMapCell start = m_astarMap.GetCell(m_data.Row, m_data.Column); AStarMapCell end = m_astarMap.GetCell(m_target.Row, m_target.Column); List <AStarMapCell> list = AStar.CalculatePath(start, end, m_astarMap); if (list.Count > 0) { m_data.Move(list[0].Column - m_data.Column, list[0].Row - m_data.Row); AudioManager.Instance.PlayAudio("dog", true); } else { if (m_data.IsLookLeft) { m_data.Move(-1, 0); } else { m_data.Move(1, 0); } StartCoroutine(RetryFindPath(1)); } }
public bool SetCell(int row, int column, AStarMapCell mc) { if (row > this.row || column > this.column) { return(false); } cells [row * this.column + column] = mc; return(true); }
public bool CanArrive(AStarMapCell target) { int x = target.Column - Column + 1; int y = target.Row - Row + 1; if (x >= 0 && x < 3 && y >= 0 && y < 3) { return(m_passArray [x, y]); } else { return(false); } }
private static List <AStarMapCell> BacktrackPath(AStarMapCell end) { if (end == null) { return(new List <AStarMapCell> ()); } List <AStarMapCell> list = new List <AStarMapCell> (); AStarMapCell mc = end; while (mc.GetParent() != null) { list.Insert(0, mc); mc = mc.GetParent(); } return(list); }
public AStarMapCell ToMapCell() { AStarMapCell mc = new AStarMapCell(); mc.IsToLeft = IsToLeft; mc.IsToRight = IsToRight; mc.IsToUp = IsToUp; mc.IsToDown = IsToDown; mc.IsToLeftUp = IsToLeftUp; mc.IsToLeftDown = IsToLeftDown; mc.IsToRightUp = IsToRightUp; mc.IsToRightDown = IsToRightDown; mc.Row = Row; mc.Column = Column; return(mc); }
public AStarMap(int row, int column) { this.row = row; this.column = column; cells = new List <AStarMapCell>(); for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { AStarMapCell cell = new AStarMapCell(); cell.Row = i; cell.Column = j; cells.Add(cell); } } }
private static void ResetMap() { for (int i = 0; i < m_map.Row; i++) { for (int j = 0; j < m_map.Column; j++) { AStarMapCell mc = m_map.GetCell(i, j); if (mc != null) { mc.IsInOpenList = false; mc.IsInCloseList = false; mc.SetParent(null); mc.H = 0; mc.G = 0; } } } }
public int CalculateNeighborDist(AStarMapCell neighbor) { int disY = Mathf.Abs(neighbor.Row - Row); int disX = Mathf.Abs(neighbor.Column - Column); if (disX > 1 || disY > 1 || (disX == 0 && disY == 0)) { return(0); } if (disX == 1 && disY == 1) { return(14); } else { return(10); } }
public AStarMap(int row, int column, Vector2 cellSize, Vector2 startPos) { this.row = row; this.column = column; cells = new List <AStarMapCell>(); for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { AStarMapCell cell = new AStarMapCell(); cell.Row = i; cell.Column = j; cells.Add(cell); } } this.cellSize = cellSize; this.startPos = startPos; }
public void FromMapCell(AStarMapCell mc) { IsToLeft = mc.IsToLeft; IsToRight = mc.IsToRight; IsToUp = mc.IsToUp; IsToDown = mc.IsToDown; IsToLeftUp = mc.IsToLeftUp; IsToLeftDown = mc.IsToLeftDown; IsToRightUp = mc.IsToRightUp; IsToRightDown = mc.IsToRightDown; Row = mc.Row; Column = mc.Column; ShowLeft(); ShowLeftDown(); ShowLeftUp(); ShowRight(); ShowRightDown(); ShowRightUp(); ShowUp(); ShowDown(); }
static void SetAStarMapCell_First(MapData map, MapCellData cell, ref AStarMap astarMap) { AStarMapCell astarMapCell = astarMap.GetCell(cell.row, cell.col); astarMapCell.IsToLeftUp = false; astarMapCell.IsToLeftDown = false; astarMapCell.IsToRightUp = false; astarMapCell.IsToRightDown = false; //check up if (cell.row + 1 < map.row) { MapCellData upCell = map.cells [(cell.row + 1) * map.column + cell.col]; AStarMapCell upAStarCell = astarMap.GetCell(cell.row + 1, cell.col); switch ((CELL_TYPE)cell.cellType) { case CELL_TYPE.WALL: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.STONE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.LADDER: switch ((CELL_TYPE)upCell.cellType) { case CELL_TYPE.WALL: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.STONE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.LADDER: upAStarCell.IsToDown = true; astarMapCell.IsToUp = true; break; case CELL_TYPE.POLE: upAStarCell.IsToDown = true; astarMapCell.IsToUp = true; break; case CELL_TYPE.NONE: upAStarCell.IsToDown = true; astarMapCell.IsToUp = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: upAStarCell.IsToDown = true; astarMapCell.IsToUp = true; break; } break; case CELL_TYPE.POLE: switch ((CELL_TYPE)upCell.cellType) { case CELL_TYPE.WALL: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.STONE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.LADDER: upAStarCell.IsToDown = true; astarMapCell.IsToUp = true; break; case CELL_TYPE.POLE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.NONE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; } break; case CELL_TYPE.NONE: switch ((CELL_TYPE)upCell.cellType) { case CELL_TYPE.WALL: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.STONE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.LADDER: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; case CELL_TYPE.POLE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; case CELL_TYPE.NONE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; } break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: switch ((CELL_TYPE)upCell.cellType) { case CELL_TYPE.WALL: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.STONE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = false; break; case CELL_TYPE.LADDER: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; case CELL_TYPE.POLE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; case CELL_TYPE.NONE: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: upAStarCell.IsToDown = false; astarMapCell.IsToUp = true; break; } break; } } //down if (cell.row - 1 >= 0) { MapCellData downCell = map.cells [(cell.row - 1) * map.column + cell.col]; AStarMapCell downAStarCell = astarMap.GetCell(cell.row - 1, cell.col); switch ((CELL_TYPE)cell.cellType) { case CELL_TYPE.WALL: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.STONE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.LADDER: switch ((CELL_TYPE)downCell.cellType) { case CELL_TYPE.WALL: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.STONE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.LADDER: astarMapCell.IsToDown = true; downAStarCell.IsToUp = true; break; case CELL_TYPE.POLE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; case CELL_TYPE.NONE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; } break; case CELL_TYPE.POLE: switch ((CELL_TYPE)downCell.cellType) { case CELL_TYPE.WALL: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.STONE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.LADDER: astarMapCell.IsToDown = true; downAStarCell.IsToUp = true; break; case CELL_TYPE.POLE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; case CELL_TYPE.NONE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; } break; case CELL_TYPE.NONE: switch ((CELL_TYPE)downCell.cellType) { case CELL_TYPE.WALL: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.STONE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.LADDER: astarMapCell.IsToDown = true; downAStarCell.IsToUp = true; break; case CELL_TYPE.POLE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; case CELL_TYPE.NONE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; } break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: switch ((CELL_TYPE)downCell.cellType) { case CELL_TYPE.WALL: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.STONE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = false; break; case CELL_TYPE.LADDER: astarMapCell.IsToDown = true; downAStarCell.IsToUp = true; break; case CELL_TYPE.POLE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; case CELL_TYPE.NONE: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: astarMapCell.IsToDown = false; downAStarCell.IsToUp = true; break; } break; } } //check left if (cell.col - 1 >= 0) { MapCellData leftCell = map.cells [(cell.row) * map.column + cell.col - 1]; AStarMapCell leftAStarCell = astarMap.GetCell(cell.row, cell.col - 1); switch ((CELL_TYPE)cell.cellType) { case CELL_TYPE.WALL: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; case CELL_TYPE.STONE: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; case CELL_TYPE.LADDER: switch ((CELL_TYPE)leftCell.cellType) { case CELL_TYPE.WALL: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; case CELL_TYPE.STONE: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; case CELL_TYPE.LADDER: leftAStarCell.IsToRight = true; astarMapCell.IsToLeft = true; break; case CELL_TYPE.POLE: leftAStarCell.IsToRight = true; astarMapCell.IsToLeft = true; break; case CELL_TYPE.NONE: leftAStarCell.IsToRight = true; astarMapCell.IsToLeft = false; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: leftAStarCell.IsToRight = true; astarMapCell.IsToLeft = false; break; } break; case CELL_TYPE.POLE: switch ((CELL_TYPE)leftCell.cellType) { case CELL_TYPE.WALL: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; case CELL_TYPE.STONE: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; case CELL_TYPE.LADDER: leftAStarCell.IsToRight = true; astarMapCell.IsToLeft = true; break; case CELL_TYPE.POLE: leftAStarCell.IsToRight = true; astarMapCell.IsToLeft = true; break; case CELL_TYPE.NONE: leftAStarCell.IsToRight = true; astarMapCell.IsToLeft = false; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: leftAStarCell.IsToRight = true; astarMapCell.IsToLeft = false; break; } break; default: //case CELL_TYPE.NONE || CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: switch ((CELL_TYPE)leftCell.cellType) { case CELL_TYPE.WALL: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; case CELL_TYPE.STONE: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; case CELL_TYPE.LADDER: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = true; break; case CELL_TYPE.POLE: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = true; break; case CELL_TYPE.NONE: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: leftAStarCell.IsToRight = false; astarMapCell.IsToLeft = false; break; } break; } } //check right if (cell.col + 1 < map.column) { MapCellData rightCell = map.cells [(cell.row) * map.column + cell.col + 1]; AStarMapCell rightAStarCell = astarMap.GetCell(cell.row, cell.col + 1); switch ((CELL_TYPE)cell.cellType) { case CELL_TYPE.WALL: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.STONE: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.LADDER: switch ((CELL_TYPE)rightCell.cellType) { case CELL_TYPE.WALL: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.STONE: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.LADDER: astarMapCell.IsToRight = true; rightAStarCell.IsToLeft = true; break; case CELL_TYPE.POLE: astarMapCell.IsToRight = true; rightAStarCell.IsToLeft = true; break; case CELL_TYPE.NONE: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = true; break; } break; case CELL_TYPE.POLE: switch ((CELL_TYPE)rightCell.cellType) { case CELL_TYPE.WALL: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.STONE: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.LADDER: astarMapCell.IsToRight = true; rightAStarCell.IsToLeft = true; break; case CELL_TYPE.POLE: astarMapCell.IsToRight = true; rightAStarCell.IsToLeft = true; break; case CELL_TYPE.NONE: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = true; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = true; break; } break; default: //case CELL_TYPE.NONE || CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: switch ((CELL_TYPE)rightCell.cellType) { case CELL_TYPE.WALL: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.STONE: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.LADDER: astarMapCell.IsToRight = true; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.POLE: astarMapCell.IsToRight = true; rightAStarCell.IsToLeft = false; break; case CELL_TYPE.NONE: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; default: //case CELL_TYPE.BRA || CELL_TYPE.UNDERPANT || CELL_TYPE.SOCKS: astarMapCell.IsToRight = false; rightAStarCell.IsToLeft = false; break; } break; } } }
public static List <AStarMapCell> CalculatePath(AStarMapCell start, AStarMapCell end, AStarMap map) { m_openList.Clear(); m_closeList.Clear(); m_map = map; ResetMap(); start.G = 0; start.CalculateH(end); m_openList.Add(start); start.IsInOpenList = true; while (true) { int nearestIndex = FindNearestCellInOpenList(); AStarMapCell cur; if (nearestIndex >= 0) { cur = m_openList [nearestIndex]; if (cur.Equals(end)) { return(BacktrackPath(cur)); } } else { return(new List <AStarMapCell> ()); } for (int i = cur.Row - 1; i <= cur.Row + 1; i++) { for (int j = cur.Column - 1; j <= cur.Column + 1; j++) { if (i >= 0 && i < m_map.Row && j >= 0 && j < m_map.Column) { AStarMapCell mc = m_map.GetCell(i, j); if (mc != null && !mc.IsInCloseList && mc.CanArrive(cur)) { if (mc.IsInOpenList) { int dist = cur.CalculateNeighborDist(mc); if (cur.G + dist < mc.G) { mc.G = cur.G + dist; mc.SetParent(cur); } } else { mc.SetParent(cur); mc.CalculateH(end); mc.CalculateG(cur); mc.IsInOpenList = true; m_openList.Add(mc); } } } } } m_openList.RemoveAt(nearestIndex); cur.IsInOpenList = false; m_closeList.Add(cur); cur.IsInCloseList = true; } return(new List <AStarMapCell> ()); }
public void CalculateG(AStarMapCell neighbor) { G = neighbor.G + CalculateNeighborDist(neighbor); }
public void CalculateH(AStarMapCell end) { int dis = Mathf.Abs(end.Row - Row) + Mathf.Abs(end.Column - Column); H = dis * 10; }
public void SetParent(AStarMapCell mc) { m_parent = mc; }