CCCallFunc CCCallFuncN CCCallFuncND的区别和使用

CCCallFunc系列动作包括:

CCCallFunc:

CCCallFuncN:

CCCallFuncND:

CCCallFuncO:

四个动作,用来在动作方法中进行方法的调用(之所以不是函数调用,是因为它们只能调用某个类中的实例方法,而不是调用普通的C函数)。

当某个对象执行CCCallFunc系列动作时,就会调用一个先前被设置好的方法,以完成某些特别的功能。

CCCallFunc系列动作的4个类中,CCCallFunc调用的方法不包含参数,CCCallFuncN调用的方法包含一个CCNode*类型的参数,表示执行动作的对象。

CCCallFuncND调用的方法包含两个参数,不仅有一个节点参数,还有一个自定义参数(CCNode*void*)。

        CCCallFuncO调用的方法则包含一个CCObject*类型的参数。


实际上,CCCallFunc系列动作的后缀 

       “N” 表示Node参数,指的是执行动作的对象,

       “D” 表示Data参数,指的是用户自定义的数据,

“O”表示Object,指的是一个用户自定义的CCObject参数。


在不同情况下,我们可以根据不同的需求来选择不同的CCCallFunc动作

=========================================================

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值