/// <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)); }
/// <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; }