2015年

3月

04日

Cocos2d-x Ver 3.x JSONファイルの読み込み

Cocos2dx 3.x C++言語
JsonScene.hを次のように変更してみてください。

#ifndef __Json__JsonScene__

#define __Json__JsonScene__


#include "cocos2d.h"


// 名前空間 #define USING_NS_CC using namespace cocos2d

USING_NS_CC;


class JsonScene : public cocos2d::Layer

{

protected:

    JsonScene();

    virtual ~JsonScene();

    //初期化のメソッド

    bool init() override;

    

public:

    static cocos2d::Scene* createScene();

    

    // create()を使えるようにしている。

    CREATE_FUNC(JsonScene);

    

};


#endif /* defined(__Json__JsonScene__) */

JsonScene.cppを次のように変更してみてください。

#include "JsonScene.h"

// Jsonをインクルード

#include "spine/Json.h"


// 名前空間 #define USING_NS_CC using namespace cocos2d

USING_NS_CC;


using namespace std; // String*


JsonScene::JsonScene()

{

    

}


JsonScene::~JsonScene()

{

    

}


Scene* JsonScene::createScene()

{

    // 「シーン」は自動解放オブジェクトです

    auto scene = Scene::create();

    

    // 「レイアウト」は自動解放オブジェクトです

    auto layer = JsonScene::create();

    

    // シーンに子としてレイヤーを追加

    scene->addChild(layer);

    

    // シーンを返す

    return scene;

}


// INIT」初期化

bool JsonScene::init()

{

    if ( !Layer::init() )

    {

        

        return false;

    }

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    

    Size winSize = Director::getInstance()->getVisibleSize();

    

    // バックグランドカラー(ブルー)

    auto background = LayerColor::create(Color4B::BLUE,

                                         winSize.width,

                                         winSize.height);

    this->addChild(background);

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    

    // string 文字(名前)

    auto label = Label::createWithSystemFont("JSON", "arial", 100);

    // ラベルの色:ホワイト

    label->setColor(Color3B::WHITE);

    label->setPosition(Point(winSize.width/2, winSize.height/1.1));

    // Layerにラベルを追加

    this->addChild(label);

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    

    //JSONの内容(\はエスケープ):

    //{"key1":1, "key2":123.45, "key3":"string", "key4":{"value1":100, "value2":"a"}}

    Json* json = Json_create("{\"key1\":1, \"key2\":123.45, \"key3\":\"string\", \"key4\":{\"value1\":100, \"value2\":\"a\"}}");

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // int型のパース “key1″の値、1取り出す

    //0は、"key1"が存在しなかった場合に代入される値。

    int _int = Json_getInt(json, "key1", 0);

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // float型のパース “key2″の値、123.45を取り出す

    //0は、"key2"が存在しなかった場合に代入される値。

    float _float = Json_getFloat(json, "key2", 0);

    

    // string型のパース

    //""(空)は、"key3"が存在しなかった場合に代入される値。

    std::string _string = Json_getString(json, "key3", "");

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // オブジェクト型のパース “key4″の値を取り出す

    // "key4"の中身を取り出す

    Json* j = Json_getItem(json, "key4");

    

    // "key4""value1"のパース

    int ji = Json_getInt(j, "value1", 0); //jiの値は100

    

    //"key4""value2"のパース

    std::string js = Json_getString(j, "value2", ""); //jsの値はa

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // 要素数を数える JSONの中にいくつ要素があるか

    int num = json->size;

    log("全部で%d個です", num);  //全部で4個です

    

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // key1 int型ラベル

    auto label1 = Label::createWithSystemFont("key1 int", "arial", 70);

    // ラベルの色:ホワイト

    label1->setColor(Color3B::WHITE);

    label1->setPosition(Point(winSize.width/2 - 300, winSize.height/1.3));

    // Layerにラベルを追加

    this->addChild(label1);

    

    // key1 int ラベルを作成し、初期化する。

    auto label01 = Label::createWithSystemFont(StringUtils::toString(_int),"arial", 70);

    // ラベルの色:ホワイト

    label01->setColor(Color3B::WHITE);

    label01->setPosition(Point(winSize.width/2 + 200, winSize.height/1.3));

    // Layerにラベルを追加

    this->addChild(label01);

    

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // key2 float型ラベル

    auto label2 = Label::createWithSystemFont("key2 float", "arial", 70);

    // ラベルの色:ホワイト

    label2->setColor(Color3B::WHITE);

    label2->setPosition(Point(winSize.width/2 - 300, winSize.height/1.5));

    // Layerにラベルを追加

    this->addChild(label2);

    

    

    // key2 float ラベルを作成し、初期化する。

    auto label02 = Label::createWithSystemFont

                   (StringUtils::toString(_float),"arial", 70);

    // ラベルの色:ホワイト

    label02->setColor(Color3B::WHITE);

    label02->setPosition(Point(winSize.width/2 + 200, winSize.height/1.5));

    // Layerにラベルを追加

    this->addChild(label02);

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // key3 string型ラベル

    auto label3 = Label::createWithSystemFont("key3 string", "arial", 70);

    // ラベルの色:ホワイト

    label3->setColor(Color3B::WHITE);

    label3->setPosition(Point(winSize.width/2 - 300, winSize.height/1.8));

    // Layerにラベルを追加

    this->addChild(label3);

    

    

    // key3 string ラベルを作成し、初期化する。

    auto label03 = Label::createWithSystemFont(_string, "arial", 70);

    // ラベルの色:ホワイト

    label03->setColor(Color3B::WHITE);

    label03->setPosition(Vec2(winSize.width/2 + 200, winSize.height/1.8));

    // Layerにラベルを追加

    this->addChild(label03);

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // key4 value1 ラベル

    auto label4 = Label::createWithSystemFont("key4 value1", "arial", 70);

    // ラベルの色:ホワイト

    label4->setColor(Color3B::WHITE);

    label4->setPosition(Point(winSize.width/2 - 300, winSize.height/2.3));

    // Layerにラベルを追加

    this->addChild(label4);

    

    

    // key4 オブジェクト型 "value1"のパース ラベルを作成し、初期化する。

    auto label04 = Label::createWithSystemFont(StringUtils::toString(ji),"arial", 70);

    // ラベルの色:ホワイト

    label04->setColor(Color3B::WHITE);

    label04->setPosition(Vec2(winSize.width/2 + 200, winSize.height/2.3));

    // Layerにラベルを追加

    this->addChild(label04);

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // key4 value2 ラベル

    auto label5 = Label::createWithSystemFont("key4 value2", "arial", 70);

    // ラベルの色:ホワイト

    label5->setColor(Color3B::WHITE);

    label5->setPosition(Point(winSize.width/2 - 300, winSize.height/3.0));

    // Layerにラベルを追加

    this->addChild(label5);

    

    

    // key4 オブジェクト型 "value2"のパース ラベルを作成し、初期化する。

    auto label05 = Label::createWithSystemFont(js, "arial", 70);

    // ラベルの色:ホワイト

    label05->setColor(Color3B::WHITE);

    label05->setPosition(Vec2(winSize.width/2 + 200, winSize.height/3.0));

    // Layerにラベルを追加

    this->addChild(label05);

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // 要素数 ラベル

    auto label6 = Label::createWithSystemFont("JSONの中の要素数", "arial", 70);

    // ラベルの色:ホワイト

    label6->setColor(Color3B::WHITE);

    label6->setPosition(Point(winSize.width/2 - 300, winSize.height/4.5));

    // Layerにラベルを追加

    this->addChild(label6);

    

    

    // 要素数 ラベルを作成し、初期化する。

    auto label06 = Label::createWithSystemFont(StringUtils::toString(num),"arial", 70);

    // ラベルの色:ホワイト

    label06->setColor(Color3B::WHITE);

    label06->setPosition(Vec2(winSize.width/2 + 200, winSize.height/4.5));

    // Layerにラベルを追加

    this->addChild(label06);

    

    return true;

}


