JS数据驱动的定时器开关(可暂停)

JavaScript017

JS数据驱动的定时器开关(可暂停),第1张

原本我们若想将一个定时器暂停或清除,我们通常会用clearInterval()的方法。我们在setInterval时存储这个Interval的id,之后再需要暂停时通过id查找并清除该定时器(甚至需要记录请出时变化的数据),等到需要定时器继续运转我们就setInterval()在创建一次。

本次在大量使用定时器的过程中,为了优化繁琐的操作,我给定时器内部回调函数添加了数据驱动, 每个操作对应 一个常驻定时器 只在页面初始化时创建一次定时器,后续不再重新创建或释放

接下来我会举几个本次做的例子:

如果我们用传统释放定时器的方式,那么释放时我们还需记录运行时间,当前状态等。重新创建我们还需要把记录的值传递进去,不甚繁琐。

以上两个例子就是本次思想的精髓, 之后准备二次封装一个新的定时器,敬请期待

做完了: 数据驱动二次封装定时器工具类

球球你们看完点个赞吧。

js中两种定时器的设置及清除

循环执行:

var timeid = window.setInterval(“方法名或方法”,“延时”)

window.clearInterval(timeid)

<script type="text/javascript">

$(document).ready(function(){    //循环执行,每隔1秒钟执行一次 1000     var

t1=window.setInterval(refreshCount, 1000)

function refreshCount() {

console.log("ready")

}

//去掉定时器的方法

window.clearInterval(t1)

})

</script>

2.定时执行:当方法执行完成定时器停止(但是定时器还在,只不过没用了)

var tmid = window.setTimeout(“方法名或方法”, “延时”)

window.clearTimeout(tmid)

<script type="text/javascript">

$(document).ready(function(){    //定时执行,5秒后执行

var t1=window.setTimeout(refreshCount, 1000 * 5)   function refreshCount() {

console.log("ready")

}    //去掉定时器的方法      window.clearTimeout(t1)

})

</script>

简单来说,如果你想不断去执行某个函数,或者每隔一段时间去执行一次某函数,甚至只执行一次,这时,我们就会用到定时器。比如在游戏开发中每隔一段时间要刷新一些数据,或者要随时间的变化而做一些逻辑判断时,就常常用到定时器。

定时器就是指定时间间隔调用指定的函数,去完成特定的功能。

Cocos2d-x定时器为游戏提供定时事件和定时调用服务。所有的Node对象都知道如何调度和取消调度对象,所以也有人管定时器叫调度器。

二.使用定时器有以下几个好处:

1.每当Node不再可见或已从场景中移除时,定时器会停止。Cocos2d-x暂停时,定时器也会停止,比如Node被删除或setVisible(false)时与其绑定的定时器会被停止,使用Director的Pause()方法暂停游戏时定时器也会被停止掉;

2.当Cocos2d-x重新开始时,定时器也会自动继续启动,如执行Director的Resume()方法时;

3.Cocos2d-x封装了一个供各种不同平台使用的定时器,就是说cocos的定时器是跨平台的。

三.Cocos2d-x调度器分3种:

默认调度器:scheduleUpdate()

自定义调度器:schedule()

单次调度器:scheduleOnce()

四.下面我们就来依次看看这3种调度器是怎么使用的:

一).默认调度器:schedulerUpdate()

默认调度器使用Node的刷新事件update方法,该方法在每帧绘制之前都会被调用一次。

我们在使用默认调度器(schedulerUpdate)时候,需要重载Node的update方法来执行自己的逻辑代码。如果需要停止这个调度器,可以使用unschedulerUpdate()方法。

接下来举个例子来看看默认调度器的具体实现,新建一个cocos工程,我们只在HelloWorldScene.h和HelloWorldScene.cpp这两个文件中做修改:

1).首先在头文件HelloWorldScene.h里声明重写的update方法,这个方法就是默认调度器的回调函数:

//声明系统自带的schedule回调函数

virtual void update(float t)

2).在HelloWorldScene.cpp文件中实现update方法,可以在该方法中执行我们自己的逻辑代码,这里我只做下打印:

//实现schedule的回调函数

void HelloWorld::update(float t)

{

log("update!")

}

3).通过scheduleUpdate()方法执行调度器,该方法是与其回调方法update()绑定到一起的,也就是说该方法一旦被某个Node执行,该Node的update()方法就会被执行,我把它写在.cpp文件的 HelloWorld::init()方法中:

//执行系统调度器

this->scheduleUpdate()

运行结果:

可以看到,执行scheduleUpdate()方法后,update()回调方法会不断执行打印,那么这个update()回调方法多久执行一次呢?前面说了,该方法在每帧绘制之前都会被调用一次,所以理论上在无卡顿情况下每秒执行60次update()方法。

二).自定义调度器:schedule()

顾名思义,该调度器就是我们可以对调度进行相关属性的自定义,比如调度事件触发的时间间隔、触发次数等等。

举个例子:

1).在.h文件中声明自定义调度器的回调函数,注意该方法不是系统的而是我们自己写的,所以方法名也是我们自己起的:

//声明自定义调度器回调函数

