cocos2-x v3.0beta2 ＆ tiled でマップオブジェクトの作成


## 環境

[cocos2d-x v3.0 beta2](http://www.cocos2d-x.org/)

使用ツール
[Tiled Map Editor](http://www.mapeditor.org/) (ver 0.9.1)

## やりたいこと

tiledで作成した情報を元にマップ上にオブジェクトの配置
極力わかりやすく、汎用的に…書いたつもり

【完成マップ】
<a href="https://qiita-image-store.s3.amazonaws.com/0/33521/ab97e7f5-ef3c-f4b9-1cfe-3c7e80c05fc2.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/33521/ab97e7f5-ef3c-f4b9-1cfe-3c7e80c05fc2.png" width="30%" /></a>


## ソース

`TMXTiledMap`はすでに配置済みの状態
その後にこのメソッドを呼び出す感じでtiledからの初期配置が可能

```cpp:GameScene.cpp

void GameScene::setAllMapObject()
{
    // マップ取得
    auto tiledMap = (TMXTiledMap *)this->getChildByTag(TAG_MAP);
    
    // object group取得
    auto objectGroup = tiledMap->getObjectGroup("objects");
    
    // その中から全objectの取得
    auto objects = objectGroup->getObjects();
    
    if (objects.empty()) {
        log("can not find object");
        return;
    }
    
    // 取得したオブジェクトの情報を元に実際にマップ上へセットしていく
    for (auto object : objects) {
        
        // objectに設定されているプロパティなどを取得
        ValueMap objectInfo = object.asValueMap();
        
        if (objectInfo.find("name") == objectInfo.end() || objectInfo.find("type") == objectInfo.end()) {
            log("can not find necessary info");
            continue;
        }
        
        auto name = objectInfo.at("name").asString();       // 同タイプでobjectを判別するために一意の値を設定するようにする(今は未使用)
        auto type = objectInfo.at("type").asString();       // objectのタイプ
        
        Node* obj = NULL;
        // 独自クラスもってるならそれを設定する(今回はPlayerクラス)
        if (type == "Player") {
            obj = Player::create();
        }
        // 独自クラスを持ってない汎用クラスの場合
        else if (type == "Sprite") {
            obj = Sprite::create(objectInfo.at("file").asString());
        } else if (type == "LayerColor") {
            obj = LayerColor::create(Color4B(objectInfo.at("r").asInt(), objectInfo.at("g").asInt(), objectInfo.at("b").asInt(), objectInfo.at("a").asInt()), objectInfo.at("width").asFloat(), objectInfo.at("height").asFloat());
            // ほかタイプとまとめて位置調整するために調整
            obj->ignoreAnchorPointForPosition(false);
            obj->setAnchorPoint(Point::ANCHOR_MIDDLE);
        } else {
            log("unknown type");
            continue;
        }
        
        // 表示・非表示
        obj->setVisible(objectInfo.at("visible").asString() == "1");
        
        // 表示位置(マップのタイルの中心にくるように)
        auto tileSize = tiledMap->getTileSize();
        
        // 取れる位置は左下起点なので調整
        auto x = objectInfo.at("x").asFloat() + tileSize.width * 0.5;
        auto y = objectInfo.at("y").asFloat() + tileSize.height * 0.5;
        obj->setPosition(Point(x, y));
        
        // 配置
        tiledMap->addChild(obj);
    
    }
    
}

```

## Tile Map Editor の設定

<a href="https://qiita-image-store.s3.amazonaws.com/0/33521/0f1f780f-464c-170f-2ede-3fdf23b29f1e.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/33521/0f1f780f-464c-170f-2ede-3fdf23b29f1e.png" width="30%" /></a>
△tile map editor objects画面

<div style="text-align:center">
<div><a href="https://qiita-image-store.s3.amazonaws.com/0/33521/f7a80601-0eaa-0722-656e-8791ef0071e8.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/33521/f7a80601-0eaa-0722-656e-8791ef0071e8.png" width="30%" /></a><a href="https://qiita-image-store.s3.amazonaws.com/0/33521/22a90ca4-cac4-b605-924c-a7995e8942b4.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/33521/22a90ca4-cac4-b605-924c-a7995e8942b4.png" width="30%" /></a><a href="https://qiita-image-store.s3.amazonaws.com/0/33521/daec238d-1882-c548-bccb-0f0e9813ddde.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/33521/daec238d-1882-c548-bccb-0f0e9813ddde.png" width="30%" /></a></div><p>△各objectのプロパティ</p>
</div>


## 素材

今回コチラの素材を利用しております
[ぴぽや倉庫](http://piposozai.wiki.fc2.com/)

## 参考WEB

[Cocos2D 2.Xでタイルベースゲームの作成チュートリアル](http://www.raywenderlich.com/ja/40094/cocos2d-2-x%E3%81%A7%E3%82%BF%E3%82%A4%E3%83%AB%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E4%BD%9C%E6%88%90%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB)
cocos2dの話だけどそこは自分で脳内置換で。
最初から丁寧に書かれてるので導入としては完璧
全2ステップ


## メモ・感想

Objectのプロパティは自由に設定できてコードで取得できるので
もっといろいろ拡張できそう…けど
多分それぞれで独自クラス(今回で言えばPlayerクラス)作ってやるだろうから、
その中であれこれするのが普通なのかな

多分自分でもそうするので、今回書いた汎用クラスのケースはほぼないかも(笑)

何かアレばコメントなりtwitterなりで押してくださいな