cocos2d-x中處理touch事件

在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

相關文章
相關標籤/搜索