我的Cocos2d-x学习笔记(十)定时调度器(scheduleUpdate、scheduleOnce、schedule)

前端之家收集整理的这篇文章主要介绍了我的Cocos2d-x学习笔记(十)定时调度器(scheduleUpdate、scheduleOnce、schedule)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Cocos2d-x中定时调度器一共有三种:scheduleUpdate、scheduleOnce、schedule。

定时调度器在CCNode中声明:

  1. class CC_DLL CCNode : public CCObject
  2. {
  3. public:
  4. void scheduleUpdate(void);
  5. void schedule(SEL_SCHEDULE selector,float interval,unsigned int repeat,float delay);
  6. void schedule(SEL_SCHEDULE selector,float interval);
  7. void scheduleOnce(SEL_SCHEDULE selector,float delay);
  8. void schedule(SEL_SCHEDULE selector);
  9. void unschedule(SEL_SCHEDULE selector);
  10. void unscheduleUpdate(void);
  11. virtual void update(float delta);
  12. }

定时调度器提供定时事件与定时调用服务,因为在CCNode中声明的,所以CCNode的对象都继承了定时调度器。

使用定时调度器有几个好处,借用官网的描述:

1、每当Node不再可见或已从场景中移除时,调度器会停止。

2、Cocos2d - x暂停时,调度器也会停止。当Cocos2d - x重新开始时,调度器也会自动继续启动。

3、Cocos2d - x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险。

现在解释一下之前几个函数的作用:

scheduleUpdate:开始update定时调度器,此定时器每一帧都触发,使用此定时器需要覆写CCNode中update函数

scheduleOnce:一次性定时调度器只执行一次,需要传入SEL_SCHEDULE类型回调函数与延迟时间。

schedule:自定义定时调度器,此函数有三种重载,同样需要传入SEL_SCHEDULE类型回调函数,另外两种重载参数少的schedule都依赖于参数最多的schedule。

unschedule:取消指定回调函数的定时调度器。

unscheduleUpdate:取消update定时调度器。

update:update定时调度器需要覆写的函数,参数delta表示每帧所用时间。


一、帧循环定时调度器(scheduleUpdate):

每一帧都会被调用

CCNode中定义如下:

  1. void scheduleUpdate(void);

实例:

  1. #ifndef __HELLOWORLD_SCENE_H__
  2. #define __HELLOWORLD_SCENE_H__
  3.  
  4. #include "cocos2d.h"
  5.  
  6. class HelloWorld : public cocos2d::CCLayer
  7. {
  8. public:
  9. static cocos2d::CCScene* scene();
  10. virtual bool init();
  11. CREATE_FUNC(HelloWorld);
  12. void update(float dt);
  13. };
  14.  
  15. #endif
在HelloWorld中添加update函数后,再在cpp文件中覆写update。
  1. bool HelloWorld::init()
  2. {
  3. CCLayer::init();
  4. scheduleUpdate();
  5. return true;
  6. }
  7.  
  8.  
  9. void HelloWorld::update(float dt)
  10. {
  11. CCLog("%f",dt);
  12. }
在HelloWorld的init()中启用帧循环定时调度器,并且覆写了update。

每一帧都会调用update打印出dt的值,dt为一帧执行的时间,值为0.016667左右。

二、一次性定时调度器(scheduleOnce)

启用一次性定时调度器,只执行一次该调度器的回调函数

CCNode中定义如下:

  1. void scheduleOnce(SEL_SCHEDULE selector,float delay);

首先看看该调度器用到的参数:

  1. typedef void (CCObject::*SEL_SCHEDULE)(float);
  2. #define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
当启用scheduleOnce时候,第一个参数类型为SEL_SCHEDULE,由上述代码可以知道该类型为类成员的回调函数

所以我们应该按要求给启用scheduleOnce的类添加一个参数为float的成员函数

使用选择器schedule_selector把我们的回调函数传送进scheduleOnce。

