转载标明出处:http://blog.csdn.net/notbaron/article/details/38390949
上篇回顾
上篇中,蛤蟆学习了如何让精灵沿着曲线运动。其中的曲线主要是基数样条曲线,CatmullRom曲线和贝塞尔曲线。当然其中还有很多的几何学及数学知识蛤蟆没有深入到。毕竟现在蛤蟆只是学习基本入门哈。
这次我们学习比较常用及有作用的CallFunc类。
理论介绍
CallFunc类是继承于ActionInstant的,表示是瞬时执行的动作。对,没做这是个动作。是个函数动作嘛。
下面我们看看如何使用吧。
具体步骤
我们还是使用HelloWolrd项目。
在HelloWorld.h头文件中加入如下声明:
void HelloWorld::callback1();
void HelloWorld::callback2(Node* sender);
void HelloWorld::callback3(Node* sender,longdata);
然后在
bool HelloWorld::init()函数中加入代码:
代码如下:
auto grossini =Sprite::create("grossini.png");
addChild(grossini,0, 2);
grossini->setPosition(Vec2( 50+origin.x, visibleSize.height/2 + origin.y));
auto action =Sequence::create(
Place::create(Vec2(200,200)),
Show::create(),
MoveBy::create(1, Vec2(100,0)),
CallFunc::create( CC_CALLBACK_0(HelloWorld::callback1,this)),
CallFunc::create( CC_CALLBACK_0(HelloWorld::callback2,this,grossini)),
CallFunc::create( CC_CALLBACK_0(HelloWorld::callback3,this,grossini,0xbebabeba)),
nullptr);
grossini->runAction(action);
再在HelloWorld.cpp文件中,加入如下函数定义:
void HelloWorld::callback1()
{
auto s = Director::getInstance()->getWinSize();
auto label =Label::createWithTTF("callback 1 called","fonts/MarkerFelt.ttf", 26.0f);
label->setPosition(Vec2(s.width/4*1,s.height/2));
addChild(label);
}
void HelloWorld::callback2(Node*sender)
{
auto s = Director::getInstance()->getWinSize();
auto label =Label::createWithTTF("callback 2 called","fonts/MarkerFelt.ttf", 26.0f);
label->setPosition(Vec2(s.width/4*2,s.height/2));
addChild(label);
}
void HelloWorld::callback3(Node*sender,long data)
{
auto s = Director::getInstance()->getWinSize();
auto label =Label::createWithTTF("callback 3 called","fonts/MarkerFelt.ttf", 26.0f);
label->setPosition(Vec2(s.width/4*3,s.height/2));
addChild(label);
}
编译运行后如下图 2
代码解释
OK,现在蛤蟆来解释下代码:
首先我们来看下bool HelloWorld::init()函数中加入代码:
auto grossini =Sprite::create("grossini.png");//创建一个精灵
addChild(grossini,0, 2);//增加精灵到层中
grossini->setPosition(Vec2( 50+origin.x, visibleSize.height/2 + origin.y));//设置精灵位置
auto action =Sequence::create(
Place::create(Vec2(200,200)),
Show::create(),
MoveBy::create(1, Vec2(100,0)),
CallFunc::create( CC_CALLBACK_0(HelloWorld::callback1,this)),
CallFunc::create( CC_CALLBACK_0(HelloWorld::callback2,this,grossini)),
CallFunc::create( CC_CALLBACK_0(HelloWorld::callback3,this,grossini,0xbebabeba)),
nullptr);//定义动作,加入了3个CallFunc动作,该三个动作分别调用函数callback1,callback2,callback3。
grossini->runAction(action);//运行动作。
回调函数我们只看一个即可,其他类似
void HelloWorld::callback1() //定义函数callback1,该函数会在MoveBy动作做完后被调用。
{
auto s = Director::getInstance()->getWinSize();//获取窗口大小
auto label =Label::createWithTTF("callback 1 called","fonts/MarkerFelt.ttf", 26.0f);//创建一个LABEL
label->setPosition(Vec2(s.width/4*1,s.height/2));//设置LABEL位置
addChild(label);//添加到层中
}
进阶
蛤蟆想了想,这篇还是再加一点东西吧。不然略显单薄啊,对不起人民群众,主要是还没到24:00点(哈哈)。
考虑到 CC_CALLBACK_0 函数,这个除了自己这个外,还有3个弟弟,如下。
#defineCC_CALLBACK_0(__selector__,__target__, ...)std::bind(&__selector__,__target__, ##__VA_ARGS__)
#defineCC_CALLBACK_1(__selector__,__target__, ...)std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#defineCC_CALLBACK_2(__selector__,__target__, ...)std::bind(&__selector__,__target__, std::placeholders::_1,std::placeholders::_2, ##__VA_ARGS__)
#defineCC_CALLBACK_3(__selector__,__target__, ...)std::bind(&__selector__,__target__, std::placeholders::_1,std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)
这些在文件在ccMarcos.h文件中,该文件在 “项目路径\cocos2d\cocos\base”中。
这四兄弟的主要区别是最后一个数字不一样,从0-3。这个并不表示参数的个数,正如我们示例所用。后续蛤蟆会单独列个笔记来学习这个CC_CALLBACK函数。
总结
本次,蛤蟆学习记录了CallFunc函数动作。主要是详细介绍了CC_CALLBACK_0的函数动作使用。以后小伙伴们看到他们不需要害怕了,大不了我们再到源码里溜一溜嘛。当然本次没有详细介绍他的3个亲兄弟的使用。后续蛤蟆会学习下并补上。