SyntaxHighlighter

2012年1月12日木曜日

【AndEngine】TMX map を使った簡単な例 プレイヤーを移動させる(AStarPath編)

前回はプレイヤーの移動する座標をpathに登録しましたが、今回は2点間の最短経路をpathに登録してプレイヤーを移動させる方法についてです。
タワーディフェンス系のゲームで敵がゴールに向かって最短経路で進んだりするやつです。


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) {
  }
}));


Class Path(org.anddev.andengine.util.path.Path)

Class AStarPathFinder

0 件のコメント:

コメントを投稿