bool CheckPrecondition(eFindMode mode, TileCell nextTileCell, TileCell targetTileCell) { //if ((null != nextTileCell) && (true == nextTileCell.IsPathfindable() && false == nextTileCell.IsVisit() || // (nextTileCell.GetTileX() == _targetTileCell.GetTileX() && nextTileCell.GetTileY() == _targetTileCell.GetTileY()))) // return true; bool condition = false; if (false == nextTileCell.IsVisit()) { condition = true; } if (eFindMode.VIEW_MOVERANGE == mode || eFindMode.FIND_PATH == mode) { if (condition) { condition = nextTileCell.CanMove(); } } if (eMapType.DUNGEON == GameManager.Instance.GetMapType()) { return(condition); } else if (eMapType.TOWN == GameManager.Instance.GetMapType()) { //해당 타일이 목표 타일 if (nextTileCell.GetTileX() == targetTileCell.GetTileX() && nextTileCell.GetTileY() == targetTileCell.GetTileY()) { condition = true; } } return(condition); }
public override void Start() { base.Start(); _character.ResetTargetTileCell(); int range = GetViewRange(); eFindMode mode = GetFindMode(); _rangeViewer.Init(_character); _rangeViewer.SetRange(range); _rangeViewer.FindPath(mode, eFindMethod.DISTANCE); }
public void FindPath(eFindMode mode, eFindMethod method) { bool isViewRange = (eFindMode.VIEW_MOVERANGE == mode || eFindMode.VIEW_ATTACKRANGE == mode); while (0 != _pathfindingQueue.Count) { sPathCommand command = _pathfindingQueue[0]; _pathfindingQueue.RemoveAt(0); if (false == command.tileCell.IsVisit()) { command.tileCell.Visit(); //FIND TARGET if (eFindMode.FIND_PATH == mode) { if ((_targetTileCell.GetTileX() == command.tileCell.GetTileX()) && (_targetTileCell.GetTileY() == command.tileCell.GetTileY())) { _reverseTileCell = _targetTileCell; return; } } for (eMoveDirection direction = 0; direction <= eMoveDirection.DOWN; direction++) { sPosition curPosition; curPosition.x = command.tileCell.GetTileX(); curPosition.y = command.tileCell.GetTileY(); sPosition nextPosition = GlobalUtility.GetPositionByDirection(curPosition, direction); TileMap map = GameManager.Instance.GetMap(); TileCell nextTileCell = map.GetTileCell(nextPosition.x, nextPosition.y); if (CheckPrecondition(mode, nextTileCell, _targetTileCell)) { float distanceFromStart = command.tileCell.GetDistanceFromStart() + command.tileCell.GetDistanceWeight(); float heuristic = CalcHeuristic(method, distanceFromStart, command.tileCell, nextTileCell, _targetTileCell); if (isViewRange && (_range < distanceFromStart)) { return; } if (null == nextTileCell.GetPrevTileCell()) { nextTileCell.SetDistanceFromStart(distanceFromStart); nextTileCell.SetPrevTileCell(command.tileCell); sPathCommand newCommand; newCommand.tileCell = nextTileCell; newCommand.heuristic = heuristic; PushCommand(newCommand); //검색범위를 그려준다. if (isViewRange) { DrawSearchTile(nextTileCell); } } } } } } }