protected void UpdatePathfinding() { // 길찾기 알고리즘이 시작 if (0 != _pathfindingQueue.Count) { sPathCommand command = _pathfindingQueue[0]; _pathfindingQueue.RemoveAt(0); if (false == command.tileCell.IsPathfided()) { command.tileCell.Pathfinded(); // 목표에 도달 했나? if (command.tileCell.GetTileX() == _goalTileCell.GetTileX() && command.tileCell.GetTileY() == _goalTileCell.GetTileY()) { _reverseTileCell = command.tileCell; _updateState = eUpdateState.BUILD_PATH; return; } for (int direction = (int)eMoveDirection.LEFT; direction < (int)eMoveDirection.DOWN + 1; direction++) { sPosition curPosition; curPosition.x = command.tileCell.GetTileX(); curPosition.y = command.tileCell.GetTileY(); sPosition nextPosition = GetPositionByDirection(curPosition, (eMoveDirection)direction); TileCell searchTileCell = GameManager.Instance.GetMap().GetTileCell(nextPosition.x, nextPosition.y); if (null != searchTileCell && searchTileCell.IsPathfindable() && false == searchTileCell.IsPathfided()) { float distance = command.tileCell.GetDistanceFromStart() + searchTileCell.GetDistanceWeight(); if (null == searchTileCell.GetPrevPathfindingCell()) { searchTileCell.SetDistanceFromStart(distance); searchTileCell.SetPrevPathfindingCell(command.tileCell); searchTileCell.SetPathfindingTestMark(); sPathCommand newCommand; newCommand.tileCell = searchTileCell; /* * newCommand.heuristic = CalcSimpleHeuristic( * command.tileCell, * searchTileCell, * _goalTileCell); */ newCommand.heuristic = CalcAStarHeuristic(distance, searchTileCell, _goalTileCell); PushCommand(newCommand); } else { if (distance < searchTileCell.GetDistanceFromStart()) { searchTileCell.SetDistanceFromStart(distance); searchTileCell.SetPrevPathfindingCell(command.tileCell); sPathCommand newCommand; newCommand.tileCell = searchTileCell; /* * newCommand.heuristic = CalcSimpleHeuristic( * command.tileCell, * searchTileCell, * _goalTileCell); */ newCommand.heuristic = CalcAStarHeuristic(distance, searchTileCell, _goalTileCell); PushCommand(newCommand); } } } } } } }