ステージを外部ファイルから読み込む

ステージを外部ファイルから読み込む

TMXファイルとは

TMXというファイルを使う。
RPGとかのタイルマップを表現するファイル形式。
「Tiled Map Editor」というエディタがある。調べて無いけどほかにもあるかも。
AndengineにはTMXを読み込んで、Javaオブジェクトとして簡単に利用できるようにする拡張がある。
今回のブロック崩しでは、このエディタを使ってブロックを配置してTMXファイルに保存する。
そのTMXファイルを読み込んで、画面に表示したりする。

AndengineでTMXファイルを使う準備

AndEngineTMXTiledMapExtensionをインポートして、プロジェクトを右クリックプロパティで
Androidを選択して、ライブラリを追加。

TMXファイルを使う

まずは、TMXファイルを読み込む。以下のような感じ。
  1. // TMXファイルの読み込み
  2. private TMXTiledMap map
  3. try {
  4. final TMXLoader tmxLoader = new TMXLoader(activity.getAssets(),
  5. engine.getTextureManager(),
  6. TextureOptions.REPEATING_NEAREST_PREMULTIPLYALPHA, vbom,
  7. null);
  8. map = tmxLoader.loadFromAsset("ファイル名のパス");
  9. } catch (final TMXLoadException e) {
  10. Debug.e(e);
  11. }
  12.  
ファイル名のパスはassetsディレクトリ基準になるので注意。
ファイル名を指定してTMXファイルを読み込んだら、TMXTiledMap型のオブジェクトが得られる。

TMXTiledMapには、タイルセット、レイヤー、オブジェクトグループというものを保持している。
エディタで作ったマップを表示したい場合は、TMXTiledMapからレイヤーを得て、sceneなどにattachすればよい。

TMXのオブジェクト

TMXファイルは、規則正しくマップチップを並べたマップだけではなく、任意の座標を使った図形も表現できる。
この図形をオブジェクトという。説明の際にややこしくならないように注意しないと。

TMXでマップチップを並べた1枚のまとまりをレイヤーと言うのに対して、オブジェクトをまとめたものをオブジェクトグループという。

このゲームでは、TMXでゲームのブロックの並びを表現するが、マップチップではなく、このオブジェクトを使ってブロックを表現する。
というのも、マップチップは正方形じゃないとダメだし、配置する座標も正方形の変の倍数に限定されるから。

TMXファイルでオブジェクトだけを使うというのも、結構特殊な使い方。本当はもっとより良い簡単な方法があるかも、まあいいか。

TMXで表現したブロックを画面に配置する。

以下が処理の流れ
  • TMXTiledMapからオブジェクトグループのリストを得る
  • オブジェクトグループのリストから、ブロックを配置しているオブジェクトグループを得る
  • オブジェクトグループから、オブジェクトのリストを得る
  • オブジェクトのリストから1つ1つオブジェクトを得て以下の処理を行う
    • オブジェクトの座標、幅、高さを得る
    • Andengine上に配置するEntityを座標、幅、高さから作る
    • Entityにあたり判定とかのゲームロジックを設定する
    • 画面にattach

コード

こんな感じ
  1. final FixtureDef blockFixtureDef = PhysicsFactory.createFixtureDef(0,
  2. 1.0f, 0.5f);
  3. for (final TMXObjectGroup group : map.getTMXObjectGroups()) {
  4. if (group.getName().equals("block")) {
  5. for (final TMXObject object : group.getTMXObjects()) {
  6. final Rectangle block = new Rectangle(
  7. object.getX() + 16, object.getY() + 32,
  8. object.getWidth(), object.getHeight(), vbom);
  9. Body body = PhysicsFactory.createBoxBody(physicsWorld,
  10. block, BodyType.StaticBody, blockFixtureDef);
  11. body.setUserData(new BodyData(block, "block", 1));
  12. block.setColor(Color.YELLOW);
  13. block.setVisible(true);
  14. attachChild(block);
  15. allBlockNum++;
  16. }
  17. }
  18. }
  19.  
最終更新:2013年10月06日 11:56