Ejemplo n.º 1
0
    /// <summary>
    /// Adds obstacle from tile where mouse clicked
    /// </summary>
    private void AddObstacle()
    {
        Vector2 tile = MousePositionToTile();

        // If tile occupied by obstacle already
        if (_tileHandler.IsTileOccupied(tile))
        {
            return;
        }

        // If space is occupied by player og goal
        if ((_tileHandler.ClosestTile(Player.transform.position) == tile) || (_tileHandler.ClosestTile(Goal.transform.position) == tile))
        {
            return;
        }

        _tileHandler.AddTile(tile, CreateObstacle(tile));
    }
Ejemplo n.º 2
0
    /// <summary>
    /// Calcuates path from player to goal
    /// Returns the path as an array of Nodes
    /// </summary>
    /// <returns>Node[]</returns>
    private void CalculatePath()
    {
        _threadRunning = true;

        _outerNodes = new ArrayList();
        _innerNodes = new ArrayList();

        int     currentNodeIndex;
        Vector2 goalTile = _tileHandler.ClosestTile(_goalPos);

        // Add the starting node
        Vector2 playerTile = _tileHandler.ClosestTile(_playerPos);
        Node    playerNode = new Node(playerTile, null, 0, CalculateEuclidian(playerTile));

        _outerNodes.Add(playerNode);
        bool _pathFound = false;

        while (_outerNodes.Count > 0)
        {
            if (_killThread)
            {
                _playerMove.MovePath   = null;
                _playerMove.ShouldMove = false;
                _killThread            = false;
                return;
            }

            Thread.Sleep(PathFindingDelay);

            currentNodeIndex = FindBestScoringNode(_outerNodes);
            _innerNodes.Add(_outerNodes[currentNodeIndex]);
            _outerNodes.RemoveAt(currentNodeIndex);

            Node currentNode = _innerNodes[_innerNodes.Count - 1] as Node;

            if (currentNode.Tile == goalTile)
            {
                _pathFound = true;
                break;
            }

            Node[] currentNodeNeighbours = FetchNeighbours(currentNode);
            foreach (Node neighbour in currentNodeNeighbours)
            {
                if (!IsAlreadyOuterNode(neighbour))
                {
                    _outerNodes.Add(neighbour); continue;
                }

                Node  outerNode = FetchOuterNodeAtTile(neighbour.Tile);
                float newCost   = currentNode.MoveCost + CalculateEuclidian(currentNode.Tile, outerNode.Tile);
                if (outerNode.MoveCost <= (newCost))
                {
                    continue;
                }

                outerNode.Parent   = currentNode;
                outerNode.MoveCost = newCost;
            }
        }

        if (_pathFound)
        {
            _playerMove.MovePath   = TraverseToFindPath();
            _playerMove.ShouldMove = true;
        }
        _threadRunning = false;
    }