cocos2d-x Schedule详解
原理介绍
Cocos2d-x调度器为游戏提供定时事件和定时调用服务。所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处:
- 每当Node不再可见或已从场景中移除时,调度器会停止。
- Cocos2d-x暂停时,调度器也会停止。当Cocos2d-x重新开始时,调度器也会自动继续启动。
- Cocos2d-x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险。
基础用法
游戏中我们经常会随时间的变化而做一些逻辑判断,如碰撞检测。为了解决以上问题,我们引入了调度器,这使得游戏能够更好的处理动态事件。Cocos2d-x提供了多种调度机制,在开发中我们通常会用到3种调度器:
- 默认调度器:schedulerUpdate()
- 自定义调度器:schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
- 单次调度器: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)函数里面的参数:
- 第一个参数selector即为你要添加的事件函数
- 第二个参数interval为事件触发时间间隔
- 第三个参数repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数
- 第四个参数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详解的更多相关文章
- ios新特征 ARC详解
IOS ARC 分类: IOS ARC2013-01-17 09:16 2069人阅读 评论(0) 收藏 举报 目录(?)[+] 关闭工程的ARC(Automatic Reference Co ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- Cocos2d-x win7 + vs2010 配置图文详解
Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...
- [nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)
:由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作.为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) . ...
- WindowManager 实现悬浮窗 详解
WindowManager 实现悬浮窗 详解 一:对于想直接看效果的,可以看看我的demo app. 链接:http://sj.qq.com/myapp/detail.htm?apkName=com. ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- net user命令集合详解
net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user: ...
- 78. Android之 RxJava 详解
转载:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Fli ...
- cocos2dx-3.x 导出自定义类到 lua 过程详解
转载请注明出处:http://www.cnblogs.com/Ray1024 一.简介 最近正在学习cocos2d中的lua游戏开发,因为lua开发的热更新特性,大家开发游戏好像都会优先选择lua作为 ...
随机推荐
- 事务的四大特性ACID介绍
事务是恢复和并发控制的基本单位.ACID 事务应该具有4个属性:原子性.一致性.隔离性.持续性.这四个属性通常称为ACID特性. 原子性(atomicity).一个事务是一个不可分割的工作单位,事务中 ...
- python之函数用法globals()
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法globals() #globals() #说明:在当前作用域下,查看全局变量 ''' ...
- Android基于TCP的局域网聊天通信
概述 在同一局域网内,两台设备通过TCP进行通信聊天. 详细 代码下载:http://www.demodashi.com/demo/10567.html 一.准备工作 开发环境 jdk1.8 Ecli ...
- 一个PHP操作大变量的例子
By C extensions we can directly manipulate the large PHP variables, such as:GET,POST,SERVER You can ...
- HDUOJ-----(1072)Nightmare(bfs)
Nightmare Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- Python中 append 和 extend 的区别
Python中Lists 的两个方法: append 和 extend : list.append(object) 向列表中添加一个对象object.append 接受一个参数,这个参数可以是任何数据 ...
- xp看系统位数
运行cmd,看打开的cmd窗口标题一般c:\windows\system32代表32位操作系统,64位就是system64,详细系统信息运行命令“systeminfo”
- windows服务器开启openssl
windows服务器默认是没有开启openss的php扩展支持,不过一般服务器里面默认都已经安装了这个功能.自己开启一下就好,今天在安装某程序的时候,需要用到openss的支持,才发现windows服 ...
- OpenSSH的RSA/DSA密钥认证系统
OpenSSH的RSA/DSA密钥认证系统,它可以代替OpenSSH缺省使用的标准安全密码认证系统. OpenSSH的RSA和DSA认证协议的基础是一对专门生成的密钥,分别叫做私用密钥和公用密钥. 使 ...
- Linux内核(16) - 高效学习Linux内核
世界悲结束了,章鱼哥也退役了,连非诚勿扰中的拜金女也突然的少了很多.这本<Linux内核修炼之道>在卓越.当当.china-pub上也已经开卖了,虽然是严肃文学,但为了保证流畅性,大部分文 ...