版权声明:转载时请以超链接形式标明文章原始出处 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;   
        }   
    }

     

      本文现有3 条评论

    • 1  简洁实用,拿走研究一下。

    • 2   Stop:function(){
      clearInterval(this.Timer); //停止系统计时
      clearTimeout(this.execTask); //停止执行任务
      this.Timer=null;
      //this.execTask=null;
      }
      美女请问下...停止的时候 为什么 //this.execTask=null; 要注释掉,不用都设置为null吗

      楼主 于 2011-10-1 22:00:43 回复
      只需一个即可,因为程序判断系统是否停止只判断Timer是否为Null就行了,execTask=null可有可无没啥作用所以注释掉了
      楼主 于 2011-10-1 22:02:38 回复
      前面的setInterval是用于系统计时的,仅仅重复执行计时的function
      后面的setTimeout是用于循环执行队列任务的,只执行后面的function
      这就是两个匿名函数而已
      都只重复执行自身

    • 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个,有何用意?

    欢迎您发表评论:

     
    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。