【Cocos2d-x 3.0】TMXTiledMap クラスを利用して tmx ファイルを読み込む
はじめまして、tenclaps でプログラムを書いている横波ホイヘンスです。 プロジェクト「女神の涙」(仮)ではパズル部分のロジックを担当しています。
パズル部分では、各ステージの情報を読み込むために tmx ファイルを使用しています。 今回は、Cocos2d-x の持つ tmx ファイルを読み込むための TMXTiledMap クラスについて書こうと思います。
tmx ファイルの作成
tmx ファイルは Tiled Map Editorなどのフリーソフトで作成できます。 下図の様な雰囲気です。
出力形式がいくつか選択できますが、とりあえず 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 ファイルの編集時にレイヤーを不可視モードにしたまま保存すると、 その TMXLayer
の getTileGIDAt
メソッドを呼ぶ際に EXC_BAD_ACCESS
で落ちます。など。
参考サイト
日本語です。Cocos2d の x ではない方を使用したチュートリアルですが、Tiled の使い方などが詳しくて参考になりました。