实现 Cocos2d-x 全局定时器
2013-12-06 11:16
453 查看
cocos2d-x 中有自己的定时器实现,一般用法是在场景,层等内部实现,定时器的生命周期随着它们的消亡而消亡,就运行周期而言,相对最长的是场景,如果在多个场景切换并且保持定时器的运行,那我们就需要定义一个自己的 全局定时器。
平时所使用的定时器,我们可以直接使用,是因为 CCNode 帮我们实现了定时器的封装,一个简单的做法,是定义个全局的静态 CCNode 对象,在程序运行之初初始化,并执行其定时器任务,而不由任何场景所管理即可实现,但在这里,一叶对定时器的内部实现稍作了解后,封装了自己实现的全局定时解决方案,代码如下(获取源码):
注意事项:根据一朋友的使用反馈(多谢这位朋友:P),以上代码并不能在 2.1.x 版本如期运行,原因为 scheduleSelector() 中的形参位置有变,请根据实际情况修改此构造函数内调用定时器 实参 的位置! 除非说明,本博客默认使用当前稳定版:2.0.4
这样的封装,在使用的时候只要填写 globalUpdate() 方法,处理具体的逻辑,然后在 AppDelegate 的applicationDidFinishLaunching 调用如下代码:
注意,start() 不论调用哪个重载的方法, 只能调用一次。当然可以在调用 stop() 方法重新调用 start() 启动定时器,方法的重载实现了定时器的时间间隔和延迟运行,并实现了定时器的暂停和恢复功能。
推荐的结束时机为在最后一个场景结束之时:
在前面的博文 Cocos2d-x 程序是如何开始运行与结束的,我们分析了 cocos2d-x 程序运行的始末,故推荐在此时调用停止定时器的方法。
有了全局定时器我们能做什么?这就要问你为何而实现全局定时器了 :
转载 :[叶落归根]: http://blog.leafsoar.com/archives/2013/05-08.html
平时所使用的定时器,我们可以直接使用,是因为 CCNode 帮我们实现了定时器的封装,一个简单的做法,是定义个全局的静态 CCNode 对象,在程序运行之初初始化,并执行其定时器任务,而不由任何场景所管理即可实现,但在这里,一叶对定时器的内部实现稍作了解后,封装了自己实现的全局定时解决方案,代码如下(获取源码):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | [code]//////////////////// // 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().stop()"); 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 调用如下代码:1 2 3 4 5 6 | [code]// 启动定时器 GlobalSchedule::start(); // 启动定时器,每 0.2 秒间隔执行 GlobalSchedule::start(0.2f); // 每 0.5 秒间隔运行,延迟 3 秒启动 GlobalSchedule::start(0.5f, 3.0f); |
什么时候结束
推荐的结束时机为在最后一个场景结束之时:1 2 | [code]CCDirector::sharedDirector()->end(); GlobalSchedule::stop(); |
有了全局定时器我们能做什么?这就要问你为何而实现全局定时器了 :
转载 :[叶落归根]: http://blog.leafsoar.com/archives/2013/05-08.html
相关文章推荐
- Cocos2d-x 3.10全局定时器简便实现
- 实现 Cocos2d-x 全局定时器
- 【转】 实现 Cocos2d-x 全局定时器
- 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸,androidalarmmanager
- 全局定时器 实现闹钟功能
- [置顶] Cocos2d-x实现计时器与定时器功能
- 全局定时器 实现闹钟功能
- 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸
- Android使用AlarmManager全局定时器实现定时更换壁纸
- cocos2dx 实现全局定时器
- cocos2d JS 利用定时器实现-倒计时功能
- Android重复闹钟(每天)的实现 Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
- Asp.Net实现全局定时器功能
- Cocos2d-x利用schedule实现定时器
- COCOS2D-X全局定时器
- 纯PHP实现定时器任务(Timer)
- 基于Android中实现定时器的3种解决方法
- Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
- cocos2d-x中的模态对话框简单实现
- 从零开始写C# MVC框架之--- 定义基类控制器、实现全局异常捕获