2015年

2月

05日

Cocos2d-x Ver 3.x C++ ボタンを押して文字を変更する

Cocos2dx 3.x C++言語

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

TopButtonScene.h

 

#ifndef __ButtonScene__TopButtonScene__

#define __ButtonScene__TopButtonScene__


#include "cocos2d.h"


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

USING_NS_CC;


class TopButtonScene : public Layer

{

    

public:

    

    // 初期化のメソッド

    virtual bool init();

    

    

    static cocos2d::Scene* createScene();

    

    // スタートボタン押下時の処理宣言 戻る Object → Ref に変更

    void pushStart(Ref *pSender);

    

    // iOSで言えば グローバル ラベル 重要箇所

    Label* label1;

    

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

    CREATE_FUNC(TopButtonScene);

};



#endif /* defined(__Label__TopButtonScene__) */


 

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

#include "TopButtonScene.h"

//音をならすためにinclude

#include "SimpleAudioEngine.h"


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

USING_NS_CC;


Scene* TopButtonScene::createScene()

{

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

    auto scene = Scene::create();

    

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

    auto layer = TopButtonScene::create();

    

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

    scene->addChild(layer);

    

    // シーンを返す

    return scene;

}



// INIT」初期化

bool TopButtonScene::init()

{

    if ( !Layer::init() )

    {

        return false;

    }

    

    // 画面の座標関係の詳しい説明はここ

       http://www.cocos2d-x.org/wiki/Coordinate_System

    // 画面サイズを取得

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

    

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

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

                                         winSize.width,

                                         winSize.height);

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

    this->addChild(background, 0);

    

    // ラベルを生成

    label1 = Label::createWithSystemFont("Cocos2d-x", "Arial", 120);


    // ラベルの設置

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

    

    // ラベルタイトルを追加

    this->addChild(label1,1);

    

    // スタートボタンを設置

    auto startButton = MenuItemImage::create(

                        "CloseNormal01.png",  // 通常状態の画像

                        "CloseSelected01.png",  // 押下状態の画像

         CC_CALLBACK_1(TopButtonScene::pushStartthis)); // 押下時のアクション

    // ボタンの設置

    startButton->setPosition(Point(winSize.width /2 ,winSize.height/2.7));

    

    // メニューを作成 自動解放オブジェクト

    auto menu = Menu::create(startButton, NULL);

    //

    menu->setPosition(Point::ZERO);

    // メニューを追加

    this->addChild(menu, 1);

    

    return true;

}


// pushStartボタン

void TopButtonScene::pushStart(Ref *pSender)

{

    CCLOG("Pushボタン");

    

    // 効果音を鳴らす

    CocosDenshion::SimpleAudioEngine::

                   getInstance()->playEffect("onepoint26.mp3");

    

    // ラベルの文字変更

    label1->setString("Hello Cocos2d-x");


}


※重要


EXC_BAD_ACCESSになった箇所!
アクセスしようとしたデータが既に解放されちゃっているというエラー。

ラベルを「auto label1」にメソッドにてラベルの文字変更をするとEXC_BAD_ACCESSになり落ちてしました。解決策はスタック・オーバーフローにて調べると同じ質問が出ていて「auto」を外すとこの現象は解決することでした。結果は落ちずに動作しています。

ARC (Automatic Reference Counting)を積んでいないのでやはり落ちることに気を配らないといけないと身にしみて感じました。早くARC (Automatic Reference Counting)対応にしてもらいたいですね。


// ラベルを生成

❌ auto label1 = Label::createWithSystemFont("Cocos2d-x", "Arial", 120);


⭕️ label1 = Label::createWithSystemFont("Cocos2d-x", "Arial", 120);


// pushStartボタン

void TopButtonScene::pushStart(Ref *pSender)

{


// ラベルの文字変更

label1->setString("Hello Cocos2d-x");


}


スタック・オーバーフロー
ja.stackoverflow.com/
スタック・オーバーフロー は、プログラマーとプログラミングに熱心の人 の質問と回答のサイトです。100% 無料で、登録不要です。 2 分間のツアーに参加する. 次のような仕組みになっています: どなたでも質問していただけます; どなたでも回答していただけます。


プログラムをビルド&実行し表示ボタンを押すと画面に「Hello Cocos2d-x」が表示されると思います。

  

目 次