2015年

2月

12日

Cocos2d-x 数値を文字に変換する

スコア表示など、intやfloatなどをstringに変換したいケースはたくさんあると思います。
Cocos2d-xではStringUtils関数群が実装されているので、これを利用すると便利です。

Cocos2dx 3.x C++言語

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

#ifndef __TextLabel__TopTextScene__

#define __TextLabel__TopTextScene__


#include "cocos2d.h"

USING_NS_CC;


class TopTextScene :public Layer

{

protected:

    // コンストラクタ

    TopTextScene();

    // デストラクタ

    virtual ~TopTextScene();

    // メソッド CREATE_FUNCとの連携

    bool init() override;

    

public:

    static cocos2d::Scene* createScene();

    

    CREATE_FUNC(TopTextScene);

};


#endif /* defined(__TextLabel__TopTextScene__) */


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

#include "TopTextScene.h"

// UI GUI

USING_NS_CC;     // cocos2d

using namespace std; // String*


// _/_/_/ コンストラクタ プロパティー _/_/_/

TopTextScene::TopTextScene()

{

    

}


// MainScene デストラクタで解放 メモリーリークを防ぐ

TopTextScene::~TopTextScene()

{

    

}


// createSceneLayerSceneに貼り付けて返すクラスメソッドです。

// 自分自身(TopTextScene)を生成し、空のSceneに貼り付けて返す簡単な処理を行っているだけです。

// これでほかのシーンからの遷移が楽に行えます。

Scene* TopTextScene::createScene()

{

    

    auto scene = Scene::create();

    auto layer = TopTextScene::create();

    scene->addChild(layer);

    

    return scene;

}


bool TopTextScene::init()

{

    if ( !Layer::init() )

    {

        return false;

    }

    

    // 画面サイズを取得

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

    // バックグランドカラー

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

                                         winSize.width,

                                         winSize.height);

    // バックグランドカラー 第2引数は表示順

    this->addChild(background, 0);

    

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

    

    // string 文字(名前)

    auto label = Label::createWithSystemFont("C++", "arial", 70);

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

    label->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label);

    

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

    

    // Label1::createWithSystemFont("文字列", "フォントの種類", 文字サイズ);

    // string型ラベル

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

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

    label1->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label1);

    

    

    // Label::createWithSystemFont("文字列", "フォントの種類", 文字サイズ);

    // string 文字

    string _string = "Cocos2d-x";

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

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

    label01->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label01);

    

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

    

    // int型ラベル

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

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

    label2->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label2);

    


    // int 数字

    int _int = 12345;

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

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

    label02->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label02);

    

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

    

    // bool型ラベル

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

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

    label3->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label3);

    

    // bool

    bool _bool = true;

    auto label03 = Label::createWithSystemFont(StringUtils::toString(_bool),"arial", 70);

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

    label03->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label03);


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

    

    // float型ラベル

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

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

    label4->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label4);

    

    // float

    float _float = 1.2345f;

    auto label04 = Label::createWithSystemFont

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

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

    label04->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label04);

    

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

    

    // double型ラベル

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

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

    label5->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label5);

    


    // double

    double _double = 1.2345;

    auto label05 = Label::createWithSystemFont

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

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

    label05->setColor(Color3B::WHITE);

    //画面の中央に表示

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

    // Layerにラベルを追加

    this->addChild(label05);

    

    // ログ表示

    log("string: %s", _string.c_str());

    log("int: %d", _int);

    log("bool: %d", _bool);

    log("float: %f", _float);

    log("double: %f", _double);

    

    return true;

}

 

GitHub TextLabel_Cocos2d-x

変数から文字列を作成する

createWithFormatメソッドを利用すれば、文字列を作成できます。
これを、使えば変数をゲーム画面上に表示させたりすることができます。

// String 型 文字をラベル表示する
auto label01 = Label::createWithSystemFont(_string, "arial", 70);
this->addChild(label01);

// int 型 数字 `toString`を使ってスコアをラベル表示する
auto label02 = Label::createWithSystemFont(StringUtils::toString(_int),"arial", 70);
this->addChild(label02);

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

auto labelStr = StringUtils::format("結果は%d点でした。", 10);
log("%s", labelStr.c_str());

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

Objective-Cでは以下のようにして利用をしてました。

    int score = 1000;
    NSString *score = [NSString stringWithFormat:@"スコア:%i",score];


これがcocos2dx Ver 3.xになるとこうなります。

#include <ui/CocosGUI.h>
USING_NS_CC;     // cocos2d
using namespace ui;
using namespace std; // String*

    int score = 1000;
    String *score = String::createWithFormat("スコア:%i",score);

    //キャスト変換
    string _score = score->getCString();

    // ラベル生成
    auto label = Label::createWithSystemFont(_score, "arial", 40);


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

// スコアをラベルの更新
ScoreLabel->setString(StringUtils::toString(score));

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

// ログ表示
log("string: %s", _string.c_str());
log("int: %d", _int);
log("bool: %d", _bool);
log("float: %f", _float);
log("double: %f", _double);

 

目 次

 

アクセスカウンター 活性酸素 アクセスカウンター