virtual void customScheduleCallback(float t)

2).在.cpp文件中实现刚刚声明的回调函数,这里也只做打印:

//实现回调函数

void HelloWorld::customScheduleCallback(float t)

{

log("customScheduleCallback!")

}

3).通过schedule()方法执行自定义调度器,该方法有4个参数:

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

参数1:selector为要绑定的回调函数;

参数2:interval为事件触发时间间隔;

参数3:repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数;

参数4:delay表示第一次触发之前的延时。

我还把它写在.cpp文件的 HelloWorld::init()方法中:

//执行自定义调度器

this->schedule(schedule_selector(HelloWorld::customScheduleCallback),2.0,5,3)

运行结果:

注意,第三个参数repeat值为5,表示触发一次事件后还会触发5次,所以一共有6次打印,而且每一次打印输出的时间间隔为2秒。

三).单次调度器:scheduleOnce()

单次调度器只进行一次调度,即只执行一次回调函数。该调度器的使用方法和之前2种调度器基本一致,都是声明回调方法、实现回调方法、使用调度器。

举个例子:

1).在.h文件中声明单次调度器的回调函数:

//声明单次调度器回调函数

virtual void onceScheduleCallback(float t)

2).在.cpp文件中实现回调函数:

//实现回调函数

void HelloWorld::onceScheduleCallback(float t)

{

log("onceScheduleCallback!")

}

3).通过scheduleOnce()方法执行单次调度器,该方法有2个参数:

参数1:要绑定的回调函数

参数2:第一次触发之前的延时

//执行单次调度器

this->scheduleOnce(schedule_selector(HelloWorld::onceScheduleCallback), 3)

运行结果:

可以看到,程序运行3秒后看到了一次打印输出,之后便不再打印了。

最后,一句话总结,使用调度器无非就是使用3个方法:scheduleUpdate()、schedule()、scheduleOnce(),另外写好需要绑定的回调函数,完事!

以上。

点击阅读全文

打开CSDN,阅读体验更佳

Cocos2d-x中关于schedule函数的一点理解_tsbyj的博客

