隨着Html5遊戲的逐漸普及,瞭解一款開發引擎,對於開發者是頗有幫助的。目前國內比較流行的html5遊戲引擎有:cocosCreator、Egret、Laya.今天就給你們詳細介紹下當前比較流行的Egret引擎。
提示:閱讀這篇文章須要有必定的編程知識。
html
瞭解一款引擎首先從Mian函數講起。網頁遊戲啓動是加載index.html開始,因此引擎入口在index.hmlt中開始調用的。首先建立一個Demo,用白鷺自帶的EgretWing編輯器打開.
html5
打開Index.html文件。在index.hmlt解析完畢後,會執行<script>標籤包裹的腳本代碼。主要有如下三個步驟:android
div class="egret-player"
位置處。 該div存放動態建立的canvas對象,即遊戲視口。簡單瞭解下對應參數:<div style="margin: auto;width: 100%;height: 100%;" class="egret-player" data-entry-class="Main" //入口類完整類名 data-orientation="auto" //控制橫豎屏,默認自動 data-scale-mode="showAll" //屏幕縮放模式 data-frame-rate="30" //遊戲幀率 data-content-width="640" //顯示寬度 data-content-height="1136" //顯示高度 data-multi-fingered="2" //多點觸控,最大觸摸數 data-show-fps="false" data-show-log="false" //是否顯示fps data-show-fps-style="x:0,y:0,size:12,textColor:0xffffff,bgAlpha:0.9"> //fps屏幕顯示樣式 </div>
資源加載完完畢沒有異常,就開始執行引擎的Mian方法了。用vscode編輯器打開源代碼,定位到EgretWeb.ts:runEgret方法。今天主要講解webView平臺,Native是android和Ios平臺,因爲源代碼沒有開放就先跳過。web
//CanvasRenderingContext2D 對象獲取方法 let CanvasRenderingContext2D = canvas.getContext("2d") /** * 設置渲染模式。"auto","webgl","canvas" * @param renderMode */ function setRenderMode(renderMode: string): void { //.... if (renderMode == "webgl" && WebGLUtils.checkCanUseWebGL()) { sys.RenderBuffer = web.WebGLRenderBuffer; sys.systemRenderer = new WebGLRenderer(); sys.canvasRenderer = new CanvasRenderer(); //Canvas2D渲染緩衝 sys.customHitTestBuffer = new WebGLRenderBuffer(3, 3); // sys.canvasHitTestBuffer = new CanvasRenderBuffer(3, 3); Capabilities["renderMode" + ""] = "webgl"; } //... }
/** * @private * 啓動心跳計時器。 */ function startTicker(ticker: egret.sys.SystemTicker): void { //..... if (!requestAnimationFrame) { requestAnimationFrame = function (callback) { return window.setTimeout(callback, 1000 / 60); }; } requestAnimationFrame(onTick); function onTick(): void { ticker.update(); requestAnimationFrame(onTick); } }
SystemTicker.ts /** * @private * 執行一次屏幕渲染 */ private render(triggerByFrame: boolean, costTicker: number): void { let playerList = this.playerList; let length = playerList.length; if (length == 0) { return; } this.callLaters(); if ($invalidateRenderFlag) { this.broadcastRender(); $invalidateRenderFlag = false; } for (let i = 0; i < length; i++) { playerList[i].$render(triggerByFrame, costTicker); } $requestRenderingFlag = false; }
到如今爲止Main節點已經建立好了,心跳計時器每60毫秒執行一次Update. Egret.player.Render在每次update時從新渲染屏幕編程