在CCCallFunc系列动作的4个类中,CCCallFunc调用的方法不包含参数,CCCallFuncN调用的方法包含一个CCNode*类型的参数,表示执行动作的对象。CCCallFuncND调用的方法包含两个参数,不仅有一个节点参数,还有一个自定义参数(CCNode*与void*)。CCCallFuncO调用的方法则只包含一个CCObject*类型的参数。
实际上,CCCallFunc系列动作的后缀"N"表示Node参数,指的是执行动作的对象,"D"表示Data参数,指的是用户自定义的数据,"O"表示对象,指的是一个用户自定义的CCObject参数。在不同的情况下,我们可以根据不同的需求来选择不同的CCCallFunc动作。
#include
"HelloWorldScene.h"
02.
#include
"SimpleAudioEngine.h"
03.
04.
using namespace cocos2d;
05.
using namespace CocosDenshion;
06.
07.
CCScene* HelloWorld::scene()
08.
{
09.
CCScene *scene = CCScene::create();
10.
HelloWorld *layer = HelloWorld::create();
11.
scene->addChild(layer);
12.
return
scene;
13.
}
14.
bool HelloWorld::init()
15.
{
16.
if
( !CCLayer::init() )
17.
{
18.
return
false
;
19.
}
20.
CCSize size = CCDirector::sharedDirector()->getWinSize();
21.
22.
//CCCallFunc 调用的方法不包含参
23.
CCSprite* callFuncSp = CCSprite::create(
"Icon.png"
);
24.
callFuncSp->setPosition(ccp(size.width/
4
, size.height*
0.5
));
25.
this
->addChild(callFuncSp);
26.
callFuncSp->runAction(CCCallFunc::create(
this
, callfunc_selector(HelloWorld::callback1)));
27.
28.
//CCCallFuncN 调用的方法包含一个CCNode*类型的参数,表示执行动作的对象。
29.
CCSprite* callFuncNSp = CCSprite::create(
"Icon.png"
);
30.
callFuncNSp->setPosition(ccp(size.width/
2
, size.height*
0.5
));
31.
this
->addChild(callFuncNSp);
32.
callFuncNSp->runAction(CCCallFuncN::create(
this
, callfuncN_selector(HelloWorld::callback2)));
33.
34.
//CCCallFuncND,回调,ND表示CCNode和Data,可以传递对象本身和一个void*类型参数,void*表示可以是任意类型的参数
35.
CCLabelTTF* title = CCLabelTTF::create(
"void* 要传的参数"
,
"Marker Felt"
,
16
);
//自定义一个CCLabelTTF
36.
title->setPosition(ccp(size.width/
4
*
3
, size.height*
0.6
));
37.
this
->addChild(title);
38.
39.
CCSprite* callFuncNDSp = CCSprite::create(
"Icon.png"
);
40.
callFuncNDSp->setPosition(ccp(size.width/
4
*
3
, size.height*
0.5
));
41.
this
->addChild(callFuncNDSp);
42.
callFuncNDSp->runAction(CCCallFuncND::create(
this
, callfuncND_selector(HelloWorld::callback3), (
void
*)title));
43.
44.
45.
return
true
;
46.
}
47.
48.
void
HelloWorld::callback1()
49.
{
50.
CCSize s = CCDirector::sharedDirector()->getWinSize();
51.
CCLabelTTF *label = CCLabelTTF::create(
"callback 1 called"
,
"Marker Felt"
,
16
);
52.
label->setPosition(ccp( s.width/
4
*
1
,s.height/
3
));
53.
addChild(label);
54.
}
55.
56.
//CCNode* sender为运行动作的它本身也就是CCSprite* callFuncNSp
57.
void
HelloWorld::callback2(CCNode* sender)
58.
{
59.
CCSize s = CCDirector::sharedDirector()->getWinSize();
60.
CCLabelTTF *label = CCLabelTTF::create(
"callback 2 called"
,
"Marker Felt"
,
16
);
61.
label->setPosition(ccp( s.width/
4
*
2
,s.height/
3
));
62.
addChild(label);
63.
64.
//自身做顺时针旋转动作
65.
sender->runAction(CCRepeatForever::create(CCRotateBy::create(
1
,
360
)));
66.
}
67.
68.
//CCNode* sender也就是CCSprite* callFuncNDSp. void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。
69.
void
HelloWorld::callback3(CCNode* sender,
void
* data)
70.
{
71.
CCSize s = CCDirector::sharedDirector()->getWinSize();
72.
CCLabelTTF *label = CCLabelTTF::create(
"callback 3 called"
,
"Marker Felt"
,
16
);
73.
label->setPosition(ccp( s.width/
4
*
3
,s.height/
3
));
74.
addChild(label);
75.
76.
//自身做逆时针旋转动作
77.
sender->runAction(CCRepeatForever::create(CCRotateBy::create(
1
, -
360
)));
78.
79.
//void* data也就是CCLabelTTF* title
80.
CCLabelTTF* title = (CCLabelTTF*)data;
81.
title->runAction(CCRepeatForever::create(CCJumpBy::create(
1
, ccp(
0
,
0
),
30
,
2
)));