cocos2dx 點擊事件分析(5),cocos2dx事件

來源:互聯網
上載者:User

cocos2dx 點擊事件分析(5),cocos2dx事件

經過CCEGLViewProtocol的handleTouchesBegin,handleTouchesMove,handleTouchesEnd,handleTouchesCancel處理,都會CCTouchDispatcher中的下面這些函數,而且都會調用touches,那我們就分析一下touches這個函數void CCTouchDispatcher::touchesBegan(CCSet *touches, CCEvent *pEvent){    if (m_bDispatchEvents)    {        this->touches(touches, pEvent, CCTOUCHBEGAN);    }}void CCTouchDispatcher::touchesMoved(CCSet *touches, CCEvent *pEvent){    if (m_bDispatchEvents)    {        this->touches(touches, pEvent, CCTOUCHMOVED);    }}void CCTouchDispatcher::touchesEnded(CCSet *touches, CCEvent *pEvent){    if (m_bDispatchEvents)    {        this->touches(touches, pEvent, CCTOUCHENDED);    }}void CCTouchDispatcher::touchesCancelled(CCSet *touches, CCEvent *pEvent){    if (m_bDispatchEvents)    {        this->touches(touches, pEvent, CCTOUCHCANCELLED);    }}//// dispatch events 分發觸摸事件////CCSet *pTouches 所有觸摸點的資訊//*pEvent NULL//uIndex 觸摸類型:CCTOUCHBEGAN,CCTOUCHCANCELLED ....void CCTouchDispatcher::touches(CCSet *pTouches, CCEvent *pEvent, unsigned int uIndex){    CCAssert(uIndex >= 0 && uIndex < 4, "");    CCSet *pMutableTouches;    m_bLocked = true;    // optimization to prevent a mutable copy when it is not necessary    //判斷是否需要copy     unsigned int uTargetedHandlersCount = m_pTargetedHandlers->count();     unsigned int uStandardHandlersCount = m_pStandardHandlers->count();    bool bNeedsMutableSet = (uTargetedHandlersCount && uStandardHandlersCount);    pMutableTouches = (bNeedsMutableSet ? pTouches->mutableCopy() : pTouches);    struct ccTouchHandlerHelperData sHelper = m_sHandlerHelperData[uIndex];    //    // process the target handlers 1st    //先處理target觸摸事件    if (uTargetedHandlersCount > 0)    {        CCTouch *pTouch;        CCSetIterator setIter;//因為這裡可能同時發過來幾個手指的觸摸行為,以前分析過CCTOUCHBEGAN和CCTOUCHENDED每次只會傳遞一個//多個手指不可能同步選取,總有先後        for (setIter = pTouches->begin(); setIter != pTouches->end(); ++setIter)        {            pTouch = (CCTouch *)(*setIter);            CCTargetedTouchHandler *pHandler = NULL;            CCObject* pObj = NULL;    //遍曆所有的TargetedHandler            CCARRAY_FOREACH(m_pTargetedHandlers, pObj)            {                pHandler = (CCTargetedTouchHandler *)(pObj);                if (! pHandler)                {                   break;                }//任何一次觸摸事件都是從CCTOUCHBEGAN開始的,如何沒有begin那,後面的move,end等等就沒有意義//那麼如何表明,你對觸摸事件感興趣呢?就是在ccTouchBegan,即處理begin事件時返回true,那麼表明//控制項對這個事件感興趣,claimed(認領,宣稱的意思),如果對begin不感興趣,那麼後面的move,end等就//不發給你了。                bool bClaimed = false;                if (uIndex == CCTOUCHBEGAN)                {                    bClaimed = pHandler->getDelegate()->ccTouchBegan(pTouch, pEvent);                    if (bClaimed)                    {                        pHandler->getClaimedTouches()->addObject(pTouch);                    }                } else                if (pHandler->getClaimedTouches()->containsObject(pTouch))                {                    // moved ended canceled                    bClaimed = true;                    switch (sHelper.m_type)                    {                    case CCTOUCHMOVED:                        pHandler->getDelegate()->ccTouchMoved(pTouch, pEvent);                        break;                    case CCTOUCHENDED:                        pHandler->getDelegate()->ccTouchEnded(pTouch, pEvent);                        pHandler->getClaimedTouches()->removeObject(pTouch);                        break;                    case CCTOUCHCANCELLED:                        pHandler->getDelegate()->ccTouchCancelled(pTouch, pEvent);                        pHandler->getClaimedTouches()->removeObject(pTouch);                        break;                    }                }//m_pTargetedHandlers鏈表的優先順序從高到低,而且具有吞噬性,//即如果一個高優先順序控制項的處理了一次手指點擊的CCTOUCHBEGAN事件,而且,//這個控制項設定了Swallow,那麼低優先順序的控制項都不能處理此時觸摸事件//而且,還會把這次觸摸事件從pMutableTouches多點觸摸裡面移除。                if (bClaimed && pHandler->isSwallowsTouches())                {                    if (bNeedsMutableSet)                    {                        pMutableTouches->removeObject(pTouch);                    }                    break;                }            }        }    }    //    // process standard handlers 2nd    //標準觸摸事件,也是有優先順序,但是沒有吞噬能力。    //所有的都可以接收    if (uStandardHandlersCount > 0 && pMutableTouches->count() > 0)    {        CCStandardTouchHandler *pHandler = NULL;        CCObject* pObj = NULL;        CCARRAY_FOREACH(m_pStandardHandlers, pObj)        {            pHandler = (CCStandardTouchHandler*)(pObj);            if (! pHandler)            {                break;            }            switch (sHelper.m_type)            {            case CCTOUCHBEGAN:                pHandler->getDelegate()->ccTouchesBegan(pMutableTouches, pEvent);                break;            case CCTOUCHMOVED:                pHandler->getDelegate()->ccTouchesMoved(pMutableTouches, pEvent);                break;            case CCTOUCHENDED:                pHandler->getDelegate()->ccTouchesEnded(pMutableTouches, pEvent);                break;            case CCTOUCHCANCELLED:                pHandler->getDelegate()->ccTouchesCancelled(pMutableTouches, pEvent);                break;            }        }    }    if (bNeedsMutableSet)    {        pMutableTouches->release();    }    //    // Optimization. To prevent a [handlers copy] which is expensive    // the add/removes/quit is done after the iterations    // 對那些當時因為m_bLocked而沒有移除,增加的都加進事件處理鏈表中。    //    m_bLocked = false;    if (m_bToRemove)    {        m_bToRemove = false;        for (unsigned int i = 0; i < m_pHandlersToRemove->num; ++i)        {            forceRemoveDelegate((CCTouchDelegate*)m_pHandlersToRemove->arr[i]);        }        ccCArrayRemoveAllValues(m_pHandlersToRemove);    }    if (m_bToAdd)    {        m_bToAdd = false;        CCTouchHandler* pHandler = NULL;        CCObject* pObj = NULL;        CCARRAY_FOREACH(m_pHandlersToAdd, pObj)         {             pHandler = (CCTouchHandler*)pObj;            if (! pHandler)            {                break;            }            if (dynamic_cast<CCTargetedTouchHandler*>(pHandler) != NULL)            {                                forceAddHandler(pHandler, m_pTargetedHandlers);            }            else            {                forceAddHandler(pHandler, m_pStandardHandlers);            }         }          m_pHandlersToAdd->removeAllObjects();        }    if (m_bToQuit)    {        m_bToQuit = false;        forceRemoveAllDelegates();    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.