CCCallFunc CCCallFuncN CCCallFuncND的區別和使用


CCCallFunc CCCallFuncN CCCallFuncND都用來創建帶有回調函數的動作,區別主要在於回調函數是否帶有參數
CCCallFunc是執行對應的回調函數,其中回調函數不可帶參數。一般使用靜態成員函數create創建實例,create聲明如下:
static CCCallFunc* create    (    CCObject *     pSelectorTarget,
SEL_CallFunc     selector
)
回調函數通過execute方法執行,CCCallFunc中的execute的實現如下:
void CCCallFunc::execute() {
    if (m_pCallFunc) {
        (m_pSelectorTarget->*m_pCallFunc)();
    }
    if (m_nScriptHandler) {
        CCScriptEngineManager::sharedManager()->getScriptEngine()->executeCallFuncActionEvent(this);
    }
}

通過(m_pSelectorTarget->*m_pCallFunc)();可以看到回調函數不包含參數




CCCallFuncN也是執行對應的回調函數,其中回調函數帶一個參數。一般使用靜態成員函數create創建實例,create聲明如下:
static CCCallFuncN* create    (    CCObject *     pSelectorTarget,
SEL_CallFuncN     selector
)
回調函數通過execute方法執行,CCCallFuncN中的execute的實現如下:
void CCCallFuncN::execute() {
    if (m_pCallFuncN) {
        (m_pSelectorTarget->*m_pCallFuncN)(m_pTarget);
    }
    if (m_nScriptHandler) {
        CCScriptEngineManager::sharedManager()->getScriptEngine()->executeCallFuncActionEvent(this, m_pTarget);
    }
}
通過(m_pSelectorTarget->*m_pCallFuncN)(m_pTarget);可以看到回調函數包含一個參數。




CCCallFuncND也是執行對應的回調函數,其中回調函數可帶兩個參數。一般使用靜態成員函數create創建實例,create聲明如下:
static CCCallFuncND* create    (    CCObject *     pSelectorTarget,
SEL_CallFuncND     selector,
void *     d
)
回調函數通過execute方法執行,CCCallFuncND中的execute的實現如下:
void CCCallFuncND::execute() {
    if (m_pCallFuncND) {
        (m_pSelectorTarget->*m_pCallFuncND)(m_pTarget, m_pData);
    }
}
通過(m_pSelectorTarget->*m_pCallFuncND)(m_pTarget, m_pData);可以看到回調函數包含兩個參數。




testCallFunc.h中代碼
class testCallFunc : public CCLayer
{
protected:
    CCSprite*    sprite1;
    CCSprite*    sprite2;
    CCSprite*    sprite3;
public:
    virtual void onEnter();


    void callback1();
    void callback2(CCNode* sender);
    void callback3(CCNode* sender, void* data);
};


testCallFunc.cpp中代碼


void testCallFunc::onEnter()
{
    //CCCallFunc的使用
    CCFiniteTimeAction*  action = CCSequence::create(
        CCMoveBy::create(2, ccp(200,0)),
        CCCallFunc::create(this, callfunc_selector(testCallFunc::callback1)),
        NULL);


    //CCCallFuncN的使用
    CCFiniteTimeAction*  action2 = CCSequence::create(
        CCScaleBy::create(2 ,  2),
        CCFadeOut::create(2),
        CCCallFuncN::create(this, callfuncN_selector(testCallFunc::callback2)),
        NULL);


    //CCCallFuncNC的使用
    CCFiniteTimeAction*  action3 = CCSequence::create(
        CCRotateBy::create(3 , 360),
        CCFadeOut::create(2),
        CCCallFuncND::create(this, callfuncND_selector(testCallFunc::callback3), (void*)0xbebabeba),
        NULL);


    sprite1->runAction(action);
    sprite2->runAction(action2);
    sprite3->runAction(action3);
}


void testCallFunc::callback1()
{
    CCSize s = CCDirector::sharedDirector()->getWinSize();
    CCLabelTTF *label = CCLabelTTF::create("callback 1 called", "Marker Felt", 16);
    label-    CCSize s = CCDirector::sharedDirector()->getWinSize();
    CCLabelTTF *label = CCLabelTTF::create("callback 3 called", "Marker Felt", 16);
    label->setPosition(ccp( s.width/4*3,s.height/2));
    addChild(label);
}>setPosition(ccp( s.width/4*1,s.height/2));


    addChild(label);
}


void testCallFunc::callback2(CCNode* pSender)
{
    CCSize s = CCDirector::sharedDirector()->getWinSize();
    CCLabelTTF *label = CCLabelTTF::create("callback 2 called", "Marker Felt", 16);
    label->setPosition(ccp( s.width/4*2,s.height/2));


    addChild(label);
}


void testCallFunc::callback3(CCNode* pTarget, void* data)
{


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com