【转】 实现 Cocos2d-x 全局定时器
转自:http://www.tairan.com/archives/3998
cocos2d-x 中有自己的定时器实现,一般用法是在场景,层等内部实现,定时器的生命周期随着它们的消亡而消亡,就运行周期而言,相对最长的是场景,如果在多个场景切换并且保持定时器的运行,那我们就需要定义一个自己的 全局定时器。
平时所使用的定时器,我们可以直接使用,是因为 CCNode 帮我们实现了定时器的封装,一个简单的做法,是定义个全局的静态 CCNode 对象,在程序运行之初初始化,并执行其定时器任务,而不由任何场景所管理即可实现,但在这里,一叶对定时器的内部实现稍作了解后,封装了自己实现的全局定时解决方案,代码如下:
//////////////////// // GlobalSchedule.h //////////////////// #ifndef GLOBALSCHEDULE_H_ #define GLOBALSCHEDULE_H_ #include "cocos2d.h" USING_NS_CC; /** * 全局定时器 */ class GlobalSchedule: public CCObject { public: // 开始全局定时器 fInterval: 时间间隔 ; fDelay: 延迟运行 static void start(float fInterval = 0.0f, float fDelay = 0.0f); // 停止全局定时器 static void stop(); // 全局定时器暂停 static void pause(); // 全局定时器暂停恢复 static void resume(); // 全局定时器主逻辑实现 void globalUpdate(); private: // 构造函数私有化,只能通过 start 来启用全局定时器 GlobalSchedule(float fInterval, float fDelay); ~GlobalSchedule(); // 静态变量保持单例 static GlobalSchedule* m_pSchedule; }; #endif /* GLOBALSCHEDULE_H_ */ ///////////////////// // GlobalSchedule.cpp ///////////////////// #include "GlobalSchedule.h" #define SCHEDULE CCDirector::sharedDirector()->getScheduler() GlobalSchedule* GlobalSchedule::m_pSchedule = NULL; GlobalSchedule::GlobalSchedule(float fInterval, float fDelay) { CCLog("GlobalSchedule()"); CCAssert(!m_pSchedule, "以定义,不能重复定义"); SCHEDULE->scheduleSelector( schedule_selector(GlobalSchedule::globalUpdate), this, fInterval, false, kCCRepeatForever, fDelay); m_pSchedule = this; } GlobalSchedule::~GlobalSchedule() { CCLog("GlobalSchedule().~()"); SCHEDULE->unscheduleSelector( schedule_selector(GlobalSchedule::globalUpdate), this); } void GlobalSchedule::globalUpdate() { // 这里写全局定时器的逻辑处理代码 CCLog("global update"); } void GlobalSchedule::start(float fInterval, float fDelay) { new GlobalSchedule(fInterval, fDelay); } void GlobalSchedule::stop() { CCLog("GlobalSchedule().clean()"); CCAssert(m_pSchedule, "未定义"); CC_SAFE_DELETE(m_pSchedule); } void GlobalSchedule::pause() { CCLog("GlobalSchedule().pause()"); CCAssert(m_pSchedule, "为定义"); SCHEDULE->pauseTarget(m_pSchedule); } void GlobalSchedule::resume() { CCLog("GlobalSchedule().resume()"); CCAssert(m_pSchedule, " 未定义"); SCHEDULE->resumeTarget(m_pSchedule); }
使用方法
这样的封装,在使用的时候只要填写 globalUpdate() 方法,处理具体的逻辑,然后在 AppDelegate 的applicationDidFinishLaunching 调用如下代码:
// 启动定时器 GlobalSchedule::start(); // 启动定时器,每 0.2 秒间隔执行 GlobalSchedule::start(0.2f); // 每 0.5 秒间隔运行,延迟 3 秒启动 GlobalSchedule::start(0.5f, 3.0f);
注意,start() 不论调用哪个重载的方法, 只能调用一次。当然可以在调用 stop() 方法重新调用 start() 启动定时器,方法的重载实现了定时器的时间间隔和延迟运行,并实现了定时器的暂停和恢复功能。
什么时候结束
推荐的结束时机为在最后一个场景结束之时:
CCDirector::sharedDirector()->end(); GlobalSchedule::stop();
在前面的博文Cocos2d-x 程序是如何开始运行与结束的,我们分析了 cocos2d-x 程序运行的始末,故推荐在此时调用停止定时器的方法。
注意事项:根据一朋友的使用反馈(多谢这位朋友:P),以上代码并不能在 2.1.x 版本如期运行,原因为 scheduleSelector() 中的形参位置有变,请根据实际情况修改此构造函数内调用定时器 实参 的位置!
【转】 实现 Cocos2d-x 全局定时器的更多相关文章
- Android AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的用法:(1)在指定时长后执行某项操 ...
- Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...
- AlarmManager(全局定时器/闹钟)详解
AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.指定时长或以周期形式执行某项操作.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的 ...
- 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸
该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供 ...
- android之AlarmManager 全局定时器
AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver ...
- .net MVC全局定时器执行作业
首先的一个需求是在OA系统中定时跑一些定时作业,例如发放年假等事务,之前的做法是在服务器上加入一个服务,用系统定时作业去跑服务,这样有个问题就是当系统在发布的过程中,有可能忘记启动服务而导致无法定时执 ...
- cocos2d JS 利用定时器实现-倒计时功能
//创建一个定时器 cc.director.getScheduler().schedule(this, this.updates, 1, cc.REPEAT_FOREVER, 0, false, &q ...
- js数组&&字符串&&定时器1
一.简单计算命令eval var str="6*5"; alert(eval(str)); 注意:不安全,一般都不会去用 二.id&&name id:只能唯一 ...
- 79.ZYNQ内部私有定时器中断
上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每个一秒中断一次,在中断函数里计数加1,通过串口打印输出. *本文所使用的开发板是Miz702(兼容zedbo ...
随机推荐
- SelectedValue,SelectedValuePath,SelectedValueBinding,DisplayMemberPath讲解
无论在Winform.WPF.ASP.NET中,数据绑定是我们经常使用的一个重要技术,我们经常会把相关类动态显示绑定到UI界面中,其中有几个比较重要的属性需要大家灵活运用. 那Combox来说明有两个 ...
- 1020. Tree Traversals (序列建树)
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...
- RCP学习笔记
一些model特征: Trimmed Window: 带最小化最大化的窗体 Perspective Stack: 装载Perspective的容器 Perspective:一个透视,可以直接包含Par ...
- 【Cardboard】 体验 - Google Cardboard DIY及完成后简单体验
体验 - Google Cardboard DIY及完成后简单体验 今年的Google I/O最让我感兴趣的除了Material Design以外就是这个Google Cardboard了.据说是Go ...
- mysql子查询优化
,,,) ) LIMIT 第一种方式in where:2000ms SELECT COUNT(*) AS tp_count FROM xxx_b2c_orders o ,,,) and from xx ...
- 小小地预览HTML5
程序示例 <!doctype html> <html> <head> <title>First </title> <meta char ...
- c#面向对象机制的进一步理解
今天看到一个面试题很有意思: namespace EventTest{ class Program { static void Main(string[] args) { A a = new C(); ...
- 团体程序设计天梯赛-练习集L1-005. 考试座位号
L1-005. 考试座位号 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 每个PAT考生在参加考试时都会被分配两个座位号,一个 ...
- Ehcache详细解读(转载)
Ehcache 是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从Hibernate的缓存开始的.网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面 ...
- js 计时器
<html><head><script type="text/javascript">var count=0;var t ;function t ...