cocos 2dx---schedule(五) zion--6135的博客 238 bool HelloWorld::init() { // 1. super init first if ( !Scene::init() ) { return false} printf("1\n")//this->schedule(CC_SCHEDULE_SELECTOR(HelloWorld::...

cocos 2dx-Lua使用schedule定时器_平淡风云的博客_lua sched...

使用方法很简单 local scheduler = require("framework.scheduler") local handler = scheduler.scheduleGlobal(function() -- 想做的事情 end, 0.2) -- 调用间隔 scheduler.unscheduleGlobal(handler) -- 取消定时器...

cocos2d-x学习笔记(13)--schedule .rar

cocos2d-x学习笔记(13)--schedule .rar

cocos Creator计时器schedule的使用和坑

在游戏开发中,经常会用到计时器,在cocos引擎中,为我们默认提供了多种计时器的使用。在最新的cocos开发工具Cocos Creator中,我们有4种计时器可以使用,分别是js自带的setTimeOut、interval以及cocos的schedule和scheduleOnce,setTimeOut和scheduleOnce都是执行几次操作,指定一定时间后执行,interval和schedule

继续访问

cocos2dx三种定时器的使用以及停止scheduleUpdate,scheduleOnce,schedule(改)

(Sam: 原文作者有笔误,影响理解,这里做了正确的修改) 首先,什么是定时器呢?或许你有时候会想让某个函数不断的去执行,或许只是执行一次,获取你想让他每隔几秒执行一次,ok,这些都可以统统交给定时器来解决。 cocos2dx中有三种定时器:schedule,scheduleUpdate,scheduleOnce。了解其功能便会发现定时器真是太方便了,废话不多说,我们逐一学习一下。

继续访问

CocosCreator-Schedule计时器-设定及触发原理

计时器 JavaScript自带的定时任务 setTimeout 作用:设置一个定时器,在指定时间(毫秒)后触发,调用传入的回调函数。 参数类型:(function/code, delayTime, args…) function: 回调函数 code: 字符串形式的代码,会使用eval()执行,因此不推荐使

继续访问

cocoscreate使用定时器schedule

这是标题普通对象使用定时器注册定时器注销定时器特殊对象使用定时器注册定时器注销定时器 普通对象使用定时器 注册定时器 // 一般会在节点生命周期里的start函数里注册定时器 start () { // schedule函数注册定时器,第一个参数是回调函数,第二个参数是间隔时间,第三个参数是执行多少次,也可以不写,不写就是不停的执行 this.schedule(this.onTimeFuntion, 1, 6)// 这行代码表示每秒执行一次onTimeFunti

继续访问

最新发布 Cocos Creator 源码解读之Schedule

creator 里面的计时器相信大家不陌生,但是了解它的原理是必要的,它的运行机制和setInterval有什么不同呢, 先简单说说setInterval的原理:setInterval是每隔一段时间向事件队列里面添加回调函数,如果主线程忙的话调用时间不确定特别容易出问题,由于setInterval只负责定时向队列中添加函数,而不考虑函数的执行,setInterval有一个原则:在向队列中添加回调函数时,如果队列中存在之前由其添加的回调函数,就放弃本次添加(不会影响之后的计时),如果主线程忙的话,之前添加的

继续访问

cocos 2dx--------schedule(五)

bool HelloWorld::init() { // 1. super init first if ( !Scene::init() ) { return false} printf("1\n")//this->schedule(CC_SCHEDULE_SELECTOR(HelloWorld::fun_Callback), 1.0f)//每一秒运行依次fun_Callback()函数 //this->sc.

继续访问

Cocos2d-x lua 使用定时器

打开一个定时器:schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(调用的function, 定时时间(秒), 是否暂停(true, false)) 关闭定时器:cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedul...

继续访问

Cocos-2dx lua 定时器

Cocos2dx 3.x Lua 中定时器的两种使用方式:  (1)self:scheduleUpdateWithPriorityLua(update, priority) >参数一:刷新函数 >参数二:刷新优先级 其中 self 为 Node类 的子类。 该方法默认为每帧都刷新一次,无法自定义刷新时间间隔。  (2)scheduler:scheduleScriptFunc(update, inteval, false)  ...

继续访问

Cocos2d-x 3.x基础学习: 定时器更新schedule/update

大部分游戏中定时器是不可或缺的,因为即每隔一段时间,就要执行相应的刷新体函数,以更新游戏的画面、时间、进度、敌人的指令等等。 Cocos2d-x为我们提供了定时器schedule相关的操作。其操作函数的定义在CCNode中,所以基本上大多数的引擎类都可以设置定时器,如CCLayer、CCSprite、CCMenu等。 定时器更新的方式分为三类: (1)默认定时器 :scheduleUpdate()(2)自定义定时器:schedule()(3)一次性定时器:schedu...

继续访问

cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce

今天白白跟大家分享一下cocos2dx中定时器的使用方法。

继续访问

Cocos Creator 分帧加载(js - schedule)

效果 loadingFrame.js cc.Class({ extends: cc.Component, properties: { hello: cc.Prefab, content: cc.Node, mask: cc.Node, // animation: cc.Animation, }, onLoad() { this.mask.active = false// t

继续访问

cocos2dx调度器schedule

cocos2dx调度器schedule Cocos2d-Lua 引擎中的调度器是用来周期执行某个函数或延时执行某个函数的。功能类似于定时触发器,但它又与游戏紧密结合。 schedule调度器利用了timer类来保存了调度任务的 时间线,重复次数,事件间隔,延迟等数据。timer把相关信息以结构体的形式存进了双向链表_hashForTimers中 每帧更新后Timer做事件累加,根据时间线去触发或者取消更新回调。 每帧更新每帧更新...

继续访问

Cocos2d-JS下用schedule实现倒计时

Cocos2d-JS下用schedul实现倒计时 前言 本文所记录的内容是在Cocos Code IDE平台完成的,主要是记录一下2048游戏下用schedule实现倒计时。第一次写博客,如有错误望指教。 提示:以下是本篇文章正文内容,下面案例仅供参考 一、schedule是什么? schedule可以每隔几秒执行某个自定义的函数; 而scheduleOnce是在几秒之后才执行,并且只会执行一次。 二、使用步骤 1.定义 代码如下(示例): 先在对应的游戏层定义倒计时时间 var GameLayer =

继续访问

cocos定时器分析

注:COCOS分析的版本为3.4 COCOS的定时器是通过一个哈希表进行保存的,每一帧循环的时候都会调用定时器的update方法,并传入两帧之间的时间间隔 /*void Scheduler::update(float dt)*/,在update方法中对哈希表进行轮询调用回调函数。 在轮询调用中将定时器分为四种,其中三种是每一帧必定循环调用的方法,struct _listEntry *_upda

继续访问

cocos 定时器schedule

1.schedule如其名,以指定的时间间隔调用一个指定的函数。系统最小间隔是frame time(即帧间隔),可以由自己设定帧间隔 selector调用分为:自定义函数和update 另外动画(action)类型也会和定时器有关 如下使用方式: [self schedule:@selector(gameLogic:) interval:1.0] //表示以1秒时间间隔调用函数game

继续访问

Cocos Creator之schedule第一个时间段不执行的解决方法

1、 schedule的官方文档地址。 2、 介绍如下: 指定回调函数,调用对象等信息来添加一个新的定时器。 如果 paused 值为 true,那么直到 resume 被调用才开始计时。 当时间间隔达到指定值时,设置的回调函数将会被调用。 如果 interval 值为 0,那么回调函数每一帧都会被调用,但如果是这样, 建议使用 scheduleUpdateForTarget 代替。 如果回调函...

继续访问

【爱上cocos2d-x之十六】取消定时器unSchedule

懂得如何创建定时器,当然,我们也要懂得如何取消定时器啦。此文章,建立在前两篇的基础上。 (1)取消默认的定时器,只要一句代码 this->unscheduleUpdate()备注:不管我们注册update函数时,用的是一个还是两个参数,在取消时都不需要传递参数,只需传递函数就可以了。 (2)取消自定义的定时器 this->unschedule(schedule_sel