cocos2d-x开发 关于定时器----schedule(帧回调)

定时事件是游戏中必不可少的元素,cocos2d-x提供了比较完善的定时器功能,可以满足我们的很多需求

首先,先介绍一下schedule,我们可以简单的认为他是定时器,是单线程的定时器

下面开始我们的正文介绍 

------------------------------------------------------------------------------

1:scheduleUpdate 和update 

先上代码

首先在头文件里定义update(float t)这个函数

然后再.cpp里实现 ,在init()里调用这个函数 ------------- this->scheduleUpdate()    主要,这里不需要带参数

最后在 Init() 外 实现这个函数

         void HelloWorld::update(float t){
 CCLOG("update1");
 CCLOG("update2");
}

运行后会发现,会一直打印  update1 update2   

所以,其实scheduleUpdate()这个函数就是帧回调函数,因为我们的屏幕一直刷新,所以就会一直打印,一直到程序结束

-----------------------------------------------------------

2:上面的Update()函数,你也可以理解为是系统自带的帧回调函数,我们也可以自定义帧回调函数,舍弃系统函数

       在.里 加入自定义函数      void MutUpdate(float fDelta);

     然后,在.cpp里实现我们的函数(init()外)

void HelloWorld::MutUpdate(float fDelta){
 CCLOG("mutUpdate");

}    

     当然,我们要调用这个函数,这里是重点

       /**指定每帧执行自定义的函数*/
 this->schedule(schedule_selector(HelloWorld::MutUpdate));

这样呢,我们就会调用我们自定义的回调函数,系统会一直打印   mutUpdate

-----------------------------------------------------------------

3:上面说了我们自定义的回调函数,但严格意义上,不能称之为定时器,显然,定时器的时间都是一定的,即每经历多少时间回调此函数,所以,我们可以对上述函数加以完善

头文件不变,.cpp里对原语句进行修改,在后面加上一定时间

/**指定每帧执行自定义的函数,指定每隔N秒执行一次*/
 this->schedule(schedule_selector(HelloWorld::MutUpdate),3.0f);//3.0f是我们的回调时间

然后,在函数实现里打印时间

CCLOG("MutUpdate fDelta = %f",fDelta);

(float fDelta是MutUpdate 离上一次被调用的时间间隔

----------------------------------------------------------------

4:cocos2d-x在指定回调函数时都使用*selector的形式,比如我们要知道schedule的回调函数,则使用schedule_selector,要指定按钮的回调函数则使用callfunc_selector

常用的selector如下:

  schedule_selector :常用语定时器回调函数,函数无参数

  callfunc_selector: 常用于定义动作回调函数,函数无参数

  callfuncN_selector:常用于定义动作回调函数,函数带一个CCNode*参数

  callfuncND_selector:常用于定义动作回调函数,函数带一个CCNode*参数和一个void* 参数(任意类型)

  menu_selector:常用于地工艺菜单回调函数,带一个CCObject*参数

再发一个小的Demo

HelloWorld.h

  void menuCloseCallback(cocos2d::Ref* pSender);

HelloWorld.cpp

init()里面

auto menuItem = MenuItemFont::create("A",this,menu_selector(HelloWorld::menuCloseCallback));
 menuItem->setPosition(Vec2(480,320));
 auto menu = Menu::create(menuItem,NULL);
 menu->setPosition(Vec2(0,0));
 this->addChild(menu);

init()外实现我们的函数

void HelloWorld::menuCloseCallback(cocos2d::Ref* pSender){
  auto sprite = Sprite::create("Circle.png");
  sprite->setPosition(Vec2(480,320));
  this->addChild(sprite);

 }

展示效果:

点击A后,

这个呢,就是一个关于菜单回调函数。

-----------------------------------------------------------

5:unSchedule 取消update函数调用

取消函数调用,不是不调用,而是调用一次

前面都说的,是如何调用回调,自然,也得有取消回调函数...........

只需要一句代码 

              在我们的update函数实现里加上语句话 this->unscheduleUpdate();

其实,所有的东西都是相对的,有开就有关,有执行就得有停止,所以取消和注册update函数的调用是相对的,但要记住,取消函数里也是不要参数的。

             也许会问,这是系统的update()函数,那么我们自定义的回调应该怎么办?

 其实,这和系统的update()函数关闭时一致的,如何注册,就如何取消,记住,千万别带参数

void HelloWorld::MutUpdate(float fDelta){
 //CCLOG("mutUpdate");
 CCLOG("MutUpdate fDelta = %f",fDelta);
 this->unschedule(schedule_selector(HelloWorld::MutUpdate));//////

}

所有的停止回调,都是这种方法

---------------------------------------------------------------------------------------------------------

6:scheduleOnce 和回调 函数

我们平时写程序的时候,并不是所有的函数都要一直执行下去,其实说白了,就是希望我们只执行它一次,除了上面我们提到的,加一个取消命令外,我们其实可以直接建立一个只执行一次的回调

上代码-----------------------

首先,在原来的代码里加上一个函数

helloWorld.h

   void callback(float t);

HelloWorld.cpp

init()函数里面回调:this->scheduleOnce(schedule_selector(HelloWorld::callback),3.0f);

init()函数外面实现:void HelloWorld::callback(float t){
   log("1234");
}

 上面的代码里,我们通过this->scheduleOnce来实现调用,调用函数是callback, 后面的3.0f 是延迟时间,即多少秒后执行,显而易见,Once 就是调用一次,下面看效果图

                  
程序运行三秒后,出现圆环,并且打印数字1234
          

好了,这篇关于schedule回调函数就先讲到这里,以后我会陆续更新事件回调函数,请留意博客动态
有什么问题或者疑问,可以留言或者qq联系:3031260489


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值