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