轉(zhuǎn)載自:
http://blog.linguofeng.com/archive/2012/09/12/cocos2d-x-touch.html
一、兩種機(jī)制的四種不同的事件
CCStandardTouchDelegate 默認(rèn)事件 |
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); |
處理按下事件 |
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); |
處理按下并移動(dòng)事件 |
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); |
處理松開(kāi)事件 |
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent); |
處理打斷事件 |
CCTargetedTouchDelegate |
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); |
處理用戶(hù)按下事件,true表示繼續(xù)處理, 否則false. |
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); |
處理按下并移動(dòng)事件 |
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); |
處理松開(kāi)事件 |
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); |
處理打斷事件 |
兩者的區(qū)別: CCSet
與 CCTouch
,一個(gè)事件集合一個(gè)單個(gè)事件。
事件分發(fā)的順序: CCTargetedTouchDelegate
→ CCStandardTouchDelegate
。
默認(rèn)情況下所有 CCLayer
都沒(méi)有啟用觸摸事件,需要 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) {
// 委托,優(yōu)先級(jí)
CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, kCCMenuTouchPriority);
// 委托,優(yōu)先級(jí),是否繼續(xù)處理
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority, true);
// 2.0版本以后
CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, kCCMenuHandlerPriority);
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority, true);
}
利用 ccTouchBegan
或 ccTouchesBegan
加以實(shí)現(xiàn)點(diǎn)擊的回調(diào)
void MyLayer::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {
// 單點(diǎn)
CCTouch *pTouch = (CCTouch*)(pTouches->anyObject());
// 所有點(diǎn)
for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++) {
CCTouch *pCurTouch = (CCTouch*)(*iterTouch);
}
// 獲取點(diǎn)在視圖中的坐標(biāo)(左上角為原點(diǎn))
CCPoint touchLocation = pTouch->getLocationInView();
// 把點(diǎn)的坐標(biāo)轉(zhuǎn)換成OpenGL坐標(biāo)(左下角為原點(diǎn))
touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation);
// 把OpenGL的坐標(biāo)轉(zhuǎn)換成CCLayer的坐標(biāo)
CCPoint local = convertToNodeSpace(touchLocation)
// 大小為100x100,坐標(biāo)為(0, 0)的矩形
CCRect * rect = CCRectMake(0, 0, 100, 100);
// 判斷該坐標(biāo)是否在rect矩形內(nèi)
bool flag = rect.containsPoint(local)
if(flag) {
// 回調(diào)
} else {
// 不執(zhí)行
}
}