在cocos2d-x中, touch事件分爲兩種:一種是單點事件, 另外一種是多點事件。html
單點事件對應的代理方法是:this
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); // optional virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
單擊事件中touchBegan方法返回一個bool值, 若是爲false, 則touchMoved, touchEnded, touchCancelled方法都將不會執行, 由於表示所在類不處理單擊事件。spa
多點觸屏對應的代理方法:代理
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);
多點觸屏方法中傳遞參數再也不是一個具體的touch對象, 而是集合。htm
那麼CCLayer的觸屏事件處理方法是這樣的, 由於CCLayer繼承於CCTouchDelegate, 這是個基類, 子類還有CCTargetedTouchDelegate(單點觸屏), CCStandardTouchDelegate(多點觸屏)。因此CCLayer是能夠簡單來處理觸摸事件的。對象
一、開啓觸摸功能blog
setTouchEnabled(true);
二、設置觸摸的類型, CCLayer默認是設置爲多點觸摸。繼承
setTouchMode(kCCTouchesAllAtOnce);//多點觸摸 setTouchMode(kCCTouchesOneByOne);//單點觸摸
三、接下來就是對應覆蓋上面的方法了, 方法裏面作觸摸處理就能夠了。事件
這是比較簡單的處理, 若是你想優先處理本身的觸摸事件, 那麼你就覆蓋CCLayer的一個方法, 好比rem
void TestLayer::registerWithTouchDispatcher() { CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher(); if( m_eTouchMode == kCCTouchesAllAtOnce ) { pDispatcher->addStandardDelegate(this, 0); } else { pDispatcher->addTargetedDelegate(this, 0, true); } }
add方法的第二個參數就是優先級, 你能夠把你的優先級設置的較高一個。
若是是精靈處理觸摸事件, 相對來講代碼多一些, 由於CCSprite類是沒有繼承於CCTouchDelegate或者其子類, 而是由咱們本身去繼承。
下面是一個例子, 去掉了其餘不相關的代碼, 只保留觸摸相關代碼。
//TestSprite.h class TestSprite : public CCSprite, public CCTargetedTouchDelegate { public: virtual void onEnter(); virtual void onExit(); virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); };
//TestSprite.cpp void TestSprite::onEnter() { CCSprite::onEnter(); // add targeted delegate CCTouchDispatcher* dispatcher = CCDirector::sharedDirector()->getTouchDispatcher(); dispatcher->addTargetedDelegate(this, 0, true); } void TestSprite::onExit() { // remove targeted delegate CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher(); pDispatcher->removeDelegate(this); CCSprite::onExit(); } bool TestSprite::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { //do something... return false; }
首先, 咱們本身定義的精靈類須要繼承於CCTouchDelegate或者其子類, 其次在onEnter和onExit方法中把本身的類加入和移除觸摸分發管理類中, 這個添加和移除必須對應着, 而後覆蓋觸摸處理方法就能夠了。上面的例子是處理單點觸摸的, 多點觸摸相似, 不贅述了。
在處理CCLayer的觸摸的時候咱們並無手動移除delegate, 那是由於CCLayer幫咱們作了這個事情。
cocos2d-x中的觸摸處理方法就寫到這裏, 歡迎拍磚!
注: 本文由嘯寒原著,請支持原著!轉載請附上原文連接: http://www.cnblogs.com/xiaohan-wu/p/3187994.html