<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【CSON原創】HTML5游戲框架cnGameJS開發實錄(核心函數模塊篇)

      返回目錄

      1.cnGameJs框架的代碼組織 

        核心函數模塊,主要的作用是為之后的框架開發和用戶對游戲的開發提供方便,整個框架在一個閉包之中,避免對全局作用域的污染。之后每個不同的模塊分別在自己的閉包內,使不同模塊的分割更清晰。因此我們框架的模塊劃分會是這樣:

      (function(win,undefined){//最大的閉包

      var fun1=function(){//各模塊公用的方法
      }

      //這里放各個小模塊,它們有各自的閉包

      }(window,undefined)

       

        那么我們如何再劃分其他小模塊呢?為了方便各個小模塊有各自的命名空間,并且在各自的閉包中,我們新增一個register方法,該方法可以在不同命名空間下擴展自己的模塊,我們需要傳入的首先是命名空間的名稱,該方法為我們生成該命名空間對象,之后我們執行自己的方法,為命名空間對象執行相應的擴展操作:

       

              /**
      *生成命名空間,并執行相應操作
      *
      */
      register:function(nameSpace,func){
      var nsArr=nameSpace.split(".");
      var parent=win;
      for(var i=0,len=nsArr.length;i<len;i++){
      (typeof parent[nsArr[i]]=='undefined')&&(parent[nsArr[i]]={});
      parent=parent[nsArr[i]];
      }
      if(func){
      func.call(parent,this);
      }
      return parent;
      }

        如上,首先可以把傳入的命名空間字符串分割,然后生成對象,之后執行用戶傳入的函數進行擴展操作,如下:

      cnGame.register("cnGame.core",function(){this.func=function(){}});

        這樣就可以生成core模塊,并且為該模塊添加func方法,那么我們框架的代碼組織看起來將是這樣:

      (function(win,undefined){

      var cnGame={
      register:function(nameSpace,handler){

      }
      }

      /*core模塊*/
      cnGame.register("core",function(){
      //添加該模塊內容
      })

      /*input模塊*/
      cnGame.register("input",function(){
      //添加該模塊內容
      })

      win["cnGame"]=cnGame;


      })(window,undefined);

        
      2.框架的初始化

        框架初始化的時候,需要保存的對象分別有:canvas對象,context對象,canvas的位置,尺寸等,我們可以先看看初始化的函數:

              /**
      *初始化
      *
      */
      init:function(id,options){
      options=options||{};
      this.canvas = this.core.$(id||"canvas");
      this.context = this.canvas.getContext('2d');
      this.width = options.width||800;
      this.height = options.height||600;
      this.title = this.core.$$('title')[0];
      canvasPos=getCanvasPos(this.canvas);
      this.x=canvasPos[0]||0;
      this.y=canvasPos[1]||0;
      this.canvas.width=this.width;
      this.canvas.height=this.height;
      this.canvas.style.left=this.x +"px";
      this.canvas.style.top=this.y +"px";

      },

        非常簡單,就是保存一些初始化值,方便后續使用。另外可以注意到我們調用了getCanvasPos方法來獲取canvas的位置參數,該參數循環獲取對象的offsetParent,并疊加offsetLeft和offsetTop,從而得到canvas在頁面的位置。該函數源碼如下:

          /**
      *獲取canvas在頁面的位置
      *
      */
      var getCanvasPos=function(canvas){
      var left = 0;
      var top = 0;
      while (canvas.offsetParent) {
      left += canvas.offsetLeft;
      top += canvas.offsetTop;
      canvas = canvas.offsetParent;

      }
      return [left, top];

      }

       

      3.工具函數模塊

        之后我們就可以用上面的register方法添加第一個模塊:core模塊。該模塊也很簡單,主要功能就是添加工具函數,方便后續的框架開發和用戶的游戲開發。這里包含了一些常用的工具函數,例如通過id獲取元素,原型繼承,對象復制,事件綁定等等。注意如果涉及不同瀏覽器的兼容問題,我們可以一開始就根據瀏覽器設置function,而不是每次都判斷瀏覽器類型再進行相應操作,效率會更加高。拿事件綁定進行舉例:

        

              /**
      事件綁定
      *
      */
      this.bindHandler=(function(){

      if(window.addEventListener){
      return function(elem,type,handler){
      elem.addEventListener(type,handler,false);

      }
      }
      else if(window.attachEvent){
      return function(elem,type,handler){
      elem.attachEvent("on"+type,handler);
      }
      }
      })();

        預先根據瀏覽器特性返回不同function,這樣后續使用就不用再判斷瀏覽器特性,提高效率。

        附上所有工具函數的源碼,由于都很簡單,所以對該模塊就不在詳述了。

      /**
      *
      *基本工具函數模塊
      *
      *
      */
      cnGame.register("cnGame.core",function(cg){
      /**
      按id獲取元素
      *
      */
      this.$=function(id){
      return document.getElementById(id);
      };
      /**
      按標簽名獲取元素
      *
      */
      this.$$=function(tagName,parent){
      parent=parent||document;
      return parent.getElementsByTagName(tagName);
      };
      /**
      按類名獲取元素
      *
      */
      this.$Class=function(className,parent){
      var arr=[],result=[];
      parent=parent||document;
      arr=this.$$("*");
      for(var i=0,len=arr.length;i<len;i++){
      if((" "+arr[i].className+" ").indexOf(" "+className+" ")>0){
      result.push(arr[i]);
      }
      }
      return result;
      };
      /**
      事件綁定
      *
      */
      this.bindHandler=(function(){

      if(window.addEventListener){
      return function(elem,type,handler){
      elem.addEventListener(type,handler,false);

      }
      }
      else if(window.attachEvent){
      return function(elem,type,handler){
      elem.attachEvent("on"+type,handler);
      }
      }
      })();
      /**
      事件解除
      *
      */
      this.removeHandler=(function(){
      if(window.removeEventListerner){
      return function(elem,type,handler){
      elem.removeEventListerner(type,handler,false);

      }
      }
      else if(window.detachEvent){
      return function(elem,type,handler){
      elem.detachEvent("on"+type,handler);
      }
      }
      })();
      /**
      獲取事件對象
      *
      */
      this.getEventObj=function(eve){
      return eve||win.event;
      };
      /**
      獲取事件目標對象
      *
      */
      this.getEventTarget=function(eve){
      var eve=this.getEventObj(eve);
      return eve.target||eve.srcElement;
      };
      /**
      禁止默認行為
      *
      */
      this.preventDefault=function(eve){
      if(eve.preventDefault){
      eve.preventDefault();
      }
      else{
      eve.returnValue=false;
      }

      };
      /**
      獲取對象計算的樣式
      *
      */
      this.getComputerStyle=(function(){
      var body=document.body;
      if(body.currentStyle){
      return function(elem){
      return elem.currentStyle;
      }
      }
      else if(document.defaultView.getComputedStyle){
      return function(elem){
      return document.defaultView.getComputedStyle(elem, null);
      }
      }

      })();
      /**
      是否為undefined
      *
      */
      this.isUndefined=function(elem){
      return typeof elem==='undefined';
      },
      /**
      是否為數組
      *
      */
      this.isArray=function(elem){
      return Object.prototype.toString.call(elem)==="[object Array]";
      };
      /**
      是否為Object類型
      *
      */
      this.isObject=function(elem){
      return elem===Object(elem);
      };
      /**
      是否為字符串類型
      *
      */
      this.isString=function(elem){
      return Object.prototype.toString.call(elem)==="[object String]";
      };
      /**
      是否為數值類型
      *
      */
      this.isNum=function(elem){
      return Object.prototype.toString.call(elem)==="[object Number]";
      };
      /**
      *復制對象屬性
      *
      */
      this.extend=function(destination,source,isCover){
      var isUndefined=this.isUndefined;
      (isUndefined(isCover))&&(isCover=true);
      for(var name in source){
      if(isCover||isUndefined(destination[name])){
      destination[name]=source[name];
      }

      }
      return destination;
      };
      /**
      *原型繼承對象
      *
      */
      this.inherit=function(child,parent){
      var func=function(){};
      func.prototype=parent.prototype;
      child.prototype=new func();
      child.prototype.constructor=child;
      child.prototype.parent=parent;
      };

      });



      posted @ 2012-02-14 12:41  Cson  閱讀(5153)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 一本色道久久—综合亚洲| 熟妇人妻无码中文字幕老熟妇| 亚洲色大成网站www永久一区| 亚洲精品一区二区毛豆| 国产欧美日韩精品第二区| 欧美激情 亚洲 在线| 亚洲国家av一区二区| 亚洲精品美女久久久久9999| 国产av中文字幕精品| 亚洲码与欧洲码区别入口| 成人AV专区精品无码国产| 国产极品精品自在线不卡| 18禁在线一区二区三区| 亚洲国产精品无码久久久秋霞1| 国产精品嫩草99av在线| 一区二区三区自拍偷拍视频 | 侯马市| 久久99九九精品久久久久蜜桃| 国产成人精品无人区一区| 在线看片免费不卡人成视频| 亚洲国产天堂久久综合226114| 国产精品男女午夜福利片| 国产精品二区中文字幕| 极品尤物一区二区三区| 亚洲 日韩 国产 制服 在线| 91精品亚洲一区二区三区| 久久婷婷成人综合色综合| 国产免费一区二区三区在线观看| 天堂av色综合久久天堂| 亚洲成人www| 狠狠亚洲色一日本高清色| 一个人看的www视频免费观看| 欧美性猛交xxxx富婆| 嗯灬啊灬把腿张开灬动态图| 在线天堂中文新版www| 六十路老熟妇乱子伦视频| 方城县| 中文字幕第一页亚洲精品| 亚洲V天堂V手机在线| 广汉市| 亚洲视频一区|