簡體   English   中英

CCLayer setTouchPriority無效

[英]CCLayer setTouchPriority has no effect

我創建了一個圖層,其唯一目的是阻止(“吞咽”)觸摸,並且可以打開和關閉此功能。 該類非常基礎,如果收到觸摸,它總是會吞下它:

bool BlockingLayer::init(){

    // Super init.
    if ( !CCLayer::init() )
    {
        return false;
    }

    setTouchEnabled(true);
    setTouchMode(kCCTouchesOneByOne);
    setTouchPriority(INT_MAX);

    return true;
}



bool BlockingLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    CCLOG("BlockingLayer swallowed touch!");
    return true;
}

因此,默認情況下,它的優先級確實很差,如果沒有其他類要求它,它將接收觸摸。 但是在使用此層的場景中,當某些事件發生時,我想將其設置為其他優先級:

bool MyScene::init(int unitNumber, CCString* path){
    // Super init.
    ...
    _blockingLayer = BlockingLayer::create();
    this->addChild(_blockingLayer);

    return true;
}

bool MyScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
     _blockingLayer->setTouchPriority(INT_MIN);
     ...
}

現在,該層應該具有最佳優先級,因此它應該吞下所有觸摸。 但是不會,它的行為不會改變。 我看到它的registerWithTouchDispatcher()被調用,並且m_nTouchPriority正確更改。 但是圖層的行為不變。

這是在Cocos2D-x 2.2上。 任何幫助表示贊賞。

在addTargetedDelegate()中,將第三個參數設置為true

 bool BlockingLayer::init(){

    // Super init.
    if ( !CCLayer::init() )
    {
        return false;
    }

    setTouchEnabled(true);
    setTouchMode(kCCTouchesOneByOne);
    setTouchPriority(INT_MAX);

    return true;
}

void BlockingLayer::onEnter()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, INT_MAX, true);  //<---- Param (target, touchPriority, isSwallowTouches )
    CCNode::onEnter();
}

void BlockingLayer::onExit()
{
     CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate( this );
     CCNode::onExit();
}


bool BlockingLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    CCLOG("BlockingLayer swallowed touch!");
    return true;
}

原來這是Cocos2d-x中的錯誤:

看到這個:

https://github.com/cocos2d/cocos2d-x/pull/5641

解:

在CCTouchDispatcher.cpp中更改如下:

void CCTouchDispatcher::addStandardDelegate(CCTouchDelegate *pDelegate, int nPriority)
{    
    CCTouchHandler *pHandler = CCStandardTouchHandler::handlerWithDelegate(pDelegate, nPriority);
    if (! m_bLocked)
    {
        forceAddHandler(pHandler, m_pStandardHandlers);
    }
    else
    {
        /* If pHandler is contained in m_pHandlersToRemove, if so remove it from     m_pHandlersToRemove and return.
         * Refer issue #752(cocos2d-x)
         */
         if (ccCArrayContainsValue(m_pHandlersToRemove, pDelegate))
         {
             ccCArrayRemoveValue(m_pHandlersToRemove, pDelegate);
             return;
          }

        m_pHandlersToAdd->addObject(pHandler);
        m_bToAdd = true;
    }
}

void CCTouchDispatcher::addTargetedDelegate(CCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches)
{    
    CCTouchHandler *pHandler = CCTargetedTouchHandler::handlerWithDelegate(pDelegate, nPriority, bSwallowsTouches);
    if (! m_bLocked)
    {
        forceAddHandler(pHandler, m_pTargetedHandlers);
    }
    else
    {
        /* If pHandler is contained in m_pHandlersToRemove, if so remove it from m_pHandlersToRemove and return.
         * Refer issue #752(cocos2d-x)
         */
         if (ccCArrayContainsValue(m_pHandlersToRemove, pDelegate))
          {
              ccCArrayRemoveValue(m_pHandlersToRemove, pDelegate);
              return;
          }

        m_pHandlersToAdd->addObject(pHandler);
        m_bToAdd = true;
    }
}

對此:

void CCTouchDispatcher::addStandardDelegate(CCTouchDelegate *pDelegate, int nPriority)
{    
    CCTouchHandler *pHandler = CCStandardTouchHandler::handlerWithDelegate(pDelegate, nPriority);
    if (! m_bLocked)
    {
        forceAddHandler(pHandler, m_pStandardHandlers);
    }
    else
    {
        /* If pHandler is contained in m_pHandlersToRemove, if so remove it from m_pHandlersToRemove and return.
         * Refer issue #752(cocos2d-x)
         */
        if (ccCArrayContainsValue(m_pHandlersToRemove, pDelegate))
        {
            CCTouchHandler *pOldHandler = findHandler(pDelegate);
            if (pOldHandler && pOldHandler->getPriority() == nPriority)
            {
                ccCArrayRemoveValue(m_pHandlersToRemove, pDelegate);
                return;
            }
        }

        m_pHandlersToAdd->addObject(pHandler);
        m_bToAdd = true;
    }
}

void CCTouchDispatcher::addTargetedDelegate(CCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches)
{    
    CCTouchHandler *pHandler = CCTargetedTouchHandler::handlerWithDelegate(pDelegate, nPriority, bSwallowsTouches);
    if (! m_bLocked)
    {
        forceAddHandler(pHandler, m_pTargetedHandlers);
    }
    else
    {
        /* If pHandler is contained in m_pHandlersToRemove, if so remove it from m_pHandlersToRemove and return.
         * Refer issue #752(cocos2d-x)
         */
        if (ccCArrayContainsValue(m_pHandlersToRemove, pDelegate))
        {
            CCTouchHandler *pOldHandler = findHandler(pDelegate);
            if (pOldHandler && pOldHandler->getPriority() == nPriority)
            {
                ccCArrayRemoveValue(m_pHandlersToRemove, pDelegate);
                return;
            }
        }

        m_pHandlersToAdd->addObject(pHandler);
        m_bToAdd = true;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM