实现 Cocos2d-x 全局定时器

转载 2013年12月06日 11:16:07

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

平时所使用的定时器,我们可以直接使用,是因为 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
////////////////////
// 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);
}

注意事项:根据一朋友的使用反馈(多谢这位朋友:P),以上代码并不能在 2.1.x 版本如期运行,原因为 scheduleSelector() 中的形参位置有变,请根据实际情况修改此构造函数内调用定时器 实参 的位置! 除非说明,本博客默认使用当前稳定版:2.0.4

使用方法

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

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

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

什么时候结束

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

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

在前面的博文 Cocos2d-x 程序是如何开始运行与结束的,我们分析了 cocos2d-x 程序运行的始末,故推荐在此时调用停止定时器的方法。

有了全局定时器我们能做什么?这就要问你为何而实现全局定时器了 : 



转载 :[叶落归根]: http://blog.leafsoar.com/archives/2013/05-08.html

cocos2dx三种定时器的使用以及停止

cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce 今天白白跟大家分享一下cocos2dx中定时器的使用方法。 首先,什么是定...
  • Arxi
  • Arxi
  • 2014年06月16日 15:33
  • 11314

cocos2dx三种定时器的使用

cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce
  • zhanghefu
  • zhanghefu
  • 2014年08月10日 07:30
  • 51991

cocos2d-三种定时器的使用

cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce今天白白跟大家分享一下cocos2dx中定时器的使用方法。首先,什么是定时器呢?或许你有...
  • ko_tin
  • ko_tin
  • 2016年10月23日 01:17
  • 572

Cocos2d-x实现计时器与定时器功能

笔者最近在写一个计时和定时的功能,上网查看了不少讲述实现计时器定时器的文章,大多都直接采用Cocos2d-x的定时器schedule。但是schedule定时器会有一定的误差。 为了尽量的消除误差,笔...
  • wsr270591269
  • wsr270591269
  • 2017年05月29日 12:10
  • 400

cocos2d-x游戏引擎核心之三——主循环和定时器

cocos2d-x游戏引擎核心之三——主循环和定时器 2014-10-28 11:40 by 小天_y, 107 阅读, 0 评论, 收藏,  编辑 一、游戏主循环 在介绍游戏基本概念的...
  • u012419410
  • u012419410
  • 2016年02月02日 15:04
  • 384

实现 Cocos2d-x 全局定时器

本文出自[无间落叶](转载请保留出处):http://blog.leafsoar.com/archives/2013/05-08-21.html cocos2d-x 中有自己的定时器实现,一般用...
  • yc1404
  • yc1404
  • 2013年07月02日 09:31
  • 729

cocos 全局定时器

#pragma once #include "CommonHead.h" /** * 全局定时器 */ class GlobalSchedule : public TObject { publi...
  • warrially
  • warrially
  • 2015年11月09日 22:40
  • 962

ZED-Board从入门到精通系列例程——全局定时器

URL: http://blog.csdn.NET/kkk584520/article/details/10034679 本文系ZED-Board从入门到精通(三):从传统ARM开发到P...
  • w371500241
  • w371500241
  • 2016年12月16日 10:12
  • 1021

ZED-Board从入门到精通系列例程——全局定时器

URL: http://blog.csdn.net/kkk584520/article/details/10034679 本文系ZED-Board从入门到精通(三):从传统ARM开发到PS开...
  • wanruoqingkong
  • wanruoqingkong
  • 2014年07月02日 13:02
  • 1125

【Android】全局定时器Alarm

AlarmManager通常用于开发手机闹钟,但实际上他的作用不限于此
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2014年11月16日 20:30
  • 3273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现 Cocos2d-x 全局定时器
举报原因:
原因补充:

(最多只允许输入30个字)