【Cocos2d-x 3.0】TMXTiledMap クラスを利用して tmx ファイルを読み込む

はじめまして、tenclaps でプログラムを書いている横波ホイヘンスです。 プロジェクト「女神の涙」(仮)ではパズル部分のロジックを担当しています。

パズル部分では、各ステージの情報を読み込むために tmx ファイルを使用しています。 今回は、Cocos2d-x の持つ tmx ファイルを読み込むための TMXTiledMap クラスについて書こうと思います。

tmx ファイルの作成

tmx ファイルは Tiled Map Editorなどのフリーソフトで作成できます。 下図の様な雰囲気です。

f:id:tenclaps:20140529205412p:plain

出力形式がいくつか選択できますが、とりあえず xml 形式を選んでおけば Cocos2d-x で読み込むことが可能です。

tmx ファイルを読み込む

まず作成した tmx ファイルをプロジェクトに追加しましょう。 tmx ファイルは TMXTiledMap クラスを使って以下のように読み込むことができます。

TMXTiledMap* pTiledMap = TMXTiledMap::create("sampleMap.tmx");

Cocos2d-x に用意された他のクラスを使って、作成した tmx ファイルの情報を読み取っていきましょう。

例えば、特定のレイヤの座標 (i, j) に置かれているタイルが何か調べるには、以下のようにして TMXLayer オブジェクトを取得し、 getTileGIDAt メソッドを使います。

TMXLayer* layer = pTiledMap->getLayer("layerName");
int tileType  = layer->getTileGIDAt(cocos2d::Point(i, j));

他に何ができるかを知るために、TMXTiledMap のリファレンスを見てみましょう。

http://www.cocos2d-x.org/reference/native-cpp/V3.0/d6/d48/classcocos2d_1_1_t_m_x_tiled_map.html

Tiled で tmx ファイルを作っていた時のキーワードと、 Cocos2d-x の対応関係が以下のようになっていることが察せられます。

tmx ファイル Cocos2d-x 取得方法
tmx ファイル TMXTiledMap TMXTiledMap::create
レイヤー TMXLayer TMXTiledMap::getLayer
オブジェクト・レイヤー TMXObjectGroup TMXTiledMap::getObjectGroup
オブジェクト ValueMap TMXObjectGroup::getObject
オブジェクトのプロパティ Value ValueMap のオブジェクトに配列形式[]でアクセスする
タイルの種類(タイルセットの画像ファイル上で左上から数えた番号) int TMXLayer::getTileGIDAt

今のところ使っているのはこの程度です。

注意点

オブジェクトのプロパティに、(おそらく Cocos2d-x で tmx ファイルを解析しているパーサの)予約語を使うことは出来ません。

たとえば、 nameプロパティは、オブジェクトのプロパティとして使用していなければオブジェクトそのものの名前が入っていますが、プロパティとして使用するとプロパティ値もオブジェクトの名前も返さなくなります。

他に、tmx ファイルの編集時にレイヤーを不可視モードにしたまま保存すると、 その TMXLayergetTileGIDAt メソッドを呼ぶ際に EXC_BAD_ACCESS で落ちます。など。

参考サイト

日本語です。Cocos2d の x ではない方を使用したチュートリアルですが、Tiled の使い方などが詳しくて参考になりました。