<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)    收藏  舉報
      主站蜘蛛池模板: 人妻中出无码中字在线| 精品国产一区二区亚洲人| 国产一区二区不卡在线| 一本精品中文字幕在线| 无码熟妇人妻AV在线影片最多| 欧美视频精品免费覌看| 开心激情站开心激情网六月婷婷| av日韩在线一区二区三区| 成人免费无码视频在线网站| 熟女人妻视频| 亚洲综合一区二区国产精品| 国产高清一区二区不卡| 国产精品成人免费视频网站京东| 香蕉久久夜色精品国产成人| 欧美三级a做爰在线观看| 日韩精品毛片一区到三区| 色偷偷久久一区二区三区| 屁股中文字幕一二三四区人妻 | 亚洲香蕉免费有线视频| 国产精品久久久久久福利69堂| 116美女极品a级毛片| www亚洲精品| 国产一区二区三区四区五区加勒比 | 方城县| 夜爽8888视频在线观看| 午夜福利你懂的在线观看| 国产精品无码免费播放| 国产成人片无码视频| 欧美 亚洲 另类 丝袜 自拍 动漫| 亚洲人成网网址在线看| 国产乱xxxxx97国语对白| 999国产精品999久久久久久| 国产精品不卡区一区二| 欧美日激情日韩精品嗯| 日韩一卡二卡三卡四卡五卡| 国产一区二区不卡自拍| 当阳市| 亚洲日韩亚洲另类激情文学| 无码国产成人午夜电影在线观看| 狠狠色噜噜狠狠狠狠2021| 人妻伦理在线一二三区|