cocococococococos 2 dxは直接one Enterの中にいないでください.addTarget Delegate(またはaddStandard Delegate)

3873 ワード

原文のリンク:http://blog.csdn.net/zhangxaochen/article/details/8064010
 今日他の人のcococos 2 dコードを見た時、変な現象が発見されました.全体の工程にはset Touch Enbaledというコードがありませんでしたが、プログラムが走り出した時にタッチパネルのイベントに応答できます.そこで断時で追跡してみたら、m_を発見しました.bIs Touch Enbaledという変数は確かにfalseです.このlayerは一体どうやって事件に触れますか? 存在は合理的で、正孔は風が来ない.他の人に注意されて、原因はここにあると気づきました.
 virtual void onEnter(){
  CCLayer::onEnter();
  d->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
 }
 種類内にはオン・エニックス関数と書いてあり、addTarget tedDelegateはset Touch Enbaledを使わなくてもいいです.面白そうですね.setTouch Enbaledはどうやって働いているのか見なければなりません.CCLayer.cpp line:151に進むと、関数が実現されます.
/// isTouchEnabled setter
void CCLayer::setTouchEnabled(bool enabled)
{
    if (m_bIsTouchEnabled != enabled)
    {
        m_bIsTouchEnabled = enabled;
        if (m_bIsRunning)
        {
            if (enabled)
            {
                this->registerWithTouchDispatcher();
            }
            else
            {
                // have problems?
                CCDirector* pDirector = CCDirector::sharedDirector();
                pDirector->getTouchDispatcher()->removeDelegate(this);
            }
        }
    }
}
このsetTouch Enbaled関数は二つのことをします.bIs Touch Enbaled=enabled 2.if(mubIsRunning){if(enabled)this->register WithTouch Displatch();else removeDelegate(this);)ここでまずif(mubilis Running)を判断します.つまり、この関数は初期化されません.さもなくばここのregisterは一回、one Enterの中で黙認してもう一回のプログラムは問題が発生します.
では、レジスターWithTouch Displatchは何をしていますか?定義にジャンプします.
void CCLayer::registerWithTouchDispatcher()
{
    CCDirector* pDirector = CCDirector::sharedDirector();
    if (m_pScriptHandlerEntry)
    {
        if (m_pScriptHandlerEntry->isMultiTouches())
        {
            pDirector->getTouchDispatcher()->addStandardDelegate(this, 0);
            LUALOG("[LUA] Add multi-touches event handler: %d", m_pScriptHandlerEntry->getHandler());
        }
        else
        {
            pDirector->getTouchDispatcher()->addTargetedDelegate(this,
                                                                       m_pScriptHandlerEntry->getPriority(),
                                                                       m_pScriptHandlerEntry->getSwallowsTouches());
            LUALOG("[LUA] Add touch event handler: %d", m_pScriptHandlerEntry->getHandler());
        }
        return;
    }
    pDirector->getTouchDispatcher()->addStandardDelegate(this,0);
}
if(mupScript Handler Entry)を除くと、(scriptコードをコントロールするための行動のようですが、私もよく分かりません.)関数が主にすることは一言です.
pDirector->getTouchDispatcher()->addStandardDelegate(this,0);
つまり、デフォルトでは、CCLayerが登録しているのは、standar Delegateです.
筋を通して、私達のコードは1.init関数の中にset Touch Enbaled(true)を設置するべきです.2.クラス内上書き関数register WithTouch Displatchは、addStandard Delegateまたはtarget Delegateを設定します.このように、初期化時にsetTouch Enbaledを呼び出すと、まずm_を設定します.bIs Touch Enbaledはtrueで、m_のためbIsRunning==falseはまだregister WithTouch Displatchができません.そしてプログラムrunが起きて、on Enter関数を呼び出した時、ここで(CCLayer.cpp lineを見てください:233):
    if (m_bIsTouchEnabled)
    {
        this->registerWithTouchDispatcher();
    }
setTouch Enbaledがない場合、register WithTouch Displatchを上書きしないで、直接上書きしたone Enter関数です.本文の最初のように、
 virtual void onEnter(){
  CCLayer::onEnter();
  d->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
 }
どうなりますか?コードは節約できますか?できません.m_のためにbIs Touch Enbaled==falseなので、Exitの場合、CCLayer:onExit()はremoveDelegateではないので、手動でone Exit関数を上書きする必要があります.このように:
void TestLayer::onExit()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    CCLayer::onExit();
}
また、m_のためにbIs Touch Enbaled==false、ここに気づくといつも論理的に混乱します.enable touchがないという類もタッチに応えられます.人のコードを見るように憂鬱です.JBのことですか?
原文のリンク:http://blog.csdn.net/zhangxaochen/article/details/8064010
{OVER}