2015年

2月

05日

Cocos2d-x Ver 3.x メニューボタンの作成

Cocos2dx 3.x C++言語

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

#ifndef __Menu__MenuTopScene__

#define __Menu__MenuTopScene__


#include "cocos2d.h"


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

USING_NS_CC;


class MenuTopScene : public Layer

{

    

public:

    

    // 初期化のメソッド

    virtual bool init();

    

    static cocos2d::Scene* createScene();

    

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

    void pushStart01(Ref *pSender);

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

    void pushStart02(Ref *pSender);


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

    CREATE_FUNC(MenuTopScene);

};



#endif /* defined(__Menu__MenuTopScene__) */


※重要

public内にタッチイベント用にそれぞれスタートボタンのメソッドの宣言をする必要があります。


public:

 

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

    void pushStart01(Ref *pSender);

    

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

    void pushStart02(Ref *pSender);

 

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

#include "MenuTopScene.h"


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

USING_NS_CC;


SceneMenuTopScene::createScene()

{

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

    auto scene = Scene::create();

    

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

    auto layer = MenuTopScene::create();

    

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

    scene->addChild(layer);

    

    // シーンを返す

    return scene;

}


// INIT」初期化

bool MenuTopScene::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);

    

    // ラベルを生成

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

    

    // ラベルの設置

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

    

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

    this->addChild(label1,1);

    

    // ボタンを押した時にメソッドを呼び出す

       .h = void pushStart01(Ref *pSender); 宣言必要

    // pushStart01(メソッド)

    auto startButton01 = MenuItemImage::create(

                                    "menu-image1.png",  // 通常状態の画像

                                    "menu-image1-hover.png",  // 押下状態の画像

           CC_CALLBACK_1(MenuTopScene::pushStart01this)); // 押下時のアクション

    

    // ボタンを押した時にメソッドを呼び出す

       .h = void pushStart02(Ref *pSender); 宣言必要

    // pushStart02(メソッド)

    auto startButton02 = MenuItemImage::create(

                                    "menu-image2.png",  // 通常状態の画像

                                    "menu-image2-hover.png",  // 押下状態の画像

           CC_CALLBACK_1(MenuTopScene::pushStart02this)); // 押下時のアクション

    

    //ボタンを押した時にラムダ式(init内部記述式)を呼び出す

    auto startButton03 = MenuItemImage::

           create("menu-image3.png","menu-image3-hover.png",[(Ref*sender){

        

        CCLOG("Pushボタン03");

        

    });

    

    // ボタンの設置

    startButton01->setPosition(Point(winSize.width / 2,winSize.height /2.1));

    startButton02->setPosition(Point(winSize.width / 2,winSize.height /2.8));

    startButton03->setPosition(Point(winSize.width / 2,winSize.height /4.2));

    

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

    auto menu = Menu::create(startButton01,startButton02,startButton03,NULL);

    

    menu->setPosition(Point::ZERO);

    // メニューを追加

    this->addChild(menu, 1);

    

    return true;

}


// pushStart01ボタン

void MenuTopScene::pushStart01(Ref *pSender)

{

    CCLOG("Pushボタン01");

    

}


// pushStart02ボタン

void MenuTopScene::pushStart02(Ref *pSender)

{

    CCLOG("Pushボタン02");

    

}

 

GitHub Menu_Cocos2d-x

 

コールバック関数
Ver3.xから、マクロで登録されたコールバック関数が登場します。
使い方は、指定したメソッドを呼び出すのですが、呼び出すメソッドの引数に応じて使い分けます。

CC_CALLBACK_0
CC_CALLBACK_1
CC_CALLBACK_2

 

CC_CALLBACK_0

//引数がない
const std::function< void()> &func
 
//例
void MenuTopScener::pushStart(){
 
}

 

CC_CALLBACK_1

//引数が1つ
const std::function< void(Node *)> &func
 
//例
void MenuTopScene::pushStart01(Ref *sender){

}

 

CC_CALLBACK_2

//引数が2つ
std::function<bool(Touch*, Event*)> onTouchBegan
 
//例
void MenuTopScene::pushStart02(Touch *touch,Event *event){

}

 

各解説はソースコードのコメント文を参照してください。

出来る限り分かりやすいようにしていますのでご了承願います。

 

目 次