GitHub Json


JSONを扱います。
JSONを扱う準備                  #include "spine/Json.h"
JSONの作成                         Json_create
int型のパース                       Json_getInt
float型のパース                    Json_getFloat、
string型のパース                  Json_getString
オブジェクト型のパース     Json_getItem
要素数を数える                    json->size

    //JSONの内容(\はエスケープ):

    //{"key1":1, "key2":123.45, "key3":"string", "key4":{"value1":100, "value2":"a"}}

    Json* json = Json_create("{\"key1\":1, \"key2\":123.45, \"key3\":\"string\", \"key4\":{\"value1\":100, \"value2\":\"a\"}}");

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // int型のパース “key1″の値、1を取り出す

    //0は、"key1"が存在しなかった場合に代入される値。

    int _int = Json_getInt(json, "key1"0);

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // float型のパース “key2″の値、123.45を取り出す

    //0は、"key2"が存在しなかった場合に代入される値。

    float _float = Json_getFloat(json, "key2"0);

    

    // string型のパース

    //""(空)は、"key3"が存在しなかった場合に代入される値。

    std::string _string = Json_getString(json, "key3""");

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // オブジェクト型のパース “key4″の値を取り出す

    // "key4"の中身を取り出す

    Json* j = Json_getItem(json, "key4");

    

    // "key4""value1"のパース

    int ji = Json_getInt(j, "value1"0); //jiの値は100

    

    //"key4""value2"のパース

    std::string js = Json_getString(j, "value2"""); //jsの値はa

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    // 要素数を数える JSONの中にいくつ要素があるか

    int num = json->size;

    log("全部で%d個です", num);  //全部で4個です

  

目 次