1.定义

定时器在大部分游戏中是不可或缺的,即每隔一段时间,就要执行相应的刷新体函数,以更新游戏的画面、时间、进度、敌人的指令等等。

cocos2dx为我们提供了定时器schedule相关的操作。其操作函数的定义在CCNode中,所以基本上大多数的引擎类都可以设置定时器,如CCLayer、CCSprite、CCMenu等。

2.种类

定时器更新的方式分为三类:

(1)默认定时器  :scheduleUpdate();

(2)自定义定时器:schedule();

(3)一次性定时器:scheduleOnce();

3.Demo下载

https://github.com/shahdza/Cocos_LearningTest/tree/master/demo_%E5%AE%9A%E6%97%B6%E5%99%A8schedule%E3%80%81update

4.scheduleUpdate

默认定时器:scheduleUpdate()。

该定时器默认刷新次数与屏幕刷新频率有关。如频率为60帧每秒,那么scheduleUpdate每秒执行60次刷新。

与scheduleUpdate其对应的刷新函数体为update(),即每一帧会执行一次update()函数。

相关操作如下:

 //
//开启默认定时器。刷新间隔为一帧。
void scheduleUpdate();
void scheduleUpdateWithPriority(int priority); //给予优先级priority。priority越小,优先级越高 virtual void update(float delta); //update为scheduleUpdate定时器的刷新函数体.
//

5.schedule

自定义定时器:schedule()。

该定时器可以自定义指定的刷新函数体、刷新函数体的次数、刷新频率、以及开始刷新的时间。

函数体不一定为update(),可以自己定义。

相关操作如下:

  //
//设置自定义定时器。默认刷新间隔为一帧。
// interval : 每隔interval秒,执行一次。
// repeat : 重复次数。
// delay : 延迟时间,即创建定时器delay秒后开始执行刷新。
//schedule( schedule_selector(HelloWorld::myUpdate), 1.0/60.0 );
void schedule(SEL_SCHEDULE selector); //默认刷新间隔为一帧
void schedule(SEL_SCHEDULE selector, float interval); //自定义刷新间隔,单位:秒
void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
//

6.scheduleOnce

一次性定时器:scheduleOnce()。

该定时器在等待delay秒延迟时间后,只执行一次刷新函数体,之后就不再刷新。

相关操作如下:

  //
//只执行一次,delay秒后执行
//scheduleOnce( schedule_selector(HelloWorld::myUpdate), 5.0 );
void scheduleOnce(SEL_SCHEDULE selector, float delay);
//

7.其他操作

定时器的取消、暂停、恢复。

相关操作如下:

 //
//this->unscheduleUpdate();
//sprite->unscheduleAllSelectors();
void unscheduleUpdate(void); //取消默认定时器
void unschedule(SEL_SCHEDULE selector); //取消自定义函数的定时器
void unscheduleAllSelectors(void); //取消所有定时器
void pauseSchedulerAndActions(void); //暂停所有定时器和动作
void resumeSchedulerAndActions(void); //恢复所有定时器和动作
//

代码实战(这是2.x的版本格式,可以自己改为3.x的版本格式)

1、在HelloWorld::init()中创建五个精灵

精灵和五种定义定时器的方法,一一对应。

  //
//创建五个精灵
CCSprite* sp = CCSprite::create("Icon.png");
sp->setPosition( ccp(, mysize.height - ) );
this->addChild(sp, , ); //tag标记100 CCSprite* sp1 = CCSprite::create("Icon.png");
sp1->setPosition( ccp(, mysize.height - ) );
this->addChild(sp1, , ); //tag标记101 CCSprite* sp2 = CCSprite::create("Icon.png");
sp2->setPosition( ccp(, mysize.height - ) );
this->addChild(sp2, , ); //tag标记102 CCSprite* sp3 = CCSprite::create("Icon.png");
sp3->setPosition( ccp(, mysize.height - ) );
this->addChild(sp3, , ); //tag标记103 CCSprite* sp4 = CCSprite::create("Icon.png");
sp4->setPosition( ccp(, mysize.height - ) );
this->addChild(sp4, , ); //tag标记104 //定义五个定时器,更新精灵
this->scheduleUpdate();
this->schedule( schedule_selector(HelloWorld::myupdate) );
this->schedule( schedule_selector(HelloWorld::myupdate2), 1.0f );
this->schedule( schedule_selector(HelloWorld::myupdate3), 1.0f, , 3.0f);
this->scheduleOnce( schedule_selector(HelloWorld::myupdate4), 5.0f );
//

2.编写定时器对应的刷新函数体

 //
