轉載自:http://blog.linguofeng.com/archive/2012/09/12/cocos2d-x-touch.html
一、兩種機制的四種不同的事件
| CCStandardTouchDelegate 默認事件 | |
|---|---|
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); |
處理按下事件 |
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); |
處理按下并移動事件 |
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); |
處理松開事件 |
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent); |
處理打斷事件 |
| CCTargetedTouchDelegate | |
|---|---|
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); |
處理用戶按下事件,true表示繼續處理, 否則false. |
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); |
處理按下并移動事件 |
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); |
處理松開事件 |
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); |
處理打斷事件 |
兩者的區別: CCSet 與 CCTouch ,一個事件集合一個單個事件。
事件分發的順序: CCTargetedTouchDelegate → CCStandardTouchDelegate 。
默認情況下所有 CCLayer 都沒有啟用觸摸事件,需要 this->setIsTouchEnabled(true); 啟用。
如需更改事件: void registerWithTouchDispatcher(void) {}
class MyLayer: public cocos2d:CCLayer { public: virtual void registerWithTouchDispatcher(void); // addStandardDelegate() virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent); // addTargetedDelegate() virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); } void MyLayer::registerWithTouchDispatcher(void) { // 委托,優先級 CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, kCCMenuTouchPriority); // 委托,優先級,是否繼續處理 CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority, true); // 2.0版本以后 CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, kCCMenuHandlerPriority); CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority, true); }
二、 如果實現回調函數?
利用 ccTouchBegan 或 ccTouchesBegan 加以實現點擊的回調
void MyLayer::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) { // 單點 CCTouch *pTouch = (CCTouch*)(pTouches->anyObject()); // 所有點 for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++) { CCTouch *pCurTouch = (CCTouch*)(*iterTouch); } // 獲取點在視圖中的坐標(左上角為原點) CCPoint touchLocation = pTouch->getLocationInView(); // 把點的坐標轉換成OpenGL坐標(左下角為原點) touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation); // 把OpenGL的坐標轉換成CCLayer的坐標 CCPoint local = convertToNodeSpace(touchLocation) // 大小為100x100,坐標為(0, 0)的矩形 CCRect * rect = CCRectMake(0, 0, 100, 100); // 判斷該坐標是否在rect矩形內 bool flag = rect.containsPoint(local) if(flag) { // 回調 } else { // 不執行 } }


