随着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时从新渲染屏幕编程