//scheduleUpdate
void HelloWorld::update(float dt)
{
CCSprite* sp = (CCSprite*)this->getChildByTag(); //获取 tag=100 的精灵
sp->setPosition( sp->getPosition() + ccp(,) ); //每帧移动1
} //schedule(schedule_selector)
void HelloWorld::myupdate(float dt)
{
CCSprite* sp1 = (CCSprite*)this->getChildByTag(); //获取 tag=101 的精灵
sp1->setPosition( sp1->getPosition() + ccp(,) ); //每帧移动1
} //schedule(schedule_selector, interval)
void HelloWorld::myupdate2(float dt)
{
CCSprite* sp2 = (CCSprite*)this->getChildByTag(); //获取 tag=102 的精灵
sp2->setPosition( sp2->getPosition() + ccp(,) ); //每秒移动60
} //schedule(schedule_selector, interval, repeat, delay)
void HelloWorld::myupdate3(float dt)
{
CCSprite* sp3 = (CCSprite*)this->getChildByTag(); //获取 tag=103 的精灵
sp3->setPosition( sp3->getPosition() + ccp(,) ); //每秒移动60
} //scheduleOnce
void HelloWorld::myupdate4(float dt)
{
CCSprite* sp4 = (CCSprite*)this->getChildByTag(); //获取 tag=104 的精灵
sp4->setPosition( sp4->getPosition() + ccp(,) ); //移动100
}
//

3.运行结果

 

4.分析和总结

(1)scheduleUpdate()和schedule(schedule_selector)的效果一样,只是schedule可以自定义刷新函数体,不一定是update()。而scheduleUpdate()的刷新函数体只能为update()。

(2)schedule(schedule_selector, interval):设置了interval=1.0,所以每隔1.0秒执行了一次myupdate2()。

(3)schedule(schedule_selector, interval, repeat, delay):在开始3.0f秒后才开始执行myupdate3(),并且之后又重复执行了5次,就停止更新了。

(4)scheduleOnce(schedule_selector):在开始5秒后,只执行了一次myupdate4(),就停止更新了。

本文出自 “夏天的风” 博客 http://shahdza.blog.51cto.com/2410787/1542014

关于Cocos2d-x中定时器的使用总结的更多相关文章

  1. Unity3D中定时器的使用

    源地址:http://unity3d.9tech.cn/news/2014/0402/40149.html 在游戏设计过程中定时器是必不可少的工具,我们知道update方法是MonoBehavior中 ...

  2. 如何在cocos2d项目中enable ARC

    如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...

  3. 如何在Cocos2D游戏中实现A*寻路算法(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  4. 如何在Cocos2D游戏中实现A*寻路算法(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  5. WPF中定时器与进度条的配合使用

    WPF中定时器使用的注意事项: WPF需要使用System.Windows.Threading.DispatcherTimer定时器,而不能使用System.Timers.Timer定时器.因为Sys ...

  6. [转]Qt中定时器使用的两种方法

    Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...

  7. JS中定时器的返回数值ID值

    定时器会返回一个数字值id,可以由clearInterval(id)或clearTimeout(id)来实现对对应定时器的清除. setInterval()/setTimeout()BOM中的Wind ...

  8. Java中定时器Timer致命缺点(附学习方法)

    简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...

  9. Javascript中定时器的使用方法

    Javascript中定时器的使用方法 1.间隔定时器(每隔一段时间执行一次代码) 格式:setInterval(函数,时间) //时间单位是毫秒,每隔设置的时间执行函数里的内容一遍(一直执行) // ...

  10. SpringMVC中定时器继承Task后无法对service注入问题

    最近在做一个Spring+MyBatis的一个项目,其中用到了Redis的存储,然后遇到问题是这样的: RedisTask是通过定时器来每分钟像数据库里推送的,于是就有了 public class R ...

随机推荐

  1. OGG_GoldenGate数据控制进程Manager(案例)

    2014-03-03 Created By BaoXinjian

  2. c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

    //求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ...

  3. jquery 事件注冊 与反复事件处理

    <!doctype html> <html lang="us"> <head> <meta charset="utf-8&quo ...

  4. Python 列表 remove() 方法

    描述 Python 列表 remove() 方法通过指定元素的值来移除列表中某个元素的第一个匹配项,如果这个元素不在列表中会报一个异常. 语法 remove() 方法语法: L.remove(obj) ...

  5. PHP笔试题

    1.不用新变量直接交换现有两个变量的值 (1)list($a,$b)=array($b,$a); (2)a=a+b,b=a-b,a=a-b 2.PHP数字金额转大小格式,同时说明思路 function ...

  6. Centos编译Hadoop 2.x 源码

    1. 前言 Hadoop-2.4.0的源码目录下有个BUILDING.txt文件,它介绍了如何在Linux和Windows下编译源代码,本文基本是遵照BUILDING.txt指示来操作的,这里再做一下 ...

  7. c语言常量指针赋值给变量指针导致警告

    常量指针定义:常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针.指针指向的对象是常量,那么这个对象不能被更改.常量指 ...

  8. 【Android】6.0 第6章 对话框--本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-08 在Android应用中,常用的对话框有:Toast.AlertDialog.ProgressDialog.时间选择对话框.日 ...

  9. protobuf c++入门

    1.在.proto文件中定义消息格式 2.使用protobuf编译器 3.使用c++ api来读写消息   0.为何使用protobuf?   1.原始内存数据结构,可以以二进制方式sent/save ...

  10. 说实话当一个程序猿不easy

    我以前说过,程序猿不是一般的人,是具有某种超能里的人.但问题是.程序猿往往意识不到自己的这样的特异功能.在他们的眼里.会觉得自己非常普通.跟常人一样,所以,程序猿能做到的事情,其它人--比方他们的客户 ...