ネットにあるいくつかの日本語資料はAndEngineの古いバージョンでの話だったり
Exampleだけ見ても、実際にtmxファイルをどうやって準備すればいいのかなどが分からなかった
やっと使い方が分かったのでメモしておきます
まず前提として
AndEngineのほかに
AndEngineTMXTiledMapExtension
をインポートしておく必要がある
AndEngineTMXTiledMapExtensionのある場所は公式のgitにあります
拡張のインポート方法は過去の記事でも触れてきたので割愛
(普通にインポートすればいいだけです)
1、マップタイル画像の準備
ネットで「マップタイル 素材」とかで調べればフリーの素材サイトがたくさん出てきます
今回はぴぽや様のマップセット1、320x240用マップチップを使います
タイルサイズ16x16のウディタというツールで利用されている有名なマップタイルセットです。
2、Tiledのインストール
Tiledというソフトをダウンロードします
Tiledの公式ページトップ |
Tiledの公式ダウンロードページ |
自分のOSにあったバージョンをダウンロードして、インストールしましょう
3、Tiledでマップデータを作る
Tiledを使ってマップを作りましょう
新規作成ボタンで新しいマップを作成します
レイヤー・フォーマットはBase64(gzip圧縮)を選択します
マップの大きさはとりあえず20x20にしておきましょう
今回使うタイルの大きさは16x16ですので16x16に
次はタイルセットを使えるようにしましょう
マップ⇒新しいタイルセットを選択
画像のパスを選択して、タイル情報を入れます
今回使うタイルセットは16x16で余白などは無しなので以下の画像の通りに設定
右下にタイルセットが出るようになりました
後はお絵かきの要領でマップを作っていきます
レイヤー分けなどもできますが、今回の説明では割愛
出来たらファイル名を付けて保存しましょう
とりあえず「map01.tmx」としておきました。
4、Androidプロジェクトを作成
ホームページに置いてあるHelloWorldを基に作成していきます
とりあえずプロジェクトの名前をTileTestに変更しておきましょう
とりあえずプロジェクトの名前をTileTestに変更しておきましょう
ライブラリを追加
AndEngineをライブラリ登録したのと同じようにAndEngineTMXTiledMapExtensionをライブラリ登録します
tmxファイルの画像パスの編集
先ほど作ったmap01.tmxファイルをテキストエディタで開きましょう。
<image source= "画像ファイルのパス">
となっているところがあると思います
この画像ファイルのパスを"gfx/画像ファイル名"
となるように編集しましょう
例えばmapchip.pngというマップタイル画像を使っている場合は
<image source= "gfx/mapchip.png">
とすればOKです
(例)
<image source= "画像ファイルのパス">
となっているところがあると思います
この画像ファイルのパスを"gfx/画像ファイル名"
となるように編集しましょう
例えばmapchip.pngというマップタイル画像を使っている場合は
<image source= "gfx/mapchip.png">
とすればOKです
(例)
<?xml version="1.0" encoding="UTF-8"?> <map version="1.0" orientation="orthogonal" width="20" height="20" tilewidth="16" tileheight="16"> <tileset firstgid="1" name="mapchip" tilewidth="16" tileheight="16"> <image source="gfx/mapchip.png" trans="ffffff" width="128" height="1056"/> </tileset> <layer name="タイル・レイヤー1" width="20" height="20"> <data encoding="base64" compression="gzip"> H4sIAAAAAAAAC1NkYGBQxIKVoBibHDmY2uYpopm3EIgXAfFiHHxSzVsJxKuAeDUOPrH+hZm5EYg3AfFmHHxs+nBhasQDunnkhh8ut5Ebfrj8SWz4EWsetdMxNcIPWZwa4YdsJrnhR8hcaqZFaptHq7xEq7w5FDEAH4dOuEAGAAA= </data> </layer> </map>
タイルセット画像とtmxファイルをプロジェクトのフォルダに入れる
これで準備完了です。
後はコードを書いていきましょう
Fieldsにタイルマップの格納変数
後はコードを書いていきましょう
5、MainAcivity.javaにコードを追加
Fieldsにタイルマップの格納変数
private TMXTiledMap mTMXTiledMap; // タイルマップを追加
// =========================================================== // Fields // =========================================================== private Font mFont; // 標準フォントを格納するフィールド private TMXTiledMap mTMXTiledMap; // タイルマップ
protected Scene onCreateScene()の中にマップの読み込み処理とシーンへのattachを追加
//TMX mapの読み込み try{ final TMXLoader tmxLoader = new TMXLoader(this.getAssets(), this.mEngine.getTextureManager(), TextureOptions.BILINEAR_PREMULTIPLYALPHA, this.getVertexBufferObjectManager(), new ITMXTilePropertiesListener() { @Override public void onTMXTileWithPropertiesCreated(final TMXTiledMap pTMXTiledMap, final TMXLayer pTMXLayer, final TMXTile pTMXTile, final TMXProperties<TMXTileProperty> pTMXTileProperties) { } }); this.mTMXTiledMap = tmxLoader.loadFromAsset("tmx/map01.tmx"); }catch (final TMXLoadException tmxle) { Debug.e(tmxle); } // レイヤーをSceneに結びつける for (int i = 0; i < this.mTMXTiledMap.getTMXLayers().size(); i++){ TMXLayer layer = this.mTMXTiledMap.getTMXLayers().get(i); scene.attachChild(layer); }
一応全ソースを置いておきます
MainActivity.java
package test.andengine.tiletest; import org.andengine.engine.camera.Camera; import org.andengine.engine.options.EngineOptions; import org.andengine.engine.options.ScreenOrientation; import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; import org.andengine.entity.scene.Scene; import org.andengine.entity.scene.background.Background; import org.andengine.entity.text.Text; import org.andengine.entity.text.TextOptions; import org.andengine.extension.tmx.TMXLayer; import org.andengine.extension.tmx.TMXLoader; import org.andengine.extension.tmx.TMXProperties; import org.andengine.extension.tmx.TMXTile; import org.andengine.extension.tmx.TMXTileProperty; import org.andengine.extension.tmx.TMXLoader.ITMXTilePropertiesListener; import org.andengine.extension.tmx.TMXTiledMap; import org.andengine.extension.tmx.util.exception.TMXLoadException; import org.andengine.opengl.font.Font; import org.andengine.opengl.font.FontFactory; import org.andengine.opengl.texture.TextureOptions; import org.andengine.ui.activity.SimpleLayoutGameActivity; import org.andengine.util.HorizontalAlign; import org.andengine.util.debug.Debug; import test.andengine.tiletest.R; import android.graphics.Typeface; public class MainActivity extends SimpleLayoutGameActivity { // =========================================================== // Constants // =========================================================== // 画面サイズを設定 private static final int CAMERA_WIDTH = 480; private static final int CAMERA_HEIGHT = 720; // =========================================================== // Fields // =========================================================== private Font mFont; // 標準フォントを格納するフィールド private TMXTiledMap mTMXTiledMap; // タイルマップ // =========================================================== // Constructors // =========================================================== // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public EngineOptions onCreateEngineOptions() { // カメラクラスに表示サイズを指定 Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); // ゲームのエンジンを初期化 EngineOptions eo = new EngineOptions( true, ScreenOrientation.PORTRAIT_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera); return eo; } @Override protected void onCreateResources() { // 標準フォントを用意 mFont = FontFactory.create(this.getFontManager(), this.getTextureManager(), 256, 256, Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32); mFont.load(); } @Override protected Scene onCreateScene() { // シーンを作る final Scene scene = new Scene(); // 背景色を水色に設定(RGB) scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f)); // 文字を表示 final Text text = new Text( 10, 10, this.mFont, "Hello World !", new TextOptions(HorizontalAlign.RIGHT), getVertexBufferObjectManager()); scene.attachChild(text); //TMX mapの読み込み try{ final TMXLoader tmxLoader = new TMXLoader(this.getAssets(), this.mEngine.getTextureManager(), TextureOptions.BILINEAR_PREMULTIPLYALPHA, this.getVertexBufferObjectManager(), new ITMXTilePropertiesListener() { @Override public void onTMXTileWithPropertiesCreated(final TMXTiledMap pTMXTiledMap, final TMXLayer pTMXLayer, final TMXTile pTMXTile, final TMXProperties<TMXTileProperty> pTMXTileProperties) { } }); this.mTMXTiledMap = tmxLoader.loadFromAsset("tmx/map01.tmx"); }catch (final TMXLoadException tmxle) { Debug.e(tmxle); } // レイヤーをSceneに結びつける for (int i = 0; i < this.mTMXTiledMap.getTMXLayers().size(); i++){ TMXLayer layer = this.mTMXTiledMap.getTMXLayers().get(i); scene.attachChild(layer); } return scene; } @Override protected int getLayoutID() { // ActivityのレイアウトのIDを返す return R.layout.activity_main; } @Override protected int getRenderSurfaceViewID() { // SceneがセットされるViewのIDを返す return R.id.renderview; } }
このコメントは投稿者によって削除されました。
返信削除