版权声明:转载时请以超链接形式标明文章原始出处 http://blog.lonelystar.org/post/1.html
最近正在改进游戏程序的执行效率
整合所有的计时器
以一个初步的自定义系统对象控制整个游戏流程的进行
JavaScript语言:
/*系统对象
结构:一个setInterval计时器作为自定义系统时间,10毫秒累加1,1秒即为100
一个setTimeout作为定时执行任务的计时器
一个任务队列,存储着{},格式为
{T:任务执行的系统时间,时间为自定义非JS自带
f:任务执行的函数
ar:执行任务函数的参数,数组形式。执行任务时使用apply传递参数
}
*/
oSym={
Now:0, //系统时间
TQ:[], //系统任务队列
Timer:null, //系统时间定时器
execTask:null, //执行任务计时器
Init:function(f){ //初始化,传递一个函数(CheckLvl:载入关卡文件)
this.TQ=[{T:0,f:f,ar:[]}];
this.Start();
},
Start:function(){
this.Timer=setInterval(function(){
try{++oSym.Now}
catch(e){alert('超时退出游戏');location.reload();}
},10); //系统计时器1秒加100
(function(){ //遍历任务数组判断执行任务
var s=oSym,ar=s.TQ,i=ar.length,t,f;
//当系统时间>=任务可以执行的时间,则执行任务(使用apply使this指向任务)并移除任务
while(i--)s.Now>=(t=ar[i]).T&&((f=t.f).apply(f,t.ar),s.removeTask(i));
s.execTask=setTimeout(arguments.callee,10);
})();
},
Stop:function(){
clearInterval(this.Timer); //停止系统计时
clearTimeout(this.execTask); //停止执行任务
this.Timer=null;
//this.execTask=null;
},
addTask:function(T,f,ar){
//传递当前自定义时间T(实际需要毫秒/单位10毫秒)后,函数名,参数的数组形式
//比如需要在当前时间5秒后执行,传递的T为5000/10=500
var TQ=this.TQ;
TQ[TQ.length]={
T:this.Now+T, //执行时间(自定义的oSym时间)
f:f, //执行函数
ar:ar //参数的数组形式,用于执行函数传递参数
}
return this;
},
removeTask:function(Inx){ //删除指定索引的任务
this.TQ.splice(Inx,1);
return this;
}
}
结构:一个setInterval计时器作为自定义系统时间,10毫秒累加1,1秒即为100
一个setTimeout作为定时执行任务的计时器
一个任务队列,存储着{},格式为
{T:任务执行的系统时间,时间为自定义非JS自带
f:任务执行的函数
ar:执行任务函数的参数,数组形式。执行任务时使用apply传递参数
}
*/
oSym={
Now:0, //系统时间
TQ:[], //系统任务队列
Timer:null, //系统时间定时器
execTask:null, //执行任务计时器
Init:function(f){ //初始化,传递一个函数(CheckLvl:载入关卡文件)
this.TQ=[{T:0,f:f,ar:[]}];
this.Start();
},
Start:function(){
this.Timer=setInterval(function(){
try{++oSym.Now}
catch(e){alert('超时退出游戏');location.reload();}
},10); //系统计时器1秒加100
(function(){ //遍历任务数组判断执行任务
var s=oSym,ar=s.TQ,i=ar.length,t,f;
//当系统时间>=任务可以执行的时间,则执行任务(使用apply使this指向任务)并移除任务
while(i--)s.Now>=(t=ar[i]).T&&((f=t.f).apply(f,t.ar),s.removeTask(i));
s.execTask=setTimeout(arguments.callee,10);
})();
},
Stop:function(){
clearInterval(this.Timer); //停止系统计时
clearTimeout(this.execTask); //停止执行任务
this.Timer=null;
//this.execTask=null;
},
addTask:function(T,f,ar){
//传递当前自定义时间T(实际需要毫秒/单位10毫秒)后,函数名,参数的数组形式
//比如需要在当前时间5秒后执行,传递的T为5000/10=500
var TQ=this.TQ;
TQ[TQ.length]={
T:this.Now+T, //执行时间(自定义的oSym时间)
f:f, //执行函数
ar:ar //参数的数组形式,用于执行函数传递参数
}
return this;
},
removeTask:function(Inx){ //删除指定索引的任务
this.TQ.splice(Inx,1);
return this;
}
}
欢迎您发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
本文现有3 条评论
1 简洁实用,拿走研究一下。
2 Stop:function(){
clearInterval(this.Timer); //停止系统计时
clearTimeout(this.execTask); //停止执行任务
this.Timer=null;
//this.execTask=null;
}
美女请问下...停止的时候 为什么 //this.execTask=null; 要注释掉,不用都设置为null吗
3 (function(){ //遍历任务数组判断执行任务
var s=oSym,ar=s.TQ,i=ar.length,t,f;
//当系统时间>=任务可以执行的时间,则执行任务(使用apply使this指向任务)并移除任务
while(i--)s.Now>=(t=ar[i]).T&&((f=t.f).apply(f,t.ar),s.removeTask(i));
s.execTask=setTimeout(arguments.callee,10);
})()
(...........)()连着2个,有何用意?