转自: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 全局定时器的更多相关文章

  1. Android AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

    AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的用法:(1)在指定时长后执行某项操 ...

  2. Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  3. AlarmManager(全局定时器/闹钟)详解

    AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.指定时长或以周期形式执行某项操作.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的 ...

  4. 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸

    该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供 ...

  5. android之AlarmManager 全局定时器

    AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver ...

  6. .net MVC全局定时器执行作业

    首先的一个需求是在OA系统中定时跑一些定时作业,例如发放年假等事务,之前的做法是在服务器上加入一个服务,用系统定时作业去跑服务,这样有个问题就是当系统在发布的过程中,有可能忘记启动服务而导致无法定时执 ...

  7. cocos2d JS 利用定时器实现-倒计时功能

    //创建一个定时器 cc.director.getScheduler().schedule(this, this.updates, 1, cc.REPEAT_FOREVER, 0, false, &q ...

  8. js数组&&字符串&&定时器1

    一.简单计算命令eval var str="6*5"; alert(eval(str)); 注意:不安全,一般都不会去用   二.id&&name id:只能唯一 ...

  9. 79.ZYNQ内部私有定时器中断

    上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每个一秒中断一次,在中断函数里计数加1,通过串口打印输出. *本文所使用的开发板是Miz702(兼容zedbo ...

随机推荐

  1. 1080. Graduate Admission (30)

    时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It is said that in 2013, there w ...

  2. poj 3415 Common Substrings 后缀数组+单调栈

    题目链接 题意:求解两个字符串长度 大于等于k的所有相同子串对有多少个,子串可以相同,只要位置不同即可:两个字符串的长度不超过1e5; 如 s1 = "xx" 和 s2 = &qu ...

  3. Ubuntu下Sublime Text 3无法输入中文的解决方案

    1. 保存下面的代码到文件sublime_imfix.c中: /* * sublime-imfix.c * Use LD_PRELOAD to interpose some function to f ...

  4. 关于FileSystemWatcher监听文件创建

    FileSystemWatcher中的Created事件不但可以监听用户创建的文件,当用户删除某个文件时,系统会在再监听的那个盘上的回收站创建一个文件,在回收站创建的文件也会触发Created事件,而 ...

  5. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)

    使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性.这种交叠有一个很好的例子就是 HttpAppl ...

  6. [转载]Unity3D 访问Access数据库

    在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来.写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是在他使用的过 ...

  7. 团体程序设计天梯赛-练习集L2-011. 玩转二叉树

    L2-011. 玩转二叉树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜 ...

  8. #pragma预处理指令讲解

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...

  9. SDK更新问题解决

    更新C:\WINDOWS\system32\drivers\etc\host文件百试不爽 第一步 打开SDK Manager下Tools->Options,选中“Force https://… ...

  10. 关于NGUI中的自适应和对齐机制

    原地址:http://blog.sina.com.cn/s/blog_62df69790101gy7t.html 1 关于美术效果图 美术出效果图总是基于某个固定尺寸.移动设备的分辨率却有太多不同的方 ...