タワーディフェンス系のゲームで敵がゴールに向かって最短経路で進んだりするやつです。
AStarPathFinderクラスのfindPathメソッドで最短経路のPathを取得できます。
ただしfindPathメソッドで定義したApathはタイルの列と行なので座標に変換する必要があります。
/AStarPathを定義 final org.anddev.andengine.util.path.Path Apath; // findpath()の動作を定義 final ITiledMap<TMXLayer> tmap = new ITiledMap<TMXLayer>(){ public int getTileColumns() { return mTMXTiledMap.getTileColumns(); } public int getTileRows() { return mTMXTiledMap.getTileRows(); } // findpath()で処理されるときに処理する必要があるコードはここに記述 public void onTileVisitedByPathFinder(int pTileColumn, int pTileRow) { } // どのブロックをブロックしたいかカスタマイズできる Lets you customize what blocks you want to be considered blocked public boolean isTileBlocked(TMXLayer pEntity, int pTileColumn, int pTileRow) { // false by defaultの場合はブロックは無し return false; } // 重要 // pathの次のタイルのコストを返却 public float getStepCost(TMXLayer pEntity, int pFromTileColumn, int pFromTileRow, int pToTileColumn, int pToTileRow) { // ↓例 TMXProperty cost = tmxLayer.getTMXTile(pToTileColumn, pToTileRow).getTMXTileProperties(mTMXTiledMap).get(0); return Float.parseFloat(cost.getValue()); } }; // AStarPathFinderを宣言 // 第1引数:上記のITiledMap // 第2引数:最大検索の深さ(この値が小さすぎる場合、プログラムがクラッシュします。) // 第3引数:斜め移動を許可するかどうか // 第4引数:(オプション)ヒューリスティック関数の使用 AStarPathFinder<TMXLayer> AStarPath = new AStarPathFinder<TMXLayer>(tmap, 100, false); // findPath()でpathを作成 // 第1引数:TMXLayerの場合、上記ITiledMapとAStarPathFinder関数を使ってテンプレート化。 // 第2引数:最大のコスト(1タイルではなく終了までの値。値が小さすぎる場合、プログラムがクラッシュします。) // 第3引数&第4引数:スタートタイルの場所(列と行で指定) // 第5引数&第6引数:エンドタイルの場所(列と行で指定) Apath = AStarPath.findPath(this.mTMXTiledMap.getTMXLayers().get(0), 100, 1, 13, 5, 12); // プレイヤーのエンドタイルの場所をセットしておく final TMXTile tmxTile = tmxLayer.getTMXTile(5, 12); if(tmxTile != null) { player.setPosition(tmxTile.getTileX(), tmxTile.getTileY()); } // 実際にスプライトを操作するための座標ベースのパスを宣言 final Path path = new Path(Apath.getLength()); int tilewidth = mTMXTiledMap.getTileWidth(); int tileheight = mTMXTiledMap.getTileHeight(); // 座標ベースのパスからAStarPath用に変換 for(int i=0;i < Apath.getLength();i++) { path.to((Apath.getTileColumn(i) * tilewidth), (Apath.getTileRow(i) * tileheight)); } // スプライトの移動時間をそれぞれのタイルで0.5になるように設定 // Move the sprite, the duration in PathModifier sets each tile to a .5 duration player.registerEntityModifier(new PathModifier((Apath.getLength()/2), path, null, new IPathModifierListener() { public void onPathStarted(PathModifier pPathModifier, IEntity pEntity) { } public void onPathWaypointStarted(PathModifier pPathModifier, IEntity pEntity, int pWaypointIndex) { } public void onPathWaypointFinished(PathModifier pPathModifier, IEntity pEntity, int pWaypointIndex) { } public void onPathFinished(PathModifier pPathModifier, IEntity pEntity) { } }));
0 件のコメント:
コメントを投稿