cococos 2 d-x CCSprite精霊傍受クリックイベント


参考記事:
cococos 2 d-x精霊傍受クリックイベント
http://labs.easymobi.cn/?p=5167
実装プロセスは、CCTouchDelegateインタフェースを実装し、enter時にリスニングを追加し、exitとプロファイル時にリスニングを削除し、クリック時にtouchの座標を相対的な精霊の座標に変換し、精霊の範囲内にあるかどうかは、クリックに応答する.主に前の2つの文章の例を参考にして、異なるところは判断エリアにあり、個人的には複雑すぎると思います.だから少し修正して、もっと理解しやすいように見えます.
PianoTile.h
class PianoTile : public cocos2d::CCSprite,public cocos2d::CCTouchDelegate
{
public:
    
    PianoTile();
    ~PianoTile();
    
    //life cycle
    virtual void onEnter();
    virtual void onExit();
    //touch
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
};

PianoTile.cpp
#include "PianoTile.h"
USING_NS_CC;

#pragma mark - Public Methods
PianoTile::~PianoTile()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    _delegate = NULL;
}

#pragma mark Lifecyle
void PianoTile::onEnter(){
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
    CCSprite::onEnter();
}

void PianoTile::onExit(){
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    CCSprite::onExit();
}

#pragma mark Touch Delegate

bool PianoTile::ccTouchBegan(CCTouch *pTouche, CCEvent *pEvent){
    CCPoint touchLocation = pTouche->getLocation();
    CCPoint localPoint = convertToNodeSpace(touchLocation);
    CCRect rect = CCRectMake(0, 0, boundingBox().size.width, boundingBox().size.height);
    bool isTouched = rect.containsPoint(localPoint);
    if (isTouched && _delegate) {
        _delegate->pianoTileClick(this);
    }
    
    return isTouched;
}

void PianoTile::ccTouchEnded(CCTouch *pTouche, CCEvent *pEvent){
    
}