cocos2d-x中關於touch事件的響應

原做者:有緣人  來源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.htmlphp

 

1、touch事件響應分爲單點觸摸響應和多點觸摸響應。html

    單點觸摸響應須要重載的方法:java

  virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);微信

  virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);網站

  virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);this

  virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);spa

    多點觸摸須要重載的方法:.net

  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);

2、單點觸摸本質上須要調用的方法,即設置touch的代理

 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-129,true);

    多點觸摸本質上須要調用的方法

 CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,-129);

因此,只要調用了以上方法,就能夠實現觸摸響應,就再也不須要調用setTouchEnabled(true);

3、setTouchEnabled的方法實現

void CCLayer::setTouchEnabled(bool enabled)
{
    if (m_bTouchEnabled != enabled)
    {
        m_bTouchEnabled = enabled;
        if (m_bRunning)
        {
            if (enabled)
            {
                this->registerWithTouchDispatcher();
            }
            else
            {
                // have problems?
                CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
            }
        }
    }
}



這段代碼最主要的一句this->registerWithTouchDispatcher();

這個方法中就是調用第二點中提到的兩個delegate添加方法。

因此,我們實現touch響應的話,須要重載 registerWithTouchDispatcher()方法,並在這個方法中添加實現

void
HelloWorld::registerWithTouchDispatcher()
{
   CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,-129);
   //CDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-129,true);
}

由此,實現touch事件響應須要作的操做:

1.重載registerWithTouchDispatcher()並實現

2.setTouchEnabled(true)

3.重載touch或者touches系列方法

4、在CCLayerregisterWithTouchDispatcher()中有關於m_eTouchMode的判斷,而且有setTouchMode()方法,參數有兩種:kCCTouchesOneByOne kCCTouchesAllAtOnce,分別表明單點觸摸和多點觸摸

touchModekCCTouchesOneByOne 時,調用的是addTargetedDelegate方法;當touchModekCCTouchesAllAtOnce時,調用的是addStandardDelegate方法

因此,「重載registerWithTouchDispatcher()並實現」能夠由setTouchMode()方法來替換

 

 

歡迎關注關東昇新浪微博@tony_ 關東昇。

關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息

更多精品iOSCocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com

智捷課堂論壇網站:http://51work6.com/forum.php

相關文章
相關標籤/搜索