libro
www.tuyano.com
初心者のためのCocos2d-xゲームプログラミング入門

タッチイベントを利用しよう! (4/6)

作成:2015-06-13 10:50
更新:2015-06-13 10:50

■マクロを使った組み込み方法

では、実際に簡単なサンプルを作ってみましょう。まずは、下のリストを見て下さい。

これは、先ほどの非推奨方式で作ったものを、そのまま新方式に書きなおしたものです。行っていることは基本的に同じですから比べてみるといいでしょう。

先ほど、簡単にイベント処理組み込みの流れを説明しましたが、肝心の部分である「関数を、いかにしてプロパティに設定するか」については触れていませんせした。これは、こんな具合に行っていることがわかりますね。
listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);

CC_CALLBACK_2というのは、関数をプロパティに設定するためのマクロです。関数を値として扱いたいような場合、Cocos2d-xでは以下のような専用マクロを利用することができます。
CC_CALLBACK_0
CC_CALLBACK_1
CC_CALLBACK_2
CC_CALLBACK_3

似たような名前ですね。違いは最後の番号だけです。この番号は、「引数の数」を示します。これらのマクロの後には、指定する関数とthisが引数として指定されています。

例えば、サンプルではイベント処理用にこんな関数が用意されていましたね。
HelloWorld::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);

引数は2つ、TouchEventというオブジェクトです。これをonTouchBeganに設定するのに、引数2つ用のマクロであるCC_CALLBACK_2が使われていた、というわけです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

#pragma execution_character_set("utf-8")

#include "HelloWorldScene.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}

bool HelloWorld::init()
{
    if (!Layer::init())
    {
        return false;
    }
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
    Director::getInstance()->setDisplayStats(false); // stats OFF
    count = 0;

    label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 96);
    label->setPosition(Vec2(origin.x + 50, origin.y + 50));
    label->setAnchorPoint(Vec2(0, 0));
    this->addChild(label, 1);

    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
    this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

    return true;
}

bool HelloWorld::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event)
{
    auto str = String::create("No, ");
    str->appendWithFormat("%i", count++);
    label->setString(str->getCString());
    return true;
}
※関連コンテンツ

「初心者のためのCocos2d-xゲームプログラミング入門」に戻る