Cocos2d-x 3.2:定时器的使用和原理探究(1)

Cocos2d-x 3.2:定时器的使用和原理探究(1)

本文转载至深入了解Cocos2d-x 3.x:定时器的使用和原理探究(1)

注:本文开始,引擎升级到Cocos2d-x 3.6

在游戏开发过程中,经常会遇到使用计时器的情况,例如:倒计时,定时炸弹等。scheduler是Cocos2d-x 2.x时代就已经存在的产物,主要用于各种延时函数以及各种每帧运行的函数。本文主要介绍scheduler的API函数以及使用方法。

首先,所有继承Node的类都可以使用scheduler,以下是Node类下相关API的介绍


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

/**

* 开启自带的update方法,这个方法会每帧执行一次,默认优先级为0,并且在所有自定义方法执行之前执行

*/

void scheduleUpdate(void);

/**

* 开启自带的update方法,这个方法会每帧执行一次,设定的优先级越小,越优先执行

*/

void scheduleUpdateWithPriority(int priority);

/**

* 关闭自带的update方法

*/

void unscheduleUpdate(void);

/**

* 定义一个自定义的定时器

* selector:回调函数

* interval:重复间隔时间,重复执行间隔的时间,如果传入0,则表示每帧调用

* repeat:重复运行次数,如果传入CC_REPEAT_FOREVER则表示无限循环

* delay:延时秒数,延迟delay秒开始执行第一次回调

*/

void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);

/**

* 定义一个立即执行的无限循环的自定义定时器

* interval:重复间隔时间,重复执行间隔的时间,如果传入0,则表示每帧调用

*/

void schedule(SEL_SCHEDULE selector, float interval);

/**

* 定义一个延迟执行的单次自定义定时器

* delay:延时秒数,延迟delay秒开始执行第一次回调

*/

void scheduleOnce(SEL_SCHEDULE selector, float delay);

/**

* 定义了一个无限循环、立即执行并且每帧都会执行的自定义定时器(和scheduleUpdate效果一样,但是会在scheduleUpdate之后执行)

*/

void schedule(SEL_SCHEDULE selector);

/**

* 使用lambda函数定义一个每帧调用的自定义定时器

* callback:lambda函数

* key:lambda函数的Key,用于取消定时器

*/

void schedule(const std::function<void(float)>& callback, const std::string &key);

/**

* 使用lambda函数定义一个每隔interval秒调用的自定义定时器

* callback:lambda函数

* interval:重复间隔时间,重复执行间隔的时间,如果传入0,则表示每帧调用

* key:lambda函数的Key,用于取消定时器

*/

void schedule(const std::function<void(float)>& callback, float interval, const std::string &key);

/**

* 使用lambda函数定义一个自定义定时器

* callback:lambda函数

* interval:重复间隔时间,重复执行间隔的时间,如果传入0,则表示每帧调用

* repeat:重复运行次数,如果传入CC_REPEAT_FOREVER则表示无限循环

* delay:延时秒数,延迟delay秒开始执行第一次回调

* key:lambda函数的Key,用于取消定时器

* @lua NA

*/

void schedule(const std::function<void(float)>& callback, float interval, unsigned int repeat, float delay, const std::string &key);

/**

* 取消一个自定义定时器

*/

void unschedule(SEL_SCHEDULE selector);

/**

* 取消本节点上所有的定时器(包括scheduleUpdate开启的定时器)

*/

void unscheduleAllSelectors(void);

接下来用一个简单的倒计时例子来学习API的使用,首先看看实现效果:

具体代码如下:


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

bool HelloWorld::init()  

{  

    if ( !Layer::init() )  

    {  

        return false;  

    }  

    //int _time;  

    //Label *_countdownLabel; //类成员变量  

    _time = 10;  

    _countdownLabel = Label::create(String::createWithFormat("%d", _time)->getCString(), "微软雅黑", 24);  

    _countdownLabel->setPosition(Vec2(200, 200));  

    addChild(_countdownLabel);  

    //方法1  

    //schedule(schedule_selector(HelloWorld::NextTime),1.f,CC_REPEAT_FOREVER,0.0f);  

    //方法2  

    schedule([&](float dt)  

    {  

        if (_time == 0)  

        {  

            unschedule("CountDown");  

            _countdownLabel->setString("end");  

        }  

        else

        {  

            --_time;  

            _countdownLabel->setString(String::createWithFormat("%d", _time)->getCString());  

        }  

    }, 1.f, CC_REPEAT_FOREVER, 0.0f, "CountDown");  

    return true;  

}  

  

void HelloWorld::NextTime(float dt)  

{  

    if (_time == 0)  

    {  

        unschedule(schedule_selector(HelloWorld::NextTime));  

        _countdownLabel->setString("end");  

    }  

    else

    {  

        --_time;  

        _countdownLabel->setString(String::createWithFormat("%d", _time)->getCString());  

    }  

}

方法1与方法2实现的效果完全一样,区别在于一个使用了Lambda函数,一个使用了传统的方法。

接下来简单说一下scheduleOnce,这个函数用于延时执行,比如可以实现2秒后删除自身,具体代码如下:


1

2

3

4

scheduleOnce([this](float dt)  

{  

    this->removeFromParent();  

},2.f, "Del");

