Cocos2d-x 3.x タップ可能なSpriteのサブクラス

Spriteのサブクラスを作成し、EventListenerを組み込む例です。

ここを参考にしました。
http://www.cocos2d-x.org/wiki/How_To_Subclass_Sprite_And_Add_Event_Listeners

今回使用したバージョン

  • Cocos2d-x 3.1

GudeSprite.h

#include "cocos2d.h"

class GudeSprite : public cocos2d::Sprite
{
public:
    GudeSprite();
    ~GudeSprite();
    static GudeSprite* create();

    void initOptions();

    void addEvents();
    void touchEvent(cocos2d::Touch* touch);
private:

};

GudeSprite.cpp

using namespace cocos2d;

GudeSprite::GudeSprite() {}

GudeSprite::~GudeSprite() {}

GudeSprite* GudeSprite::create()
{
    GudeSprite* pSprite = new GudeSprite();

    if (pSprite->initWithSpriteFrameName("gude.png"))
    {
        pSprite->autorelease();

        pSprite->initOptions();

        pSprite->addEvents();

        return pSprite;
    }

    CC_SAFE_DELETE(pSprite);
    return NULL;
}

void GudeSprite::initOptions()
{
    // do things here like setTag(), setPosition(), any custom logic.
}

void GudeSprite::addEvents()
{
    auto listener = cocos2d::EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);

    listener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event)
    {
        cocos2d::Vec2 p = touch->getLocation();
        cocos2d::Rect rect = this->getBoundingBox();

        if(rect.containsPoint(p))
        {
            return true; // to indicate that we have consumed it.
        }

        return false; // we did not consume this event, pass thru.
    };

    listener->onTouchEnded = [=](cocos2d::Touch* touch, cocos2d::Event* event)
    {
        GudeSprite::touchEvent(touch);
    };

    cocos2d::Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
}

void GudeSprite::touchEvent(cocos2d::Touch* touch)
{
    // タップしたら消去
    this->removeFromParentAndCleanup(true);
}

タップされたら自身を消去します。
EventListener追加の部分は、ここを参考に変更しました。http://www.cocos2d-x.org/wiki/EventDispatcher_Mechanism

addEventListenerWithFixedPriorityを使う場合でNodeの削除をする場合、EventListenerを手動で削除する必要があるようです。