Lab

Cocos2d-x v3:イベントのクローンの作成

 Tag :  Published : 2014-8-26

Pocket

cloneを使用します。
イベントを複製します。

準備

スプライトをタップすると、そのスプライトのタグがログで表示されるようにしてみます。

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

    //1つめのスプライトを作成
    auto spr1 = Sprite::create("1.png");
    spr1->setPosition(Vec2(s.width/2-50, s.height/2+50));
    spr1->setTag(100);
    addChild(spr1);
    
    //2つめのスプライトを作成
    auto spr2 = Sprite::create("2.png");
    spr2->setPosition(Vec2(s.width/2+50, s.height/2-50));
    spr2->setTag(200);
    addChild(spr2);

    //イベントリスナーの作成
    auto listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);

    listener->onTouchBegan = [](Touch* touch, Event* event){
        //ターゲットのスプライト
        auto target = static_cast<Sprite*>(event->getCurrentTarget());

        //タップした位置
        Point locationInNode = target->convertToNodeSpace(touch->getLocation());
        
        //スプライトの領域
        Size s = target->getContentSize();
        Rect rect = Rect(0, 0, s.width, s.height);
        
        //タップした位置がスプライトの領域内にあるか
        if (rect.containsPoint(locationInNode))
        {
            log("Tag : %d", target->getTag());
            return true;
        }
        
        return false;
    };
    

イベントリスナーの登録

作成したイベントリスナーを登録しますが、

    //イベントリスナーの登録
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, spr1);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, spr2);
    

上記だと二重登録(?)でエラーになります。そこで複製を作ります。

    //イベントリスナーの登録
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, spr1);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), spr2);
    

これだとおっけー。イベントの使い回しができて便利です。

pageTop