とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

Cocos2dx 3.0 TielMapEditor Tieldで作ったMAPを取り込む

前々回で物理演算出来る世界を作成して、 前々回にTieldでマップを作成しました。

今回はこのマップをCocos2dxに取り込みます。

まずはxcodeからResourcesに読み込みます。

f:id:raharu0425:20140529155148p:plain

TiledbodyCreatorの作成

Create Box2D bodies with TMX Objects layer! Cocos2d-x 3.0 | Cocos2d-x
作っている最中にこれ外だししないとやってられんと思っていましたが、
先に作ってくれている人が居ましたのでありがたく使わせてもらいます。thx egordm!!

ただし、公開されている物はオブジェクトレイヤーが1つのみでかつ名前もCollisionと
決められているなど若干制約がありますなのでちょっと拡張させてもらいました。
こちらもおいておきます

raharu0425/TileBodyCreator · GitHub

このファイルをxcodeで読み込みます。

f:id:raharu0425:20140529164312p:plain

HelloWorld::init()
TiledBodyCreator.hをIncludeして
床の作成部分を全部削除してこのソースに変更

    //マップのロード
    TMXTiledMap* pTileMap = TMXTiledMap::create("map.tmx");
    pTileMap->setAnchorPoint(Point::ZERO);
    pTileMap->setScale(0.5f);
    pTileMap->setPosition(Point(200, -300));
    addChild(pTileMap);
    
    TiledBodyCreator::initCollisionMap(pTileMap, _world, "CollisionMap");

initCollisionMapの戻り値はCollisionBody本体を帰るように変更してあるので、 setした後に反発係数や、摩擦係数を変更出来ます

    TiledBodyCreator::initCollisionMap(pTileMap, _world, "CollisionMap");
    
    auto map_body = TiledBodyCreator::initCollisionMap(pTileMap, _world, "CollisionMap");
    
    //全てのオブジェクトに対して行う
    for (auto list = map_body->GetFixtureList(); list; list = list->GetNext()){
        //摩擦係数
        list->SetFriction(10 / PTM_RATIO);
        //反発係数
        list->SetRestitution(10 / PTM_RATIO);
    }

とこんな感じです。かなり行数が減りすっきりました。
ちょっとかくかくしてるのは自分のマシンのせいです。
実機だとさくさく動くとおもいますよ。