每一个游戏程序都有一个循环在不断运行,它是有导演对象来管理很维护。如果需要场景中的精灵运动起来,我们可以在游戏循环中使用定时器(Scheduler)对精灵等对象的运行进行调度。因为Node类封装了Scheduler类,所以我们也可以直接使用Node中调用函数。

Node中调用函数主要有:

void scheduleUpdate ( void )。每个Node对象只要调用该函数,那么这个Node对象就会定时地每帧回调用一次自己的update(float dt)函数。

void schedule ( SEL_SCHEDULE selector,  float  interval )。与scheduleUpdate函数功能一样,不同的是我们可以指定回调函数(通过selector指定),也可以更加需要指定回调时间间隔。

void unscheduleUpdate ( void )。停止update(float dt)函数调度。

void unschedule ( SEL_SCHEDULE selector )。可以指定具体函数停止调度。

void unscheduleAllSelectors ( void )。可以停止调度。

为了进一步了解游戏循环与调度的使用,我们修改HelloWorld实例。

修改HelloWorldScene.h代码,添加update(float dt)声明,代码如下:

  1. class HelloWorld : public cocos2d::Layer
  2. {
  3. public:
  4. ... ...
  5. virtual void update(float dt);
  6. CREATE_FUNC(HelloWorld);
  7. };
  8. 修改HelloWorldScene.cpp代码如下:
  9. bool HelloWorld::init()
  10. {
  11. ... ...
  12. auto label = LabelTTF::create("Hello World","Arial", 24);
  13. label->setTag(123);                                                                                                                       ①
  14. ... ...
  15. //更新函数
  16. this->scheduleUpdate();                                                                                                              ②
  17. //this->schedule(schedule_selector(HelloWorld::update),1.0f/60);                                              ③
  18. return true;
  19. }
  20. voidHelloWorld::update(float dt)                                                                                                      ④
  21. {
  22. auto label =this->getChildByTag(123);                                                                                  ⑤
  23. label->setPosition(label->getPosition()+ Point(2,-2));                                                                   ⑥
  24. }
  25. void HelloWorld::menuCloseCallback(Ref*pSender)
  26. {
  27. //停止更新
  28. unscheduleUpdate();                                                                                                           ⑦
  29. Director::getInstance()->end();
  30. #if (CC_TARGET_PLATFORM ==CC_PLATFORM_IOS)
  31. exit(0);
  32. #endif
  33. }

为了能够在init函数之外访问标签对象label,我们需要为标签对象设置Tag属性,其中的第①行代码就是设置Tag属性为123。第⑤行代码是通过Tag属性获得重新获得这个标签对象。

为了能够开始调度还需要在init函数中调用scheduleUpdate(见第②行代码)或schedule(见第③行代码)。

代码第④行的HelloWorld::update(floatdt)函数是在调度函数,精灵等对象的变化逻辑都是在这个函数中编写的。我们这个例子很简单只是让标签对象动起来,第⑥行代码就是改变它的位置。

为了省电等目的,如果不再使用调度,一定不要忘记停止调度。第⑦行代码unscheduleUpdate()就是停止调度update,如果是其他的调度函数可以采用unschedule或unscheduleAllSelectors停止。

cocos2d-x游戏循环与调度的更多相关文章

  1. Cocos2d-x 核心概念 - 游戏循环与调度

    每一个游戏程序都有一个循环在不断运行,他是由导演对象来管理和维护. 如果需要场景中的精灵运动起来,我们可以在循环中使用定时器(Scheduler)对精灵等对象的运行进行调度 因为Node中封装了 Sc ...

  2. cocos2d-x游戏循环和日程安排

    每场比赛有一个程序执行周期继续.这是导演对象来管理非常维修.在运动假设需要的场景精神,我们可以使用计时器在游戏圈(Scheduler)精灵和其他对象进行调度. 由于Node类封装了Scheduler类 ...

  3. 【Visual C++】游戏编程学习笔记之三:游戏循环的使用

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...

  4. C#游戏开发中快速的游戏循环

    C#游戏开发中快速的游戏循环的实现.参考<精通C#游戏编程>一书. using System; using System.Collections.Generic; using System ...

  5. Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)

    Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ...

  6. Win2D 中的游戏循环:CanvasAnimatedControl

    Win2D 是 DirectX 的一个高层封装,提供了极大 DirectX 性能的同时,又具有很好用的 API 设计. 用 Win2D 除了能做出高性能的视觉效果之外,还可以轻而易举地搭建一个游戏循环 ...

  7. iOS cocos2d 2游戏开发实战(第3版)书评

    2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...

  8. Python:pyglet学习(3):游戏循环

    在我们编游戏时,经常会用到一个无限循环,这就叫游戏循环. 先用@win.event试试 import pyglet as p win=p.window.Window(800,600) @win.eve ...

  9. 3.pygame快速入门-游戏循环及动画实现

    游戏循环的开始,意味着游戏的正式开始,游戏循环的作用如下 1.保证游戏不会直接退出 2.变化图像的位置--动画效果 3.检测用户交互--按键.鼠标等     游戏时钟 pyagame提供了一个pyga ...

随机推荐

  1. Codeforces Round #306 (Div. 2) E. Brackets in Implications 构造

    E. Brackets in Implications Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/conte ...

  2. Android-----使用Button特效 selector+shape

    当然除了使用drawable这样的图片外今天谈下自定义图形shape的方法,对于Button控件Android上支持以下几种属性shape.gradient.stroke.corners等. 我们就以 ...

  3. MySql5.5忘记root密码的解决方法

    试了很多方法,下面这种方法是确保可以成功的,呵呵.转载自:http://hi.baidu.com/bjben/item/722bb50b27baf1dcdde5b097. 申明:本文章应该属于转载,但 ...

  4. TypeHandler的简单实例

    转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420149 TypeHandler是MyBatis config文件中可选的配置选项,其可以对实体属性 ...

  5. iOS开发——网络编程OC篇&使用WebView构建HyBird应用

    使用WebView构建HyBird应用 HyBird是一种本地技术与Web相结合,能过实现跨平台的移动应用开发,最常用的一个框架:PhoneGap 一:首先,写好html代码 <!DOCTYPE ...

  6. SQL Server事务日志介绍

    SQL Server中的数据库都是由一或多个数据文件以及一或多个事务日志文件组成的. 顾名思意,数据文件主要存储数据库的数据,包括数据库内容结构,数据页,索引页等等.那么事务日志到底是干什么的呢?它主 ...

  7. jQuery 的 live() 方法对 hover 事件的处理

    因为hover不是标准的事件,因此无法直接使用live进行处理,故使用以下方法代替,效果一样 <script type="text/javascript"> $(&qu ...

  8. MySQL数据库InnoDB存储引擎中的锁机制

    MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...

  9. 云服务器 ECS Linux 修改编码格式

    https://help.aliyun.com/knowledge_detail/41424.html?spm=5176.7841174.2.19.Le8kvy 通常情况下,云服务器 ECS Linu ...

  10. 分享十个CSS3鼠标滑过文字动画特效

    介绍10组基于CSS3的鼠标滑过文字动画特效,有上凸.下凹等文字动画.这些炫酷的CSS3文字效果可以让网页变得更加绚丽.效果图如下: 在线预览   源码下载 实现的代码. html代码: <h2 ...