cocos2d-xでタイルマップを使う。いろいろ苦戦中('A`)
Luaでタイルマップを表示するのは簡単です。
function MainScene:onCreate() -- マップ作る cc.のものより早いらしいのでこっち使う local map = ccexp.TMXTiledMap:create("tilemap/school01.tmx") self:addChild(map) end
終わりw
今まではこっち使ってましたが、
cocos2d::TMXTiledMap
これからはこっちを使うらしいです。
cocos2d::experimental::TMXTiledMap
ファイル名がCCTMXTiledMap.hから、CCFastTMXTiledMap.hに変わってるので間違いない!
いや、もしかしたら普段使わなさそうな余計な機能落としてますよーとかかも知れないですが!
ちゃんと差分見ておこ(´・ω・`)
とりあえず、実際には色々確認したいのでもっと色々書いてますが肝心な部分はあれだけでOKです。
ただ、Tiledとかで作ったtmxファイルを表示するのは出来るわけですが、表示して終わるだけじゃないのがゲームです。色々しないといけません。
そもそもこういうマップ系のゲームなんて作ったこともなかったし、作れる気もしなかったのでスルーしてましたが、やっぱりRPG的なもの作りたいですよね(・∀・)
なので、頑張って作ってみようと思います( ・`д・´)
一応、Tiledはcocos2d-x対応してるよということでなんですが、一体どこまで出来るのかが全く分かりません。
Tiled触ったことないので、そもそも何が出来るのかも分からないし、設定した項目をcocos2d-xが全部対応してるとかも不明(´・ω・`)
よく分からないけど、とりあえず作ってみてちょっとずつ理解していこう。
適当に素材拾ってきて配置してみる。
うん、杏ちゃん超かわいい!
タイルマップを置くツールだけどなぜかレイヤーを追加しようとしたら「画像レイヤーを追加する」が選択出来たので、ォオー!!(゚д゚屮)屮と思って使ってみた。
あと、オブジェクトレイヤーも存在してて好きな形のオブジェクトを作って置けた。
何かこれ使って通行不可能範囲とか、プレイヤーとかコイン置く位置決めたりしてるとか、どっかの記事か本かで読んだ気がする!
よし、実行してみよう
なんでや!!( ゚д゚ )クワッ!!
ちょっと最初から盛りすぎたな!とかなり削って原因を探る。
どうやら、同じレイヤーに違うタイルセットのものを混在させると、どっちかの画像が狂う。
たぶん、1レイヤーに対して1タイルセット。んで、GIDの一番若いので使ったタイルセットが使用される。
たぶん!
あと、最後(右端にある)のタイルセットの一部が表示されなくなることがある。
なので最後にダミーのタイルセット足しておくと安定した(;・∀・)
一応これでタイルマップの部分はちゃんと表示出来た。
画像とオブジェクトの部分はよく分からないので、ソース確認しつつ、cppにブレークポイント貼って中身見てみる。
WindowsでC++のデバッグできるのありがたいですね!VisualStudioCommunityさまさまです。
どうやら値は渡ってきてる。
MapInfoの_objectGroups._data[0]._objects[作ったobjの数分]._field.mapVal[プロパティの数分].firstが
基本はname, type, x, y, width, height, gidがあって、ベクターで用意したものは、pointsに格納されてる。
後は自分でカスタムで用意したものも取得できてた。
pointsは、second._field.vectorVal[打ったポイント数分]._field.mapVal[0].secondがx座標、1がy座標。
cocos2d::Valueの取り方は全然記憶してないので適当に書いてます(;・∀・)
というわけで、オブジェクトレイヤーで作ったものに対してはちゃんとアクセス出来そう。
画像レイヤーは多分対応してないっぽい。(よく調べないでモノを言う)
// TODO こっちもまた暇を見つけてちゃんと調べる
あとTiledでは、タイルセットにもカスタムプロパティがセット出来て、地形の情報も持たせられる。1タイル毎にもカスタムプロパティが持てるみたい。
地形情報は1タイルを4分割してそれぞれに指定出来る。
たぶん当たり判定に使用するのではないかと想像( ・`д・´)
これらのプロパティはcocos2d-xで有効活用されてるんだろうか。調べてみる。
色々試してみたけど一部はmapInfo._tilePropetiesに格納されるけど全然思ったとおりにならない。
何かmapInfo._tilePropetiesに各タイルセットの情報と、各タイルの情報がカオスな感じに突っ込まれてる。
地形情報は受け取ろうと箱は出来てるけど値が渡ってない。
ちゃんとパース周りのソース追わんと分かんないねこれ('A`)
とりあえず何が保存されてるのか、モデル周りのメンバ洗っとく。
TMXTilesetInfo メンバ抜き出し
class CC_DLL TMXTilesetInfo : public Ref { std::string _name; int _firstGid; Size _tileSize; int _spacing; int _margin; //! filename containing the tiles (should be spritesheet / texture atlas) std::string _sourceImage; //! size in pixels of the image Size _imageSize; };
TMXMapInfo メンバ抜き出し
class CC_DLL TMXMapInfo : public Ref, public SAXDelegator { /// map orientation int _orientation; /// map width & height Size _mapSize; /// tiles width & height Size _tileSize; /// Layers Vector<TMXLayerInfo*> _layers; /// tilesets Vector<TMXTilesetInfo*> _tilesets; /// ObjectGroups Vector<TMXObjectGroup*> _objectGroups; /// parent element int _parentElement; /// parent GID int _parentGID; /// layer attribs int _layerAttribs; /// is storing characters? bool _storingCharacters; /// properties ValueMap _properties; //! xml format tile index int _xmlTileIndex; //! tmx filename std::string _TMXFileName; // tmx resource path std::string _resources; //! current string std::string _currentString; //! tile properties ValueMapIntKey _tileProperties; int _currentFirstGID; bool _recordFirstGID; };
TMXLayerInfo メンバ抜き出し
class CC_DLL TMXLayerInfo : public Ref { ValueMap _properties; std::string _name; Size _layerSize; uint32_t *_tiles; bool _visible; unsigned char _opacity; bool _ownTiles; Vec2 _offset; };
タイルセットのモデルに欲しい情報が全然残ってないことは分かった。
せめてカスタムプロパティくらいは持ってて欲しかった・・。
とまぁ、これとは別にオートタイルとかでも困ってます(´・ω・`)
分かってはいたけど、ちゃんとマップチップ使っていい感じに動かすのは大変そうです。
何となくで動かす分には無理やりな対応で出来そうだけど、結構こだわりたい部分なので頑張って理解します!
明日はパース周りちゃんと調べるのと、オートタイルの記事でも書きます。
会社行かなくなってから、完全に生活のサイクルが狂いまくってます。
まぁ誰かに迷惑かけるわけでもないのでいいんですけどね(^q^)