public void DumpRecursive() { Dump(); if (_parent != null) { // 再帰的にダンプする. _parent.DumpRecursive(); } }
public List <Point2> GetShortestPath(Vector2 start, Vector2 goal, int[,] map, bool allowdiag = false) { List <Point2> ret = new List <Point2>(); Layer2D layer = new Layer2D(); layer.Create(Constant.MAPSIZE, Constant.MAPSIZE); // TODO: 配列メソッドで取得する方法 for (int i = 0; i < Constant.MAPSIZE; i++) { for (int j = 0; j < Constant.MAPSIZE; j++) { layer.Set(j, i, map[i, j]); } } var mgr = new ANodeMgr(layer, (int)goal.x, (int)goal.y, allowdiag); ANode node = mgr.OpenNode((int)start.x, (int)start.y, 0, null); if (node == null) { Debug.Log("node is null start" + start); } int cnt = 0; while (cnt < 1000) { mgr.RemoveOpenList(node); // 周囲を開く mgr.OpenAround(node); // 最小スコアのノードを探す. node = mgr.SearchMinScoreNodeFromOpenList(); if (node == null) { // 袋小路なのでおしまい. // Debug.Log("Not found path."); break; } if (node.X == (int)goal.x && node.Y == (int)goal.y) { // ゴールにたどり着いた. // Debug.Log("Success."); mgr.RemoveOpenList(node); node.DumpRecursive(); // パスを取得する node.GetPath(ret); // 反転する ret.Reverse(); break; } } return(ret); }
IEnumerator Start() { // 地形データのロード. var tmx = new TMXLoader(); tmx.Load("Levels/001"); var layer = tmx.GetLayer(0); //layer.Dump(); // タイルの配置. for (int j = 0; j < layer.Height; j++) { for (int i = 0; i < layer.Width; i++) { var v = layer.Get(i, j); var x = GetChipX(i); var y = GetChipY(j); Tile.Add(v, x, y); } } yield return(new WaitForSeconds(0.1f)); var pList = new List <Point2>(); Token player = null; // A-star実行. { // スタート地点. Point2 pStart = GetRandomPosition(layer); player = Util.CreateToken(GetChipX(pStart.x), GetChipY(pStart.y), "", "miku2", "Player"); player.SortingLayer = "Chara"; // ゴール. Point2 pGoal = GetRandomPosition(layer); var goal = Util.CreateToken(GetChipX(pGoal.x), GetChipY(pGoal.y), "", "gate1", "Goal"); goal.SortingLayer = "Chara"; // 斜め移動を許可 var allowdiag = true; var mgr = new ANodeMgr(layer, pGoal.x, pGoal.y, allowdiag); // スタート地点のノード取得 // スタート地点なのでコストは「0」 ANode node = mgr.OpenNode(pStart.x, pStart.y, 0, null); mgr.AddOpenList(node); // 試行回数。1000回超えたら強制中断 int cnt = 0; while (cnt < 1000) { mgr.RemoveOpenList(node); // 周囲を開く mgr.OpenAround(node); // 最小スコアのノードを探す. node = mgr.SearchMinScoreNodeFromOpenList(); if (node == null) { // 袋小路なのでおしまい. Debug.Log("Not found path."); break; } if (node.X == pGoal.x && node.Y == pGoal.y) { // ゴールにたどり着いた. Debug.Log("Success."); mgr.RemoveOpenList(node); node.DumpRecursive(); // パスを取得する node.GetPath(pList); // 反転する pList.Reverse(); break; } yield return(new WaitForSeconds(0.01f)); } } _state = eState.Walk; // プレイヤーを移動させる. foreach (var p in pList) { var x = GetChipX(p.x); var y = GetChipY(p.y); player.X = x; player.Y = y; yield return(new WaitForSeconds(0.2f)); } // おしまい _state = eState.End; }