很多童鞋对cocos2d-js中的定时函数很迷茫,不知道是用js自身的定时器比较好,还是用cocos2d自身提供的schedule更靠谱?从代码的可读性、拓展性及实用性上,建议大家统一使用cocos2d自身提供的schedule方法。下面就为大家深入浅出的介绍下schedule:
一、schedule 有三种不同的api:
1. scheduleUpdate():
2. scheduleOnce(callback, delay, key):
Parameters:
{function} callback
A function wrapped as a selector
{Number} delay
The amount of time that the first tick will wait before execution.
{String} key
The only string identifying the callback
3. schedule(callback, interval, repeat, delay, key):
Parameters:
{function} callback
A function wrapped as a selector
{Number} interval
Tick interval in seconds. 0 means tick every frame. If interval = 0, it's recommended to use scheduleUpdate() instead.
{Number} repeat
The selector will be executed (repeat + 1) times, you can use kCCRepeatForever for tick infinitely.
{Number} delay
The amount of time that the first tick will wait before execution.
{String} key
The only string identifying the callback
二、schedule三种api的使用:
1. scheduleUpdate()
以layer为例,在初始化的时候(ctor函数return true 前,其他地方也可以,建议在初始化时)添加:
this.scheduleUpdate(); //开启每帧调用,对应update
接着重写layer的update方法:(这里先定义了一个layer的成员变量time)
update: function(dt) {
this.time += dt; //dt 为上一帧到当前帧的时长
if (this.time >= 3) {
cc.log("每3秒在调试框中输出一次");
this.time = 0;
};
},
2. scheduleOnce(callback, delay, key)
以layer为例,在初始化或其他非解析方法内添加:
//延迟2秒后,只执行一次
this.scheduleOnce(this.once, 2);
接着新建一个once的方法:
once: function() {
cc.log("延迟2秒后,只执行一次");
},
3. schedule(callback, interval, repeat, delay, key)
同样以layer为例,在初始化或其他非解析方法内添加:
//不带参数的回调函数notParameter,延迟5秒后每2秒执行一次,累积执行20次
this.schedule(this.notParameter, 2, 20, 5);
接着新建一个notParameter的方法:
notParameter: function() {
cc.log("不带参数的回调函数notParameter,延迟5秒后每2秒执行一次,累积执行20次");
},
三、schedule的代码示例:
var test = cc.Layer.extend({
time: 0,
ctor: function() {
this._super();
this.time = 0;
this.scheduleUpdate(); //开启每帧调用,对应update
//不带参数的回调函数notParameter,延迟5秒后每2秒执行一次,累积执行20次
this.schedule(this.notParameter, 2, 20, 5);
//带参数的回调函数haveParameter,每1.5秒执行一次,累积执行10次
this.schedule(function nothing() {
this.haveParameter("带参数")
}, 1.5, 10);
//每5秒执行一次,无次数限制
this.schedule(this.notRepeat, 5);
//延迟2秒后,只执行一次
this.scheduleOnce(this.once, 2);
return true;
},
notRepeat: function() {
cc.log("每5秒执行一次");
},
notParameter: function() {
cc.log("不带参数的回调函数notParameter,延迟5秒后每2秒执行一次,累积执行20次");
},
haveParameter: function(s) {
cc.log(s + "的回调函数haveParameter,每1.5秒执行一次,累积执行10次");
},
once: function() {
cc.log("延迟2秒后,只执行一次");
},
update: function(dt) {
this.time += dt; //dt 为上一帧到当前帧的时长
if (this.time >= 3) {
cc.log("每3秒在调试框中输出一次");
this.time = 0;
};
},
onExit: function() {
this._super();
this.unscheduleUpdate(); //移除schedule
this.unschedule(this.notRepeat); //移除没有次数限制的schedule
this.unscheduleAllCallbacks();//移除所有schedule的回调函数
}
});