Ejemplo n.º 1
0
 public void DumpRecursive()
 {
     Dump();
     if (_parent != null)
     {
         // 再帰的にダンプする.
         _parent.DumpRecursive();
     }
 }
Ejemplo n.º 2
0
    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);
    }
Ejemplo n.º 3
0
    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;
    }