// void Start() public void Load() { // マップ読み込み TMXLoader tmx = new TMXLoader(); tmx.Load("Levels/map"); // 経路レイヤーを取得 Layer2D lPath = tmx.GetLayer("path"); // 開始地点を検索 Vec2D pos = lPath.Search(CHIP_PATH_START); // 座標リストを作成 _path = new List <Vec2D>(); // 開始座標を座標リストに登録 _path.Add(new Vec2D(pos.X, pos.Y)); // 通路をふさぐ lPath.Set(pos.X, pos.Y, CHIP_NONE); // 座標リスト作成 CreatePath(lPath, pos.X, pos.Y, _path); // コリジョンレイヤーを取得する _lCollision = tmx.GetLayer("collision"); }
// ロード開始 public void Load(int stage) { TMXLoader tmx = new TMXLoader(); // ファイルパスを作成 string path = string.Format("Levels/{0:D3}", stage); tmx.Load(path); // 0番目のレイヤーに情報を取得する Layer2D layer = tmx.GetLayer(0); // タイルの配置 for (int j = 0; j < layer.Height; j++) { for (int i = 0; i < layer.Width; i++) { // 座標を指定してレイヤーの値を取得 int v = layer.Get(i, j); float x = GetChipX(i); float y = GetChipY(j); switch (v) { case CHIP_PLAYER: { // プレイヤを移動させる GameObject obj = GameObject.Find("Player") as GameObject; Player player = obj.GetComponent <Player>(); player.SetPosition(x, y); } break; case CHIP_WALL: // 壁を作成 Wall.Add(x, y); break; case CHIP_SPIKE: // トゲを生成 Spike.Add(x, y); break; case CHIP_FLOOR_MOVE: // 移動床を作成 FloorMove.Add(x, y); break; case CHIP_GOAL: { // ゴールを移動させる GameObject obj = GameObject.Find("Goal") as GameObject; Goal goal = obj.GetComponent <Goal>(); goal.SetPosition(x, y); } break; } } } }
// ロード開始 public void Load(int stage) { TMXLoader tmx = new TMXLoader (); // ファイルパスを作成 string path = string.Format ("Levels/{0:D3}", stage); tmx.Load (path); // 0番目のレイヤーに情報を取得する Layer2D layer = tmx.GetLayer (0); // タイルの配置 for (int j = 0; j < layer.Height; j++) { for (int i = 0; i < layer.Width; i++) { // 座標を指定してレイヤーの値を取得 int v = layer.Get(i, j); float x = GetChipX(i); float y = GetChipY(j); switch (v) { case CHIP_PLAYER: { // プレイヤを移動させる GameObject obj = GameObject.Find("Player") as GameObject; Player player = obj.GetComponent<Player>(); player.SetPosition(x, y); } break; case CHIP_WALL: // 壁を作成 Wall.Add(x, y); break; case CHIP_SPIKE: // トゲを生成 Spike.Add(x, y); break; case CHIP_FLOOR_MOVE: // 移動床を作成 FloorMove.Add(x, y); break; case CHIP_GOAL: { // ゴールを移動させる GameObject obj = GameObject.Find("Goal") as GameObject; Goal goal = obj.GetComponent<Goal>(); goal.SetPosition(x, y); } break; } } } }
// Start is called before the first frame update void Start() { //マップ読み込み TMXLoader tmx = new TMXLoader(); tmx.Load("Levels/map"); //経路レイヤーを取得 Layer2D path = tmx.GetLayer("path"); //デバッグ出力 path.Dump(); }
public void Load(int stage) { TMXLoader tmx = new TMXLoader(); string path = string.Format("Levels/{0:D3}", stage); tmx.Load(path); Layer2D layer = tmx.GetLayer(0); //Debug.Log ("幅:" + layer.Width); //Debug.Log ("高:" + layer.Height); for (int j = 0; j < layer.Height; j++) { for (int i = 0; i < layer.Width; i++) { int v = layer.Get(i, j); float x = GetChipX(i); float y = GetChipY(j); switch (v) { case CHIP_PLAYER: { GameObject obj = GameObject.Find("Player") as GameObject; Player player = obj.GetComponent <Player> (); player.SetPosition(x, y); } break; case CHIP_WALL: Wall.Add(x, y); break; case CHIP_SPIKE: Spike.Add(x, y); break; case CHIP_FLOOR_MOVE: FloorMove.Add(x, y); break; case CHIP_GOAL: { GameObject obj = GameObject.Find("Goal") as GameObject; Goal goal = obj.GetComponent <Goal>(); goal.SetPosition(x, y); } break; } } } }
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; }
IEnumerator Start() { // 地形データのロード. var tmx = new TMXLoader(); tmx.Load("Levels/001"); var layer = tmx.GetLayer(0); // フィールドのタイルを1つずつ配置する 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 pathList = new List<Point2>(); // ユニットの基底クラス Token player = null; // A-star実行 { // スタート地点を設定 Point2 pStart = GetRandomPosition(layer); player = Util.CreateUnit(GetChipX(pStart.x), GetChipY(pStart.y), "", "miku2", "Player"); player.SortingLayer = "Chara"; // ゴール地点を設定 Point2 pGoal = GetRandomPosition(layer); var goal = Util.CreateUnit(GetChipX(pGoal.x), GetChipY(pGoal.y), "", "gate1", "Goal"); goal.SortingLayer = "Chara"; // 斜め移動可否判定を決定 var allowdiag = false; // コンストラクタにそれぞれの値を渡してインスタンス化 var anodeManager = new ANodeManager(layer, pGoal.x, pGoal.y, allowdiag); // スタート地点のノードを取得し、最小ノードに設定する。スタート地点なのでコストは「0」 ANode minScoreNode = anodeManager.OpenNode(pStart.x, pStart.y, 0, null); // それをオープンノードリストに追加する anodeManager.AddOpenNodeList(minScoreNode); // 移動試行回数。1000回超えたら強制中断 int cnt = 0; while (cnt < 1000) { // 今いるパネルをオープンノードリストから削除 anodeManager.RemoveOpenNodeList(minScoreNode); // 周囲を開く anodeManager.OpenAround(minScoreNode); // 最小スコアのノードを探す. minScoreNode = anodeManager.SearchMinScoreNodeFromOpenList(); if (minScoreNode == null) { // 最小スコアのノードがない場合は終了 Debug.Log("Not found path."); break; } // ゴールまでの経路算出が完了した場合? if (minScoreNode.X == pGoal.x && minScoreNode.Y == pGoal.y) { Debug.Log("Success."); // オープンノードリストから最小スコアのノードを削除する anodeManager.RemoveOpenNodeList(minScoreNode); // 再帰的ダンプ? minScoreNode.DumpRecursive(); // パスを取得する minScoreNode.GetPath(pathList); // pathListがゴール→現在位置という並びになっているので現在位置→ゴールの並びにするため反転を行う pathList.Reverse(); break; } yield return new WaitForSeconds(0.01f); } } // A-star実行ここまで // ユニットの状態を移動中に変更し、移動を実施する _state = eState.nowMoving; foreach (var p in pathList) { // 移動先パネルのXY値を取得 var x = GetChipX(p.x); var y = GetChipY(p.y); // 移動実施 player.X = x; player.Y = y; // ちょっと待たないと瞬間移動する yield return new WaitForSeconds(0.06f); } // ユニット状態を移動停止にする _state = eState.moveEnd; }
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; }