タワーディフェンス系のゲームで敵がゴールに向かって最短経路で進んだりするやつです。
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 件のコメント:
コメントを投稿