瘸腿蛤蟆笔记15-cocos2d-x-3.2 CallFunc函数动作使用

转载标明出处:http://blog.csdn.net/notbaron/article/details/38390949

上篇回顾

         上篇中,蛤蟆学习了如何让精灵沿着曲线运动。其中的曲线主要是基数样条曲线,CatmullRom曲线和贝塞尔曲线。当然其中还有很多的几何学及数学知识蛤蟆没有深入到。毕竟现在蛤蟆只是学习基本入门哈。

         这次我们学习比较常用及有作用的CallFunc类。

 

理论介绍

         CallFunc类是继承于ActionInstant的,表示是瞬时执行的动作。对,没做这是个动作。是个函数动作嘛。

瘸腿蛤蟆笔记15-cocos2d-x-3.2 CallFunc函数动作使用_第1张图片

         下面我们看看如何使用吧。

 

 

具体步骤

         我们还是使用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

瘸腿蛤蟆笔记15-cocos2d-x-3.2 CallFunc函数动作使用_第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个亲兄弟的使用。后续蛤蟆会学习下并补上。

你可能感兴趣的:(瘸腿蛤蟆笔记15-cocos2d-x-3.2 CallFunc函数动作使用)