原理介绍

Cocos2d-x调度器为游戏提供定时事件和定时调用服务。所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处:

  1. 每当Node不再可见或已从场景中移除时,调度器会停止。
  2. Cocos2d-x暂停时,调度器也会停止。当Cocos2d-x重新开始时,调度器也会自动继续启动。
  3. Cocos2d-x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险。

基础用法

  游戏中我们经常会随时间的变化而做一些逻辑判断,如碰撞检测。为了解决以上问题,我们引入了调度器,这使得游戏能够更好的处理动态事件。Cocos2d-x提供了多种调度机制,在开发中我们通常会用到3种调度器:

  1. 默认调度器:schedulerUpdate()
  2. 自定义调度器:schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
  3. 单次调度器:scheduleOnce(SEL_SCHEDULE selector, float delay)

以下我们来对这3种调度器做简单的介绍。

默认调度器(schedulerUpdate)

  该调度器是使用Node的刷新事件update方法,该方法在每帧绘制之前都会被调用一次。由于每帧之间时间间隔较短,所以每帧刷新一次已足够完成大部分游戏过程中需要的逻辑判断。

Cocos2d-x中Node默认是没有启用update事件的,因此你需要重载update方法来执行自己的逻辑代码。

通过执行schedulerUpdate()调度器每帧执行 update方法,如果需要停止这个调度器,可以使用unschedulerUpdate()方法。

以下代码用来测试该调度器:

HelloWorldScene.h
void update(float dt)override; HelloWorldScene.cpp
boolHelloWorld::init()
{
scheduleUpdate();
return true;
} void HelloWorld::update(float dt)
{
log("update");
}

你会看到控制台不停输出如下信息

cocos2d: update
cocos2d: update
cocos2d: update
cocos2d: update

自定义调度器(scheduler)

  游戏开发中,在某些情况下我们可能不需要频繁的进行逻辑检测,这样可以提高游戏性能。所以Cocos2d-x还提供了自定义调度器,可以实现以一定的时间间隔连续调用某个函数。

由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在0.1秒以上。

同样,取消该调度器可以用unschedule(SEL_SCHEDULE selector, float delay)。

以下代码用来测试该调度器:

HelloWorldScene.h
void updateCustom(float dt); HelloWorldScene.cpp
bool HelloWorld::init()
{
schedule(schedule_selector(HelloWorld::updateCustom),1.0f, kRepeatForever,);
return true;
} void HelloWorld::updateCustom(float dt)
{
log("Custom");
}

在控制台你会看到每隔1秒输出以下信息

cocos2d:Custom
cocos2d:Custom
cocos2d:Custom
cocos2d:Custom
cocos2d:Custom

我们来看下scheduler(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)函数里面的参数:

  1. 第一个参数selector即为你要添加的事件函数
  2. 第二个参数interval为事件触发时间间隔
  3. 第三个参数repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数
  4. 第四个参数delay表示第一次触发之前的延时

单次调度器(schedulerOnce)

  游戏中某些场合,你只想进行一次逻辑检测,Cocos2d-x同样提供了单次调度器。该调度器只会触发一次,用unschedule(SEL_SCHEDULE selector, float delay)来取消该触发器。

以下代码用来测试该调度器:


HelloWorldScene.h
void updateOnce(float dt);
HelloWorldScene.cpp
bool HelloWorld::init()
{
scheduleOnce(schedule_selector(HelloWorld::updateOnce),0.1f);
  return true;
} voidHelloWorld::updateOnce(float dt)
{
log("Once");
}

这次在控制台你只会看到一次输出

cocos2d:Once

cocos2d-x Schedule详解的更多相关文章

  1. ios新特征 ARC详解

    IOS ARC 分类: IOS ARC2013-01-17 09:16 2069人阅读 评论(0) 收藏 举报   目录(?)[+]   关闭工程的ARC(Automatic Reference Co ...

  2. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  3. Cocos2d-x win7 + vs2010 配置图文详解

    Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...

  4. [nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)

    :由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作.为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) . ...

  5. WindowManager 实现悬浮窗 详解

    WindowManager 实现悬浮窗 详解 一:对于想直接看效果的,可以看看我的demo app. 链接:http://sj.qq.com/myapp/detail.htm?apkName=com. ...

  6. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  7. net user命令集合详解

    net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user: ...

  8. 78. Android之 RxJava 详解

    转载:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Fli ...

  9. cocos2dx-3.x 导出自定义类到 lua 过程详解

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.简介 最近正在学习cocos2d中的lua游戏开发,因为lua开发的热更新特性,大家开发游戏好像都会优先选择lua作为 ...

随机推荐

  1. vue单文件(sfc)编译为js的流程

    1.流程 2.参考文章地址 https://segmentfault.com/a/1190000012336392 3.Vue框架的parseComponent https://github.com/ ...

  2. DevExpress添加Winform窗体到DockPanel

    在使用DevExpress过程中,原先已经创建好的导航窗体,如何添加到DockPanel中进行展示? FormX frmX = new FormX(); frmX.Show(this.DockPane ...

  3. Drupal的$messages是怎么显示的?

    Drupal的默认主题bartik会在页面顶部显示系统信息,例如警告.状态等.这个过程是如何实现的? 首先,在bartik目录下找到page.tpl.php,这是bartik主题的页面显示模板.其中有 ...

  4. 兼顾pc和移动端的textarea字数监控的实现方法

    概述 pc端移动端中文本框监控字数的功能的一种较为简单的实现,考虑到安卓和IOS输入法输入过程中是否触发keyup的差异.利用监听compositionstart判断是否开启了输入法.从而实现体验较为 ...

  5. 【mysql】Innodb三大特性之adaptive hash index

    1.Adaptive Hash Indexes 定义 If a table fits almost entirely in main memory, the fastest way to perfor ...

  6. PHP读取大文件的几种方法

    场景:PHP读取超大文件,例如1G的日志文件,我这里使用的是400M的access.log文件 1.使用file直接读取 <?php $starttime=microtime_float(); ...

  7. 一个Linux下C线程池的实现

    什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了.如果线程创建和销毁时间相比任 ...

  8. Java并发编程,多线程[转]

    Java并发编程 转自:http://www.cnblogs.com/dolphin0520/category/602384.html 第一个例子(没有阻塞主线程,会先输出over): package ...

  9. java使用ssh访问Linux的项目jscraft

    一.gradle地址 // https://mvnrepository.com/artifact/com.jcraft/jsch compile group: 'com.jcraft', name: ...

  10. .net利用SQLBulkCopy进行数据库之间的大批量数据传递

    SQLBulkCopy,用于数据库之间大批量的数据传递.通常用于新,旧数据库之间数据的更新.即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来. 首先,SQLBulkCopy需要2个连 ...