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を手動で削除する必要があるようです。