返回目錄
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的位置參數,該參數會循環取得物件的off
setParent,並疊加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;i0){ 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; }; });
以上是HTML5遊戲框架cnGameJS開發實錄-核心函式模組篇的程式碼實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

HTML5的關鍵元素包括、、、、、等,用於構建現代網頁。 1.定義頭部內容,2.用於導航鏈接,3.表示獨立文章內容,4.組織頁面內容,5.展示側邊欄內容,6.定義頁腳,這些元素增強了網頁的結構和功能性。

HTML5和H5沒有區別,H5是HTML5的簡稱。 1.HTML5是HTML的第五個版本,增強了網頁的多媒體和交互功能。 2.H5常用於指代基於HTML5的移動網頁或應用,適用於各種移動設備。

HTML5是超文本標記語言的最新版本,由W3C標準化。 HTML5引入了新的語義化標籤、多媒體支持和表單增強,提升了網頁結構、用戶體驗和SEO效果。 HTML5引入了新的語義化標籤,如、、、等,使網頁結構更清晰,SEO效果更好。 HTML5支持多媒體元素和,無需第三方插件,提升了用戶體驗和加載速度。 HTML5增強了表單功能,引入了新的輸入類型如、等,提高了用戶體驗和表單驗證效率。

如何寫出乾淨高效的HTML5代碼?答案是通過語義化標籤、結構化代碼、性能優化和避免常見錯誤。 1.使用語義化標籤如、等,提升代碼可讀性和SEO效果。 2.保持代碼結構化和可讀性,使用適當縮進和註釋。 3.優化性能,通過減少不必要的標籤、使用CDN和壓縮代碼。 4.避免常見錯誤,如標籤未閉合,確保代碼有效性。

H5通過多媒體支持、離線存儲和性能優化提升網頁用戶體驗。 1)多媒體支持:H5的和元素簡化開發,提升用戶體驗。 2)離線存儲:WebStorage和IndexedDB允許離線使用,提升體驗。 3)性能優化:WebWorkers和元素優化性能,減少帶寬消耗。

HTML5代碼由標籤、元素和屬性組成:1.標籤定義內容類型,用尖括號包圍,如。 2.元素由開始標籤、內容和結束標籤組成,如內容。 3.屬性在開始標籤中定義鍵值對,增強功能,如。這些是構建網頁結構的基本單位。

HTML5是構建現代網頁的關鍵技術,提供了許多新元素和功能。 1.HTML5引入了語義化元素如、、等,增強了網頁結構和SEO。 2.支持多媒體元素和,無需插件即可嵌入媒體。 3.表單增強了新輸入類型和驗證屬性,簡化了驗證過程。 4.提供了離線和本地存儲功能,提升了網頁性能和用戶體驗。

H5代碼的最佳實踐包括:1.使用正確的DOCTYPE聲明和字符編碼;2.採用語義化標籤;3.減少HTTP請求;4.使用異步加載;5.優化圖像。這些實踐能提升網頁的效率、可維護性和用戶體驗。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!