实例:

  1. bool HelloWorld::init()
  2. {
  3. CCLayer::init();
  4. scheduleOnce(schedule_selector(HelloWorld::oneCallBack),2);
  5. return true;
  6. }
  7.  
  8. void HelloWorld::oneCallBack(float dt)
  9. {
  10. CCLog("%f",dt);
  11. }
文件中仅添加了oneCallBack的声明,不再贴出来了;

一次性定时调度器启用后,第一个参数回调函数,这个函数指明了定时器启用后调用函数,第二个函数表示定时器的延迟时间。

三、自定义定时调度器(schedule)

这个定时调度器可以按我们自己的想法来进行设置,有三个重载,CCNode中定义如下:

  1. void schedule(SEL_SCHEDULE selector,float interval);
  2. void schedule(SEL_SCHEDULE selector);
其实在CCNode中实现方法都是依赖于void schedule(SEL_SCHEDULE selector,float delay),

列出代码来看看:

  1. void CCNode::schedule(SEL_SCHEDULE selector)
  2. {
  3. this->schedule(selector,0.0f,kCCRepeatForever,0.0f);
  4. }
  5.  
  6. void CCNode::schedule(SEL_SCHEDULE selector,float interval)
  7. {
  8. this->schedule(selector,interval,float delay)
  9. {
  10. CCAssert( selector,"Argument must be non-nil");
  11. CCAssert( interval >=0,"Argument must be positive");
  12.  
  13. m_pScheduler->scheduleSelector(selector,this,repeat,delay,!m_bRunning);
  14. }
由上述代码可以看出schedule一个参数与两个参数的重载内部都是调用三个参数的schedule;

使用一个参数与两个参数的schedule会自动设置一些默认值。

参数解释如下:

selector:一个类成员回调函数,用来在调度触发时候执行,类型为SEL_SCHEDULE 。

interval:时间触发的时间间隔。

repeat:触发一次事件之后,继续触发事件的次数,默认值为kCCRepeatForever,表示无限次触发。

delay:第一次触发之前的延时。

实例一:调用只有一个参数的schedule,相当于使用帧循环定时调度器scheduleUpdate

  1. bool HelloWorld::init()
  2. {
  3. CCLayer::init();
  4. schedule(schedule_selector(HelloWorld::oneCallBack));
  5. return true;
  6. }
  7.  
  8. void HelloWorld::oneCallBack(float dt)
  9. {
  10. CCLog("%f",dt);
  11. }
实例二:调用两个参数的schedule
  1. bool HelloWorld::init()
  2. {
  3. CCLayer::init();
  4. schedule(schedule_selector(HelloWorld::oneCallBack),dt);
  5. }
每隔2秒执行一次回调函数,执行无限次。

实例三:调用4个参数的schedule

  1. bool HelloWorld::init()
  2. {
  3. CCLayer::init();
  4. schedule(schedule_selector(HelloWorld::oneCallBack),2,5,3);
  5. return true;
  6. }
  7.  
  8. void HelloWorld::oneCallBack(float dt)
  9. {
  10. static int count = 0;
  11. CCLog("%f",dt);
  12. count++;
  13. }
上述代码表示3秒之后每隔2秒执行一次回调,一共执行6次。

附加:选择器

把遇到的一些选择器列举一下:

  1. typedef void (CCObject::*SEL_SCHEDULE)(float);
  2. typedef void (CCObject::*SEL_CallFunc)();
  3. typedef void (CCObject::*SEL_CallFuncN)(CCNode*);
  4. typedef void (CCObject::*SEL_CallFuncND)(CCNode*,void*);
  5. typedef void (CCObject::*SEL_CallFuncO)(CCObject*);
  6. typedef void (CCObject::*SEL_MenuHandler)(CCObject*);
  7. typedef void (CCObject::*SEL_EventHandler)(CCEvent*);
  8. typedef int (CCObject::*SEL_Compare)(CCObject*);
  9.  
  10. #define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
  11. #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)
  12. #define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR)
  13. #define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR)
  14. #define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR)
  15. #define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)
  16. #define event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR)
  17. #define compare_selector(_SELECTOR) (SEL_Compare)(&_SELECTOR)

猜你在找的Cocos2d-x相关文章