COCOS学习笔记--schedule定时器

来源:互联网 发布:在哪里可以买淘宝号 编辑:程序博客网 时间:2024/06/06 02:30

这篇博客介绍下Cocos2d-x的定时器。


一.首先问一个问题,什么是定时器?定时器是干什么用的?

简单来说,如果你想不断去执行某个函数,或者每隔一段时间去执行一次某函数,甚至只执行一次,这时,我们就会用到定时器。比如在游戏开发中每隔一段时间要刷新一些数据,或者要随时间的变化而做一些逻辑判断时,就常常用到定时器。

定时器就是指定时间间隔调用指定的函数,去完成特定的功能

Cocos2d-x定时器为游戏提供定时事件和定时调用服务。所有的Node对象都知道如何调度和取消调度对象,所以也有人管定时器叫调度器。


二.使用定时器有以下几个好处:

1.每当Node不再可见或已从场景中移除时,定时器会停止。Cocos2d-x暂停时,定时器也会停止,比如Node被删除或setVisible(false)时与其绑定的定时器会被停止,使用Director的Pause()方法暂停游戏时定时器也会被停止掉;

2.当Cocos2d-x重新开始时,定时器也会自动继续启动,如执行Director的Resume()方法时;

3.Cocos2d-x封装了一个供各种不同平台使用的定时器,就是说cocos的定时器是跨平台的。


三.Cocos2d-x调度器分3

默认调度器:scheduleUpdate()

自定义调度器:schedule()

单次调度器:scheduleOnce()


四.下面我们就来依次看看这3种调度器是怎么使用的:


一).默认调度器:schedulerUpdate()

默认调度器使用Node的刷新事件update方法,该方法在每帧绘制之前都会被调用一次。

我们在使用默认调度器(schedulerUpdate)时候,需要重载Node的update方法来执行自己的逻辑代码。如果需要停止这个调度器,可以使用unschedulerUpdate()方法。

接下来举个例子来看看默认调度器的具体实现,新建一个cocos工程,我们只在HelloWorldScene.h和HelloWorldScene.cpp这两个文件中做修改:

1).首先在头文件HelloWorldScene.h里声明重写的update方法,这个方法就是默认调度器的回调函数:

//声明系统自带的schedule回调函数virtual void update(float t);

2).在HelloWorldScene.cpp文件中实现update方法,可以在该方法中执行我们自己的逻辑代码,这里我只做下打印:

//实现schedule的回调函数void HelloWorld::update(float t){log("update!");}

3).通过scheduleUpdate()方法执行调度器,该方法是与其回调方法update()绑定到一起的,也就是说该方法一旦被某个Node执行,该Node的update()方法就会被执行,我把它写在.cpp文件的 HelloWorld::init()方法中:

//执行系统调度器this->scheduleUpdate();

运行结果:

 

可以看到,执行scheduleUpdate()方法后,update()回调方法会不断执行打印,那么这个update()回调方法多久执行一次呢?前面说了,该方法在每帧绘制之前都会被调用一次,所以理论上在无卡顿情况下每秒执行60次update()方法。


二).自定义调度器:schedule()

顾名思义,该调度器就是我们可以对调度进行相关属性的自定义,比如调度事件触发的时间间隔、触发次数等等

举个例子:

1).在.h文件中声明自定义调度器的回调函数,注意该方法不是系统的而是我们自己写的,所以方法名也是我们自己起的:

//声明自定义调度器回调函数virtual void customScheduleCallback(float t);

2)..cpp文件中实现刚刚声明的回调函数,这里也只做打印:

//实现回调函数void HelloWorld::customScheduleCallback(float t){log("customScheduleCallback!");}

3).通过schedule()方法执行自定义调度器,该方法有4个参数:

schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)

参数1:selector为要绑定的回调函数;

参数2:interval为事件触发时间间隔;

参数3:repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数;

参数4:delay表示第一次触发之前的延时。

我还把它写在.cpp文件的 HelloWorld::init()方法中:

//执行自定义调度器this->schedule(schedule_selector(HelloWorld::customScheduleCallback),2.0,5,3);

运行结果:

 

注意,第三个参数repeat值为5,表示触发一次事件后还会触发5次,所以一共有6次打印,而且每一次打印输出的时间间隔为2秒。


三).单次调度器:scheduleOnce()

单次调度器只进行一次调度,即只执行一次回调函数。该调度器的使用方法和之前2种调度器基本一致,都是声明回调方法、实现回调方法、使用调度器。

举个例子:

1).在.h文件中声明单次调度器的回调函数:

//声明单次调度器回调函数virtual void onceScheduleCallback(float t);

2).在.cpp文件中实现回调函数:

//实现回调函数void HelloWorld::onceScheduleCallback(float t){log("onceScheduleCallback!");}

3).通过scheduleOnce()方法执行单次调度器,该方法有2个参数:

参数1:要绑定的回调函数

参数2:第一次触发之前的延时

//执行单次调度器this->scheduleOnce(schedule_selector(HelloWorld::onceScheduleCallback), 3);

运行结果:

 

可以看到,程序运行3秒后看到了一次打印输出,之后便不再打印了。

 

最后,一句话总结,使用调度器无非就是使用3个方法:scheduleUpdate()、schedule()、scheduleOnce(),另外写好需要绑定的回调函数,完事!




以上。

 

 

 

4 0
原创粉丝点击