示例#1
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);
    }
示例#2
0
文件: AStar.cs 项目: YkumanekoY/GLEAM
    List <Point2> CalcPath(Point2 pStart, Point2 pGoal, int[,] map, bool allowdiag)
    {
        var pList = new List <Point2> ();
        var mgr   = new ANodeMgr(pGoal.x, pGoal.y, allowdiag);

        // スタート地点のノード取得
        // スタート地点なのでコストは「0」
        ANode node = mgr.OpenNode(pStart.x, pStart.y, 0, null, map);

        mgr.AddOpenList(node);

        // 試行回数。1000回超えたら強制中断
        int cnt = 0;

        while (cnt < 1000)
        {
            mgr.RemoveOpenList(node);
            // 周囲を開く
            mgr.OpenAround(node, map);
            // 最小スコアのノードを探す.
            node = mgr.SearchMinScoreNodeFromOpenList();
            if (node == null)
            {
                // 袋小路なのでおしまい.
                Debug.Log("Not found path.");
                Destroy(this);
                break;
            }

            if (node.X == pGoal.x && node.Y == pGoal.y)
            {
                // ゴールにたどり着いた.
                Debug.Log("Success.");
                mgr.RemoveOpenList(node);
                // パスを取得する
                node.GetPath(pList);
                // 反転する
                pList.Reverse();
                break;
            }
        }

        return(pList);
    }
示例#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;
    }
示例#4
0
    //A-Sterによる経路取得(コルーチン)
    IEnumerator getRouteCo(Vector2Int startPos, Vector2Int goalPos, TileObj[,] tileMap, int unitType, Action <List <Vector2Int>, int> callback, List <Vector2Int> Olist, List <Vector2Int> Alist)
    {
        List <Vector2Int> moveList = new List <Vector2Int>();

        //新規ノード管理
        var mgr = new ANodeMgr(goalPos, tileMap, Olist, Alist, unitType);

        //スタートorゴールが通行不可
        //if (!mgr.CheckNodeAllow(startPos)) {
        //	Debug.Log ("no allow. from("+ startPos +") to("+ goalPos);
        //	if (callback != null) callback(moveList, -1);
        //	yield break;
        //}

        // スタート地点のノード取得
        // スタート地点なのでコストは「0」
        ANode node = mgr.OpenNode(startPos, 0, null);

        mgr.AddOpenList(node);

        // 試行回数。100回超えたら強制中断
        int cnt = 0;

        while (cnt < 100)
        {
            mgr.RemoveOpenList(node);
            // 周囲を開く
            mgr.OpenAround(node);
            // 最小スコアのノードを探す.
            node = mgr.SearchMinScoreNodeFromOpenList();
            if (node == null)
            {
                // 袋小路なのでおしまい.
                node = mgr.SearchMinScoreNodeFromCloseList(goalPos);
                Debug.LogWarning(string.Format("[Not found path.] Min: ({0},{1})", node.X, node.Y));
                //node.DumpRecursive();
                // パスを取得する
                node.GetPath(moveList);
                // 反転する
                moveList.Reverse();
                break;
            }
            if (node.X == goalPos.x && node.Y == goalPos.y)
            {
                // ゴールにたどり着いた.
                //Debug.Log ("Success.");
                mgr.RemoveOpenList(node);
                //node.DumpRecursive();
                // パスを取得する
                node.GetPath(moveList);
                // 反転する
                moveList.Reverse();
                break;
            }
            cnt++;
            yield return(null);           //new WaitForSeconds(0.01f);
        }
        if (cnt == 100)
        {
            // 袋小路なのでおしまい.
            node = mgr.SearchMinScoreNodeFromCloseList(goalPos);
            Debug.LogWarning(string.Format("[Over] Min: ({0},{1})", node.X, node.Y));
            //node.DumpRecursive();
            // パスを取得する
            node.GetPath(moveList);
            // 反転する
            moveList.Reverse();
        }


        if (callback != null)
        {
            callback(moveList, node.CalcHeuristic(false, goalPos));
        }
        yield return(new WaitForSeconds(0.01f));
    }
示例#5
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;
    }