【思路】
之前做游戏中需要一个全局定时器,不随游戏场景切换而停止。百度搜到一份源码,GlobalSchedule,但是这份源码实际运行起来是没有效果的,因为每次进入新的场景会清空schedule,我也说不清,反正就那个意思。。。
在朋友的帮助下,我对这份源码进行了改动,原理是onEnter()事件不会被父节点注销还是什么(真的忘了朋友怎么说的了,哪位知道的朋友可以说下)。
改动后将计时器启动的代码写在了onEnter事件里。这样运行起来就不会被清除了,可以实现。
【源码】
github地址:https://github.com/winterfeel/NewGlobalSchedule
//////////////////// // GlobalSchedule.h //////////////////// #ifndef GLOBALSCHEDULE_H_ #define GLOBALSCHEDULE_H_ #include "cocos2d.h" USING_NS_CC; /** * 全局定时器 */ class GlobalSchedule: public CCNode { public: virtual void onEnter(); // 开始全局定时器 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); this->onEnter();//这里进行了修改,不在这里直接启动计时器,而是在enter里面 m_pSchedule = this; } void GlobalSchedule::onEnter() { CCNode::onEnter(); schedule(schedule_selector(GlobalSchedule::globalUpdate), 60.0f);//在这里启动计时器 } GlobalSchedule::~GlobalSchedule() { CCLog("GlobalSchedule().~()"); unschedule(schedule_selector(GlobalSchedule::globalUpdate)); } 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); }
我在游戏中用这份源码可以实现即计时,不过在游戏进入后台的时候只能停止,然后进入前台时重新启动,还没有做到暂停、继续。实现起来应该不难,当时不需要就没写,大家可以自己发挥,写一个完善一下,哈哈~
----灯灯