public void Process()
 {
     if (graph == null)
     {
         graph = new TileGraph(world);
     }
     else if (graph.IsReady == false)
     {
         graph.ProcessTiles();
     }
     else
     {
         foreach (AStar path in newPaths.Values)
         {
             // Sprawdzamy, czy wszystkie ścieżki są obliczone
             if (path.IsInitialized && path.IsReady == false)
             {
                 path.Process();
                 return;
             }
             else
             {
                 continue;
             }
         }
     }
 }
        public void InvalidateGraph(List <Tile> modifiedTiles)
        {
            if (graph == null)
            {
                graph = new TileGraph(world);
            }
            else
            {
                graph.Reset();
            }

            foreach (Character character in newPaths.Keys)
            {
                bool recalculate = false;

                // Optymalizacja: nie każe liczyć nowej ścieżki,
                // jeśli zmiana dotyczy bliskiego pola i nie blokuje poprzedniej ścieżki
                for (int i = 0; i < modifiedTiles.Count; i++)
                {
                    Tile t = modifiedTiles[i];

                    if (Math.Abs(character.CurrentTile.X - t.X) <= 4 &&
                        Math.Abs(character.CurrentTile.Y - t.Y) <= 4 &&
                        newPaths[character].Contains(t) == false)
                    {
                        continue;
                    }
                    else
                    {
                        recalculate = true;
                        break;
                    }
                }
                if (recalculate)
                {
                    character.PathNeedsReplacement = true;
                }
            }

            newPaths.Clear();
        }
Beispiel #3
0
        public void NewPath(TileGraph tileGraph, Tile start, Tile goal)
        {
            if (IsInitialized == true)
            {
                Reset();
            }

            Start = start;
            Goal  = goal;

            Dictionary <Tile, Node> tileNodeMap = tileGraph.GetCompleteGraph();

            if (tileNodeMap == null)
            {
                //UnityEngine.Debug.LogError("Pathfinding bez istniejącego grafu!");
                return;
            }

            startNode = tileNodeMap[start];
            goalNode  = tileNodeMap[goal];

            if (startNode == null || goalNode == null)
            {
                //UnityEngine.Debug.LogError("Zażądano ścieżki pomiędzy nieistniejącymi polami!");
                return;
            }

            // Najpierw sprawdzamy pole startowe
            openSet.Enqueue(startNode, 0);

            // Pole startowe (i pola już sprawdzone) mają g_score równe zeru
            g_score[startNode] = 0;

            // Szacowanie odległości, tj. po prostu obliczanie dystansu w linii prostej
            f_score[startNode] = HeuristicCostEstimate(startNode, goalNode);

            IsInitialized = true;
        }