您的位置:首页 > 其它

CCCallFunc CCCallFuncN CCCallFuncND的区别和使用

2014-07-29 22:30 357 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: