参考文章:

cocos2d-x 精灵监听点击事件

http://labs.easymobi.cn/?p=5167

实现过程,实现CCTouchDelegate接口,在enter 的时候添加监听,exit 和析构时移除监听,点击时将touch 的坐标转化为相对精灵的坐标,如果是否在精灵的范围内,则响应点击。主要是参考前面两篇文章中的例子,不同的地方在判断区域,个人觉得太复杂。所以稍微修改了下,看起来更容易理解。

PianoTile.h

classPianoTile:publiccocos2d::CCSprite,publiccocos2d::CCTouchDelegate{public:PianoTile();~PianoTile();//lifecyclevirtualvoidonEnter();virtualvoidonExit();//touchvirtualboolccTouchBegan(CCTouch*pTouch,CCEvent*pEvent);virtualvoidccTouchEnded(CCTouch*pTouch,CCEvent*pEvent);};

PianoTile.cpp

#include"PianoTile.h"USING_NS_CC;#pragmamark-PublicMethodsPianoTile::~PianoTile(){CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);_delegate=NULL;}#pragmamarkLifecylevoidPianoTile::onEnter(){CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);CCSprite::onEnter();}voidPianoTile::onExit(){CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);CCSprite::onExit();}#pragmamarkTouchDelegateboolPianoTile::ccTouchBegan(CCTouch*pTouche,CCEvent*pEvent){CCPointtouchLocation=pTouche->getLocation();CCPointlocalPoint=convertToNodeSpace(touchLocation);CCRectrect=CCRectMake(0,0,boundingBox().size.width,boundingBox().size.height);boolisTouched=rect.containsPoint(localPoint);if(isTouched&&_delegate){_delegate->pianoTileClick(this);}returnisTouched;}voidPianoTile::ccTouchEnded(CCTouch*pTouche,CCEvent*pEvent){}