Beispiel #1
0
    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);
                            }
                        }
                    }
                }
            }
        }
    }