scheduleOnce是一个非常有用的函数,在很多场合都会用到。

然后再来看看scheduleUpdate,这是一个与其他函数有所区别,启动的是一个Node::update方法,启动之后这个方法每帧执行,而且会优先于自定义计时器执行,也可以指定优先级。

接下来我们想实现一个移动动画,每秒钟固定向左边移动一定的距离,通过scheduleUpdate实现,以下是实现代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

bool HelloWorld::init()  

{  

    if ( !Layer::init() )  

    {  

        return false;  

    }  

    _moveX = 100.0f;  

    scheduleUpdate();  

}  

void HelloWorld::update(float dt)  

{  

    float moveX = _moveX * dt;  

    _countdownLabel->setPositionX(_countdownLabel->getPositionX() + moveX);  

}

本文通过一些基础的定时器应用分析了Cocos2d-x中scheduler的基本使用方法,在项目中会有更多定时器的应用场景。下一篇文章将对创建定时器的实现进行分析。

时间: 2024-10-20 20:14:09

Cocos2d-x 3.2:定时器的使用和原理探究(1)的相关文章

Cocos2d-x 3.2:定时器的使用和原理探究(2)

Cocos2d-x 3.2:定时器的使用和原理探究(2) 本文转载至深入了解Cocos2d-x 3.x:定时器的使用和原理探究(2) 上一篇说到定时器的使用方法,这篇主要分析它的实现原理. 1.哈希链表 Cocos2d-x封装了一个结构体,叫做UT_hash_handle,只要在自定义的结构体中声明这个结构体变量,就实现了哈希链表,并且能使用一系列的哈希链表专用的宏.这个结构体的具体实现如下: 1 2 3 4 5 6 7 8 9 10 typedef struct UT_hash_handle 

Cocos2d-x 3.2:定时器的使用和原理探究(3)

Cocos2d-x 3.2:定时器的使用和原理探究(3) 本文转载至[深入了解cocos2d-x 3.x]定时器(scheduler)的使用和原理探究(3) 上篇文章分析到了定时器的定义,这篇的重点就是定时器是如何运行起来的. 1.从main中寻找定时器的回调 讲定时器的运行,就不得不触及到cocos2dx的main函数了,因为定时器是主线程上运行的,并不是单独线程的,所以它的调用必然会在main函数中,每帧调用. 以下代码就是win32平台下的main函数 [cpp] view plainco

21-30(NSTimer定时器 Cell的重用原理 代理的使用场合 UITableViewCell结构 监听键盘的通知)

21.NSTimer定时器 22.tableView的基本用法 23.tableView的常用属性 24.Cell的重用原理: 25.UITableViewCell结构 26.使用xib封装一个view的步骤 27.代理的使用场合 28.使用delegate的步骤 29.通过代码自定义cell步骤 30.监听键盘的通知 { 细节决定成败, 这句话讲的太对了, 所以我们要注意每一个细节!今天还好注意了, 没犯错!嘿嘿! 今天心情特别好, 心情好! 啥都好! 给大家来个笑, 工作的同时,不要忘记笑容

【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(3)

上篇文章分析到了定时器的定义,这篇的重点就是定时器是如何运行起来的. 1.从main中寻找定时器的回调 讲定时器的运行,就不得不触及到cocos2dx的main函数了,因为定时器是主线程上运行的,并不是单独线程的,所以它的调用必然会在main函数中,每帧调用. 以下代码就是win32平台下的main函数 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdSh

定时器的使用和原理浅析,alarm/sleep函数

alarm,select,sleep函数 内核需要做的时间管理: 1)提供系统调度所使用的tick中断 2)维护系统时间 3)维护软件定时器,高速tcp和多媒体应用要使timer高效精准 为了更好的支持音视频等需求,提出了hrtimer这个高精度时钟子系统,为了节约能源,采用了tickless子系统.

Google 发布 Android 性能优化典范

2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议.主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化.下面是对这些问题和建议的总结梳理. 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计

[Android Pro] Android性能优化典范第一季

reference to : http://www.cnblogs.com/hanyonglu/p/4244035.html#undefined 2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议. 主要从三个方面展开,Android的渲染机制,内存与GC,电量优化.下

【转】雄鹰计划-卓越工程师炼成记

原文网址:http://bbs.elecfans.com/jishu_400775_1_1.html 注意:雄鹰计划所有信息都将有朱兆祺ForARM进行实时更新,注意不良人士的骗局.这个计划全程免费.报名审核通过者凭借电子发烧友论坛用户名完成下面三项: 1.朱兆祺ForARM步步为营之单片机QQ群:110291944,凭借电子发烧友论坛用户名加入. 2.朱兆祺ForARM步步为营之单片机PCB领取,拍下时凭借电子发烧友论坛用户名领取: http://item.taobao.com/item.ht

.NET面试题(三)

第1讲:面试前期准备 1.了解相关技术职务需要的技术人才                              2.准备一份出色的个人简历 第2讲:面试前期准备                             1. 多渠道获取面试途径                            2.投递简历注意事项                            3. 掌握面试过程…… 第3讲:全面认识.NET框架 1.面试题 介绍CTS.CLS.CLR