いちおくまんえん

最近はcocos2d-xでゲームアプリ「いちおくまんえん」の制作がメインです。 あとアニメも少々・・

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が全部対応してるとかも不明(´・ω・`)


よく分からないけど、とりあえず作ってみてちょっとずつ理解していこう。

適当に素材拾ってきて配置してみる。

f:id:ichiokumanyen:20150419001720j:plain

うん、杏ちゃん超かわいい!

タイルマップを置くツールだけどなぜかレイヤーを追加しようとしたら「画像レイヤーを追加する」が選択出来たので、ォオー!!(゚д゚屮)屮と思って使ってみた。

あと、オブジェクトレイヤーも存在してて好きな形のオブジェクトを作って置けた。

何かこれ使って通行不可能範囲とか、プレイヤーとかコイン置く位置決めたりしてるとか、どっかの記事か本かで読んだ気がする!

よし、実行してみよう

f:id:ichiokumanyen:20150419004306j:plain


なんでや!!( ゚д゚ )クワッ!!


ちょっと最初から盛りすぎたな!とかなり削って原因を探る。

f:id:ichiokumanyen:20150419005644j:plain:w160 f:id:ichiokumanyen:20150419005658j:plain:w160 f:id:ichiokumanyen:20150419005707j:plain:w160


どうやら、同じレイヤーに違うタイルセットのものを混在させると、どっちかの画像が狂う。

たぶん、1レイヤーに対して1タイルセット。んで、GIDの一番若いので使ったタイルセットが使用される。

たぶん!

あと、最後(右端にある)のタイルセットの一部が表示されなくなることがある。
なので最後にダミーのタイルセット足しておくと安定した(;・∀・)


一応これでタイルマップの部分はちゃんと表示出来た。


画像とオブジェクトの部分はよく分からないので、ソース確認しつつ、cppにブレークポイント貼って中身見てみる。
WindowsC++デバッグできるのありがたいですね!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座標。
f:id:ichiokumanyen:20150419054310j:plain

cocos2d::Valueの取り方は全然記憶してないので適当に書いてます(;・∀・)

というわけで、オブジェクトレイヤーで作ったものに対してはちゃんとアクセス出来そう。

画像レイヤーは多分対応してないっぽい。(よく調べないでモノを言う)
// TODO こっちもまた暇を見つけてちゃんと調べる


あとTiledでは、タイルセットにもカスタムプロパティがセット出来て、地形の情報も持たせられる。1タイル毎にもカスタムプロパティが持てるみたい。
地形情報は1タイルを4分割してそれぞれに指定出来る。

f:id:ichiokumanyen:20150419054616j:plain

たぶん当たり判定に使用するのではないかと想像( ・`д・´)

これらのプロパティは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^)