每一个游戏程序都有一个循环在不断运行,它是有导演对象来管理很维护。如果需要场景中的精灵运动起来,我们可以在游戏循环中使用定时器(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. UVA 12897 Decoding Baby Boos 暴力

    Decoding Baby Boos Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contes ...

  2. 在C#中使用全局鼠标、键盘Hook

    今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全 ...

  3. 丢失全部控制文件,noresetlogs重建控制文件,alter database open

    測试2: (1)一致性的全备 SQL> shutdown immediate; $ cp -rf $ORACLE_BASE/oradata/boss/*.dbf /oradata/bossbak ...

  4. corner2

    Original: https://github.com/LondonX/corner2 Backup: https://github.com/eltld/corner2

  5. android中判断sim卡状态和读取联系人资料的方法

    在写程序中,有时候可能需要获取sim卡中的一些联系人资料.在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息. Pho ...

  6. $(document).ready()使用讨论

    <script language="JavaScript" type="text/javascript"> $(document).ready(fu ...

  7. QT核心编程之Qt线程 (c)

    QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类 ...

  8. 标准库 - fmt/format.go 解读

    // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

  9. 用shell获取文件大小

    ls -l filename | awk '{ print $5,$9 }' ls -l filename | awk '{ print $5 }'

  10. what is docker

    尽管之前久闻Docker的大名了,但是天资愚钝,对其到底是个啥东西一直摸不清,最近花了一段时间整理了一下,算是整理出一点头绪来. 官网的介绍是这样的: Docker is an open platfo ...