实现 Cocos2d-x 全局定时器

本文介绍了一种在Cocos2d-x中实现全局定时器的方法,该定时器不受场景切换的影响,适用于需要在整个游戏过程中持续运行的任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cocos2d-x 中有自己的定时器实现,一般用法是在场景,层等内部实现,定时器的生命周期随着它们的消亡而消亡,就运行周期而言,相对最长的是场景,如果在多个场景切换并且保持定时器的运行,那我们就需要定义一个自己的  全局定时器

平时所使用的定时器,我们可以直接使用,是因为 CCNode 帮我们实现了定时器的封装,一个简单的做法,是定义个全局的静态 CCNode 对象,在程序运行之初初始化,并执行其定时器任务,而不由任何场景所管理即可实现,但在这里,一叶对定时器的内部实现稍作了解后,封装了自己实现的全局定时解决方案,代码如下:

  1. ////////////////////
  2. // GlobalSchedule.h
  3. ////////////////////
  4.  
  5. #ifndef GLOBALSCHEDULE_H_
  6. #define GLOBALSCHEDULE_H_
  7.  
  8. #include "cocos2d.h"
  9.  
  10. USING_NS_CC;
  11.  
  12. /**
  13. * 全局定时器
  14. */
  15. class GlobalSchedule: public CCObject {
  16. public:
  17. // 开始全局定时器 fInterval: 时间间隔 ; fDelay: 延迟运行
  18. static void start(float fInterval = 0.0f, float fDelay = 0.0f);
  19. // 停止全局定时器
  20. static void stop();
  21. // 全局定时器暂停
  22. static void pause();
  23. // 全局定时器暂停恢复
  24. static void resume();
  25.  
  26. // 全局定时器主逻辑实现
  27. void globalUpdate();
  28.  
  29. private:
  30. // 构造函数私有化,只能通过 start 来启用全局定时器
  31. GlobalSchedule(float fInterval, float fDelay);
  32. ~GlobalSchedule();
  33.  
  34. // 静态变量保持单例
  35. static GlobalSchedule* m_pSchedule;
  36. };
  37.  
  38. #endif /* GLOBALSCHEDULE_H_ */
  39.  
  40. /////////////////////
  41. // GlobalSchedule.cpp
  42. /////////////////////
  43.  
  44. #include "GlobalSchedule.h"
  45.  
  46. #define SCHEDULE CCDirector::sharedDirector()->getScheduler()
  47.  
  48. GlobalSchedule* GlobalSchedule::m_pSchedule = NULL;
  49.  
  50. GlobalSchedule::GlobalSchedule(float fInterval, float fDelay) {
  51. CCLog("GlobalSchedule()");
  52.  
  53. CCAssert(!m_pSchedule, "以定义,不能重复定义");
  54.  
  55. SCHEDULE->scheduleSelector(
  56. schedule_selector(GlobalSchedule::globalUpdate), this, fInterval,
  57. false,
  58. kCCRepeatForever, fDelay);
  59.  
  60. m_pSchedule = this;
  61. }
  62.  
  63. GlobalSchedule::~GlobalSchedule() {
  64. CCLog("GlobalSchedule().~()");
  65.  
  66. SCHEDULE->unscheduleSelector(
  67. schedule_selector(GlobalSchedule::globalUpdate), this);
  68. }
  69.  
  70. void GlobalSchedule::globalUpdate() {
  71. // 这里写全局定时器的逻辑处理代码
  72. CCLog("global update");
  73. }
  74.  
  75. void GlobalSchedule::start(float fInterval, float fDelay) {
  76. new GlobalSchedule(fInterval, fDelay);
  77. }
  78.  
  79. void GlobalSchedule::stop() {
  80. CCLog("GlobalSchedule().clean()");
  81.  
  82. CCAssert(m_pSchedule, "未定义");
  83. CC_SAFE_DELETE(m_pSchedule);
  84. }
  85.  
  86. void GlobalSchedule::pause() {
  87. CCLog("GlobalSchedule().pause()");
  88.  
  89. CCAssert(m_pSchedule, "为定义");
  90. SCHEDULE->pauseTarget(m_pSchedule);
  91. }
  92.  
  93. void GlobalSchedule::resume() {
  94. CCLog("GlobalSchedule().resume()");
  95.  
  96. CCAssert(m_pSchedule, " 未定义");
  97. SCHEDULE->resumeTarget(m_pSchedule);
  98. }

使用方法

这样的封装,在使用的时候只要填写 globalUpdate() 方法,处理具体的逻辑,然后在 AppDelegate 的applicationDidFinishLaunching 调用如下代码:

 
  1. // 启动定时器
  2. GlobalSchedule::start();
  3. // 启动定时器,每 0.2 秒间隔执行
  4. GlobalSchedule::start(0.2f);
  5. // 每 0.5 秒间隔运行,延迟 3 秒启动
  6. GlobalSchedule::start(0.5f, 3.0f);

注意,start() 不论调用哪个重载的方法, 只能调用一次。当然可以在调用 stop() 方法重新调用 start() 启动定时器,方法的重载实现了定时器的时间间隔和延迟运行,并实现了定时器的暂停和恢复功能。

什么时候结束

推荐的结束时机为在最后一个场景结束之时:

 
  1. CCDirector::sharedDirector()->end();
  2. GlobalSchedule::stop();


原文地址:http://blog.leafsoar.com/archives/2013/05-08-21.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值