cocos2dx中的定时器
一、默认的定时器
1、定时器函数update
(1)每一个节点都有一个默认的update函数,该函数继承与父类,因此当我们使用默认的update函数时需要对它
进行重写。
// 重写默认update函数
virtual void update(float dt);
(2)函数参数解释:update函数里面有一个float dt的参数,这个参数的意义是上一次调用这个函数到本次调用这个函数中间
间隔了多少秒。对于这个函数参数的意义需要注意一下,游戏设计的过程中通常需要注意到这一点。例如:如果在update
函数体中写位移的逻辑时,需要使“位移增量 * dt”。dt代表update函数执行的两次执行的时间间隔,可以理解为与设备的帧率有关系。假设有A设备,帧率为60帧/s,
B设备,帧率为80帧/s。则dt_A = 1.0/60s, dt_B = 1.0f / 80s。在单位之间1秒内,设备A调用update函数60次,
设备B调用update函数80次。如果update函数体中移动的逻辑不乘以dt:A设备移动为 60 * offset, B设备移动
80 * offset。那么想象一下,一个由于在不同的设备中产生了不同的移动效果合理吗?假如我们在update函数体的位移逻辑中乘以这个dt参数呢?设备A移动:60 * offset * 1 / 60 = offset;
设备B移动:80 *offset * 1 / 80 = offset。这样才是一个合理的游戏规则,而不是一个设计bug。
2、默认定时器函数的调用
对于默认定时器函数的调用,我们可以使用scheduleUpdate函数来实现,以此执行默认的update函数,并且
每帧执行一次。原理:使用scheduleUpdate()函数来是默认的update函数执行起来的时候,该函数会把当前的节点(类对象:可能
是一个Layer,Node等)添加到指定的队列中。处于该队列中的节点每一帧都会被调用以此默认的update函数。
3、默认定时器函数的关闭
unscheduleUpdate()函数用来关闭默认的定时器函数,相当于把该节点对象从上述队列中移除。
4、示例
我们在默认update函数中打印“I love China, I am a Chinese!”,每调用一次该函数都进行一次计数,
当打印5次之后我们关闭这个默认定时器函数的刷新。
// update函数体
void update(float dt)
{static int count = 1;if(5 == count){// 停止调用 this->unscheduleUpDate();}log("I love China, I am a Chinese!");
}
二、自定义定时器
1、定时器函数的自定义
每一个节点只能有一个默认的定时器函数update,并且该默认函数需要进行重写;但是可以有多个自定义的
定时器函数。例如:
// 自定义定时器函数
void myUpdate(float dt);
void myUpdate(float dt)
{log("my update");
}
2、自定义定时器函数的调用
通常使用schedule函数来调用自定义的update函数的运行,schedule函数的声明如下:
/*参数说明:
selector:回调函数,即将要调用的定时器函数。SEL_SCHEDULE表示指定回调函数的形式,用于定时器的回调。
interval:表示对回调函数进行两次调用的时间间隔
repeat:表示定时器函数调用的次数,调用次数 = repeat + 1。默认参数是进行无限次调用
delay:表示第一次调用定时器函数之前进行的延时时间。
*/
void schedule(SEL_SCHEDULE selector);
// 和默认定时器函数的调用一样,每一帧都会进行调用
void schedule(SEL_SCHEDULE selector, float interval);
// 立刻调用自定义的update函数,定时器调用的时间间隔是interval
void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
// 延时delay之后调用定时器函数,两次调用的时间间隔是interval,调用repeat+1次
void scheduleOnce(SEL_SCHEDULE selector, float delay);
// 延时delay之后调用一次定时器函数 // 说明:
当然这里还有以lambda表达式的形式调用定时器函数,但是这里就不再罗列出来,有兴趣的可以自行查看。
3、自定义定时器函数的停止
void unschedule(SEL_SCHEDULE selector); // 关闭某一自定义的定时器函数 // 如果想要关闭当前节点的所有定时器函数,包含默认的定时器,可以使用该函数 void unscheduleAllSelectors();
4、示例:
// 自定义定时器函数
void myUpdate(float dt)
{static int count = 1;if(5 == count){// 关闭自定义定时器函数 this->unschedule(schedule_selecotr(MyClass::myUpdate));}log("I love China, I am a Chinese!");
}// 调用自定义定时器函数
this->schecule(schedule_selecotr(MyClasses::myUpdate), 0.1f);
cocos2dx中的定时器相关推荐
- Cocos2dx中零散知识点
cocos2dx中有三种定时器:schedule,scheduleUpdate,scheduleOnce.功能分别是 每隔几秒调用自定义函数.调用系统默认的update()函数.只调用一次自定义函数 ...
- cocos2d-x中的动作分析
在cocos2d-x中动作的执行调度是受cocos2d-x的全局定时器控制的,当初始完导演后便已经启动用于管理动作的update定时器. bool CCDirector::init(void) {.. ...
- java怎么加定时器_JAVA WEB程序中添加定时器
JAVA WEB程序中添加定时器 //这是我的定时器类,用来定时执行某段任务: package com.my.time; import java.text.ParseException; import ...
- Cocos2d-X中实现菜单特效
Cocos2d-X中能够讲菜单和动作结合起来使用实现菜单特效 程序实例1:使用菜单和动作的组合实现菜单特效<一> #include "MenuItem.h"CCScen ...
- cocos2d-x中的curl
将请求的接口的动作放在互斥锁中进行 1: 2: 3: pthread_mutex_t mutex; 4: pthread_t thread; 5: sem_t * m_structSem; 6: 7: ...
- Cocos2d-x中的坐标系
绘图坐标系:它是最常见的坐标系,与OpenGL采用的坐标系相同,以左下角为原点,向右为X轴正方向,向上为Y轴正方向.在Cocos2d-x中,一切绘图相关的操作都使用绘图坐标系,如游戏元素中的Posit ...
- 【cocostudio】发布资源在Cocos2d-x中如何使用
http://cn.cocos2d-x.org/tutorial/show?id=1945 1. 新版本的加载方式: 使用Cocos Studio 2.0发布的CSB资源更换了加载方式,需要用CSLo ...
- 深入cocos2d-x中的touch事件
深入cocos2d-x中的touch事件 在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的. 我们最 ...
- VC++控制台程序中使用定时器
我现在项目是一个控制台程序,用到的Win32API都是与界面无关的,今天需要加入定时器刷新的功能,由于没有消息循环,所以WM_TIMER消息应该如何处理呢?综合了下网上找到的资料,写了个简单的demo ...
最新文章
- 在Java中使用分隔符(拆分的对立面)连接数组元素的快速简便方法
- delphi 执行一个外部程序,当外部程序结束后言主程序立即响应
- SAP云平台架构概述
- python编写请求参数带文件_转载:如何编写一个带命令行参数的Python文件
- JFreeChart(五)之XY图
- (网页)swiper.js轮播图插件
- CSS浮动(float)属性学习经验分享
- node path html模块,深入理解node.js之path模块
- DBA警世录:备份重于一切
- 动态规划——洛谷1020_导弹拦截(1999年的)
- 利用Codejock创建TaskPanel(ToolBox) - 2
- kaldi运行thchs30例子
- QuickZIP V1.21 源码 【学习SharpZipLib的必看!】【以SharpZipLib为基础完成】【VB.Net】
- python excel表格的导入和excel中插入折线图
- 360极速浏览器、360浏览器如何清除缓存、清除历史记录、清除cookies
- Java实现首字母大写
- 茶云个人导航系统v1.2源码 带后台+网易云歌单播放功能+腾讯智能在线客服功能
- TPS和QPS 并发量区别;日活 访问量 活跃度
- 几何光学学习笔记(3)- 2.1光线经过单个折射球面的折射
- python中leap是什么意思_您知道leap是什么意思吗?
热门文章
- 数据分析及可视化——京东上销量最高的鞋子
- 犀牛Rhino 4.0-6.5 安装说明
- 【java学习】EasyExcel的简单使用
- 比较水的计算机一区论文,计算机与信息安全学院于SCI一区TOP期刊发表高水平学术论文...
- 中文日期格式转成英文日期格式
- bios 刷 灵耀14_华硕灵耀14 2020深度体验——这才是正统轻薄本
- 将GeoJson面域转换成PPT可编辑的多段线
- sigmoid函数是如何诞生的(最大熵原理)
- 智慧灯杆三维可视化决策系统平台(数字孪生)-解决方案开发案例
- python网站模板下载_Python 的 Web 应用程序模板 - Visual Studio | Microsoft Docs