首页 > 代码库 > 【Html5游戏开发 with LufyLegend.js 之一】一览全局函数 & LGlobal静态类
【Html5游戏开发 with LufyLegend.js 之一】一览全局函数 & LGlobal静态类
一,前言
最近开始学习lufylegend.js,它是一款基于MIT协议的开源HTML5游戏引擎,目前使用Canvas渲染,2.0后会增添WebGL渲染。与其他的引擎相比,最大的特点就是模仿了ActionScript 3.0的语法,当然这只是一个特点,不会ActionScript对于学习lufylegend.js也没有什么坏的影响,我就是一个很好的例子(*_^),只不过如果你接触过ActionScript,那使用lufylegend.js的时候可能会顺手一些。以下是关于lufylegend.js的一些相关资源。
lufylegend.js官方网站:http://lufylegend.com/lufylegend
中文文档地址:http://lufylegend.com/api/zh_CN/out/
论坛地址:http://lufylegend.com/forum/forum.php
官方博客:http://blog.csdn.net/lufy_legend
lufylegend.js的最新版本是1.9.0,该版本的changelog可以到官方网站上进行查阅。
二,全局函数
这里只主要介绍几个常见的函数,还有一两个没有介绍,大家可以到文档->全局函数中进行查找。
Ⅰ LInit函数
这是一个初始化游戏的函数,注意该函数在1.9.0之前叫init,不过在1.9.0中使用init函数也可以初始化游戏,换句话说,LInit = init。这个函数有六个参数,通常情况下最后一个可以不用传。相关用法请看:
http://lufylegend.com/api/zh_CN/out/classes/%E5%85%A8%E5%B1%80%E5%87%BD%E6%95%B0.html#method_LInit
内部的代码如下:
1 function init (s, c, w, h, f, t) { 2 LGlobal.speed = s; 3 var _f = function () { 4 if (LGlobal.canTouch && LGlobal.aspectRatio == LANDSCAPE && window.innerWidth < window.innerHeight) { 5 LGlobal.horizontalError(); 6 } else if (LGlobal.canTouch && LGlobal.aspectRatio == PORTRAIT && window.innerWidth > window.innerHeight) { 7 LGlobal.verticalError(); 8 } else { 9 setTimeout(f, 100);10 }11 LGlobal.startTimer = (new Date()).getTime();12 };13 if (t != null && t == LEvent.INIT) {14 LGlobal.frameRate = setInterval(function () {15 LGlobal.onShow();16 }, s);17 LGlobal.setCanvas(c, w, h);18 _f();19 }else{20 LEvent.addEventListener(window, "load", function () {21 LGlobal.frameRate = setInterval(function () {22 LGlobal.onShow();23 }, s);24 LGlobal.setCanvas(c, w, h);25 _f();26 });27 }28 }29 var LInit = init;
这个函数关联的地方比较多,我就一一列举出来吧。
LEvent类的代码:
1 function LEvent(type){ 2 this.eventType = type; 3 this._ll_preventDefault = false; 4 } 5 LEvent.prototype.preventDefault = function () { 6 this._ll_preventDefault = true; 7 }; 8 LEvent.INIT = "init"; 9 LEvent.COMPLETE = "complete";10 LEvent.ENTER_FRAME = "enter_frame";11 LEvent.WINDOW_RESIZE = "resize";12 LEvent.SOUND_COMPLETE = "sound_complete";13 LEvent.END_CONTACT = "endContact";14 LEvent.PRE_SOLVE = "preSolve";15 LEvent.POST_SOLVE = "postSolve";16 LEvent.BEGIN_CONTACT = "beginContact";17 LEvent.addEventListener = function (n, t, f, b) {18 if (b == null) {19 b = false;20 }21 if (n.addEventListener) {22 n.addEventListener(t, f, b);23 } else if (n.attachEvent) {24 n["e" + t + f] = f;25 n[t + f] = function () {26 n["e" + t + f]();27 };28 n.attachEvent("on" + t, n[t + f]);29 }30 };31 LEvent.removeEventListener = function (n, t, f, b) {32 if (b == null) {33 b = false;34 }35 if (n.removeEventListener) {36 n.removeEventListener(t, f, b);37 } else if (n.detachEvent) {38 n["e" + t + f] = f;39 n[t + f] = function () {40 n["e" + t + f]();41 };42 n.detachEvent("on" + t, n[t + f]);43 }44 };
LGlobal里的相关函数:
1 LGlobal.setCanvas = function (id, w, h) { 2 LGlobal.ll_createCanvas(id, w, h); 3 LGlobal.ll_createStage(); 4 if(LGlobal.displayState == LStage.FULL_SCREEN){ 5 LGlobal.resize(); 6 }else if(typeof LGlobal.displayState == "number"){ 7 LGlobal.resize(LGlobal.width * LGlobal.displayState, LGlobal.height * LGlobal.displayState); 8 } 9 if (LGlobal.canTouch) { 10 LGlobal.ll_clicks = 0; 11 LGlobal.ll_prev_clickTime = 0; 12 LEvent.addEventListener(LGlobal.canvasObj,LMouseEvent.TOUCH_START, LGlobal.ll_touchStart); 13 LEvent.addEventListener(document,LMouseEvent.TOUCH_END, LGlobal.ll_touchEnd); 14 LEvent.addEventListener(LGlobal.canvasObj,LMouseEvent.TOUCH_MOVE, LGlobal.ll_touchMove); 15 } else { 16 LEvent.addEventListener(LGlobal.canvasObj,LMouseEvent.DOUBLE_CLICK, LGlobal.ll_mouseDbclick); 17 LEvent.addEventListener(LGlobal.canvasObj,LMouseEvent.MOUSE_DOWN, LGlobal.ll_mouseDown); 18 LEvent.addEventListener(LGlobal.canvasObj,LMouseEvent.MOUSE_MOVE, LGlobal.ll_mouseMove); 19 LEvent.addEventListener(LGlobal.canvasObj,LMouseEvent.MOUSE_UP, LGlobal.ll_mouseUp); 20 LEvent.addEventListener(LGlobal.canvasObj,LMouseEvent.MOUSE_OUT, LGlobal.ll_mouseOut); 21 } 22 }; 23 LGlobal.ll_createCanvas = function (id, w, h) { 24 LGlobal.id = id; 25 LGlobal.object = document.getElementById(id); 26 LGlobal.object.innerHTML = ‘<div style="position:absolute;margin:0;padding:0;overflow:visible;-webkit-transform: translateZ(0);z-index:0;">‘ + 27 ‘<canvas id="‘ + LGlobal.id + ‘_canvas" style="margin:0;padding:0;width:‘ + w + ‘px;height:‘ + h + ‘px;">‘ + 28 ‘<div id="noCanvas">‘ + 29 "<p>Hey there, it looks like you‘re using Microsoft‘s Internet Explorer. Microsoft hates the Web and doesn‘t support HTML5 :(</p>" + 30 ‘</div>‘ + 31 ‘</canvas></div>‘ + 32 ‘<div id="‘ + LGlobal.id + ‘_InputText" style="position:absolute;margin:0;padding:0;z-index:10;display:none;">‘ + 33 ‘<textarea rows="1" id="‘ + LGlobal.id + ‘_InputTextareaBox" style="resize:none;background:transparent;border:0px;"></textarea>‘ + 34 ‘<input type="text" id="‘ + LGlobal.id + ‘_InputTextBox" style="background:transparent;border:0px;" />‘ + 35 ‘<input type="password" id="‘ + LGlobal.id + ‘_passwordBox" style="background:transparent;border:0px;" /></div>‘; 36 LGlobal.canvasObj = document.getElementById(LGlobal.id + "_canvas"); 37 LGlobal._canvas = document.createElement("canvas"); 38 LGlobal._context = LGlobal._canvas.getContext("2d"); 39 if (LGlobal._context) { 40 LGlobal.canvasObj.innerHTML=""; 41 } 42 LGlobal.inputBox = document.getElementById(LGlobal.id + ‘_InputText‘); 43 LGlobal.inputTextareaBoxObj = document.getElementById(LGlobal.id + ‘_InputTextareaBox‘); 44 LGlobal.inputTextBoxObj = document.getElementById(LGlobal.id + ‘_InputTextBox‘); 45 LGlobal.passwordBoxObj = document.getElementById(LGlobal.id + ‘_passwordBox‘); 46 LGlobal.inputTextField = null; 47 if (w) { 48 LGlobal.canvasObj.width = w; 49 } 50 if (h) { 51 LGlobal.canvasObj.height = h; 52 } 53 LGlobal.width = LGlobal.canvasObj.width; 54 LGlobal.height = LGlobal.canvasObj.height; 55 LGlobal.canvasStyleWidth = LGlobal.width; 56 LGlobal.canvasStyleHeight = LGlobal.height; 57 LGlobal.canvas = LGlobal.canvasObj.getContext("2d"); 58 LGlobal.offsetX = mouseX = 0; 59 LGlobal.offsetY = mouseY = 0; 60 }; 61 LGlobal.ll_createStage = function () { 62 LGlobal.stage = new LSprite(); 63 LGlobal.stage.parent = "root"; 64 LGlobal.childList.push(LGlobal.stage); 65 LGlobal.stage.baseAddEvent = LGlobal.stage.addEventListener; 66 LGlobal.stage.baseRemoveEvent = LGlobal.stage.removeEventListener; 67 LGlobal.stage.addEventListener = function (type, listener) { 68 if (type == LEvent.WINDOW_RESIZE) { 69 LGlobal.stage.onresizeListener = listener; 70 LGlobal.stage.onresize = function (e) { 71 LGlobal.stage.onresizeEvent = e; 72 }; 73 LEvent.addEventListener(LGlobal.window, type,LGlobal.stage.onresize); 74 } else if (type == LKeyboardEvent.KEY_DOWN || type == LKeyboardEvent.KEY_UP || type == LKeyboardEvent.KEY_PRESS) { 75 LEvent.addEventListener(LGlobal.window, type, listener); 76 } else { 77 LGlobal.stage.baseAddEvent(type, listener); 78 } 79 }; 80 LGlobal.stage.removeEventListener = function (type, listener) { 81 if (type == LEvent.WINDOW_RESIZE) { 82 LEvent.removeEventListener(LGlobal.window, LEvent.WINDOW_RESIZE, LGlobal.stage.onresize); 83 delete LGlobal.stage.onresize; 84 delete LGlobal.stage.onresizeListener; 85 } else if (type == LKeyboardEvent.KEY_DOWN || type == LKeyboardEvent.KEY_UP || type == LKeyboardEvent.KEY_PRESS) { 86 LEvent.removeEventListener(LGlobal.window, type, listener); 87 } else { 88 LGlobal.stage.baseRemoveEvent(type, listener); 89 } 90 }; 91 }; 92 LGlobal.ll_touchStart = function (event) { 93 if (LGlobal.inputBox.style.display != NONE) { 94 LGlobal.inputTextField._ll_getValue(); 95 } 96 var canvasX = parseInt(0 + LGlobal.object.style.left) + parseInt(LGlobal.canvasObj.style.marginLeft), 97 canvasY = parseInt(0 + LGlobal.object.style.top) + parseInt(LGlobal.canvasObj.style.marginTop), eve, k, i, eveIndex; 98 if (LMultitouch.inputMode == LMultitouchInputMode.NONE) { 99 eveIndex = 0;100 } else if (LMultitouch.inputMode == LMultitouchInputMode.TOUCH_POINT) {101 eveIndex = event.touches.length - 1;102 }103 eve = {offsetX : (event.touches[eveIndex].pageX - canvasX),104 offsetY : (event.touches[eveIndex].pageY - canvasY),105 touchPointID : event.touches[eveIndex].identifier};106 eve.offsetX = LGlobal.ll_scaleX(eve.offsetX);107 eve.offsetY = LGlobal.ll_scaleY(eve.offsetY);108 mouseX = LGlobal.offsetX = eve.offsetX;109 mouseY = LGlobal.offsetY = eve.offsetY;110 LMultitouch.touchs["touch" + eve.touchPointID] = eve;111 LGlobal.mouseEvent(eve, LMouseEvent.MOUSE_DOWN);112 LGlobal.buttonStatusEvent = eve;113 var date = new Date();114 var clickTime = date.getTime();115 LGlobal.ll_clicks = (clickTime <= (LGlobal.ll_prev_clickTime + 500)) ? (LGlobal.ll_clicks + 1) : 1;116 LGlobal.ll_prev_clickTime = clickTime;117 if (LGlobal.ll_clicks === 2) {118 LGlobal.mouseEvent(eve, LMouseEvent.DOUBLE_CLICK);119 LGlobal.ll_clicks = 0;120 }121 LGlobal.IS_MOUSE_DOWN = true;122 if (LGlobal.IS_MOUSE_DOWN && LGlobal.box2d != null && LGlobal.mouseJoint_start) {123 LGlobal.mouseJoint_start(eve);124 }125 LGlobal.touchHandler(event);126 };127 LGlobal.ll_touchEnd = function (event) {128 var e, eve, k, i, l, h;129 if (LMultitouch.inputMode == LMultitouchInputMode.TOUCH_POINT) {130 for (k in LMultitouch.touchs) {131 e = LMultitouch.touchs[k];132 h = false;133 for (i = 0,l = event.touches.length; i < l; i++) {134 if (event.touches[i].identifier == e.touchPointID) {135 h = true;136 break;137 }138 }139 if (!h) {140 eve = e;141 delete LMultitouch.touchs[k];142 break;143 }144 }145 }146 if (!eve) {147 eve = {offsetX : LGlobal.offsetX, offsetY : LGlobal.offsetY};148 }149 LGlobal.mouseEvent(eve, LMouseEvent.MOUSE_UP);150 LGlobal.touchHandler(event);151 LGlobal.IS_MOUSE_DOWN = false;152 LGlobal.buttonStatusEvent = null;153 if (LGlobal.box2d != null && LGlobal.box2d.mouseJoint) {154 LGlobal.box2d.world.DestroyJoint(LGlobal.box2d.mouseJoint);155 LGlobal.box2d.mouseJoint = null;156 }157 };158 LGlobal.ll_touchMove = function (e) {159 var cX = parseInt(0 + LGlobal.object.style.left) + parseInt(LGlobal.canvasObj.style.marginLeft),160 cY = parseInt(0 + LGlobal.object.style.top) + parseInt(LGlobal.canvasObj.style.marginTop),161 eve, l, ll = e.touches.length;162 if (LMultitouch.inputMode == LMultitouchInputMode.NONE) {163 ll = 1;164 }165 for (i = 0, l = e.touches.length; i < l && i < ll; i++) {166 eve = {offsetX : (e.touches[i].pageX - cX), offsetY : (e.touches[i].pageY - cY), touchPointID : e.touches[i].identifier};167 eve.offsetX = LGlobal.ll_scaleX(eve.offsetX);168 eve.offsetY = LGlobal.ll_scaleY(eve.offsetY);169 mouseX = LGlobal.offsetX = eve.offsetX;170 mouseY = LGlobal.offsetY = eve.offsetY;171 if (LMultitouch.touchs["touch" + eve.touchPointID] && 172 LMultitouch.touchs["touch" + eve.touchPointID].offsetX == eve.offsetX && 173 LMultitouch.touchs["touch" + eve.touchPointID].offsetY == eve.offsetY){174 continue; 175 }176 LGlobal.buttonStatusEvent = eve;177 LMultitouch.touchs["touch" + eve.touchPointID] = eve;178 LGlobal.mouseEvent(eve, LMouseEvent.MOUSE_MOVE);179 }180 LGlobal.touchHandler(e);181 if(LGlobal.IS_MOUSE_DOWN && LGlobal.box2d != null && LGlobal.mouseJoint_move){182 LGlobal.mouseJoint_move(eve);183 }184 };185 LGlobal.ll_mouseDbclick = function (e) {186 if (e.offsetX == null && e.layerX != null) {187 e.offsetX = e.layerX;188 e.offsetY = e.layerY;189 }190 var event = {button : e.button};191 event.offsetX = LGlobal.ll_scaleX(e.offsetX);192 event.offsetY = LGlobal.ll_scaleY(e.offsetY);193 LGlobal.mouseEvent(event, LMouseEvent.DOUBLE_CLICK);194 };195 LGlobal.ll_mouseDown = function (e) {196 if (e.offsetX == null && e.layerX != null) {197 e.offsetX = e.layerX;198 e.offsetY = e.layerY;199 }200 if (LGlobal.inputBox.style.display != NONE) {201 LGlobal.inputTextField._ll_getValue();202 }203 var event = {button : e.button};204 event.offsetX = LGlobal.ll_scaleX(e.offsetX);205 event.offsetY = LGlobal.ll_scaleY(e.offsetY);206 LGlobal.mouseEvent(event, LMouseEvent.MOUSE_DOWN);207 LGlobal.IS_MOUSE_DOWN = true;208 if (LGlobal.IS_MOUSE_DOWN && LGlobal.box2d != null && LGlobal.mouseJoint_start) {209 LGlobal.mouseJoint_start(e);210 }211 };212 LGlobal.ll_mouseMove = function (e) {213 if (e.offsetX == null && e.layerX != null) {214 e.offsetX = e.layerX;215 e.offsetY = e.layerY;216 }217 var event = {};218 event.offsetX = LGlobal.ll_scaleX(e.offsetX);219 event.offsetY = LGlobal.ll_scaleY(e.offsetY);220 LGlobal.buttonStatusEvent = event;221 mouseX = LGlobal.offsetX = event.offsetX;222 mouseY = LGlobal.offsetY = event.offsetY;223 LGlobal.mouseEvent(event, LMouseEvent.MOUSE_MOVE);224 if (LGlobal.IS_MOUSE_DOWN && LGlobal.box2d != null && LGlobal.box2d.mouseJoint) {225 LGlobal.box2d.mouseJoint.SetTarget(new LGlobal.box2d.b2Vec2(e.offsetX / LGlobal.box2d.drawScale, e.offsetY / LGlobal.box2d.drawScale));226 }227 };228 LGlobal.ll_mouseUp = function (e) {229 if (e.offsetX == null && e.layerX != null) {230 e.offsetX = e.layerX;231 e.offsetY = e.layerY;232 }233 var event = {button : e.button};234 event.offsetX = LGlobal.ll_scaleX(e.offsetX);235 event.offsetY = LGlobal.ll_scaleY(e.offsetY);236 LGlobal.mouseEvent(event, LMouseEvent.MOUSE_UP);237 LGlobal.IS_MOUSE_DOWN = false;238 if (LGlobal.box2d != null && LGlobal.box2d.mouseJoint) {239 LGlobal.box2d.world.DestroyJoint(LGlobal.box2d.mouseJoint);240 LGlobal.box2d.mouseJoint = null;241 }242 };243 LGlobal.ll_mouseOut = function (e) {244 if (e.offsetX == null && e.layerX != null) {245 e.offsetX = e.layerX;246 e.offsetY = e.layerY;247 }248 var event = {};249 event.offsetX = LGlobal.ll_scaleX(e.offsetX);250 event.offsetY = LGlobal.ll_scaleY(e.offsetY);251 LGlobal.mouseEvent(event, LMouseEvent.MOUSE_OUT);252 LGlobal.IS_MOUSE_DOWN = false;253 };254 LGlobal.touchHandler = function (e) {255 e.stopPropagation();256 if (LGlobal.preventDefault) {257 e.preventDefault();258 }259 if (e.stopImmediatePropagation) {260 e.stopImmediatePropagation();261 }262 return e;263 };264 LGlobal.mouseEvent = function (e, t) {265 if (t == LMouseEvent.MOUSE_MOVE) {266 LGlobal.dragHandler(e);267 }268 if (LMouseEventContainer.container[t]) {269 LMouseEventContainer.dispatchMouseEvent(e, t);270 return;271 }272 for (var k = LGlobal.childList.length - 1; k >= 0; k--) {273 if (LGlobal.childList[k].mouseEvent && LGlobal.childList[k].mouseEvent(e, t)) {274 break;275 }276 }277 };278 LGlobal.dragHandler = function (e) {279 var i, s, c, d = LGlobal.dragList;280 for(i = d.length - 1; i >= 0; i--) {281 s = d[i];282 if (LGlobal.canTouch && s.ll_touchPointID != e.touchPointID) {283 continue;284 }285 c = s.getAbsoluteScale();286 s.x = s.ll_dragStartX + (e.offsetX - s.ll_dragMX) * s.scaleX / c.scaleX;287 s.y = s.ll_dragStartY + (e.offsetY - s.ll_dragMY) * s.scaleY / c.scaleY;288 break;289 }290 };291 LGlobal.onShow = function () {292 if (LGlobal.canvas == null) {293 return;294 }295 if (LGlobal.stage.onresizeEvent) {296 LGlobal.stage.onresizeListener(LGlobal.stage.onresizeEvent);297 delete LGlobal.stage.onresizeEvent;298 }299 if (LGlobal.box2d != null) {300 LGlobal.box2d.ll_show();301 if (!LGlobal.traceDebug && LGlobal.keepClear) {302 LGlobal.canvas.clearRect(0, 0, LGlobal.width + 1, LGlobal.height + 1);303 }304 } else {305 if (LGlobal.keepClear) {306 LGlobal.canvas.clearRect(0, 0, LGlobal.width + 1, LGlobal.height + 1);307 }308 if (LGlobal.backgroundColor !== null) {309 LGlobal.canvas.fillStyle = LGlobal.backgroundColor;310 LGlobal.canvas.fillRect(0, 0, LGlobal.width, LGlobal.height);311 }312 }313 LGlobal.show(LGlobal.childList);314 };315 LGlobal.show = function (s) {316 for (var i = 0, l = s.length; i < l; i++) {317 if (s[i] && s[i].ll_show) {318 s[i].ll_show();319 }320 }321 };
代码就不一一解释了,大致说明一下吧,setCanvas以及在setCanvas中调用的函数主要用于创建并配置canvas对象,看了文档的朋友都知道,LInit第二个参数传入的是游戏界面所在div的id值而并非canvas的id值,所以这些函数就负责把canvas创建好,并配置好事件以及调度事件的接口。而onShow和show则是负责渲染的函数,因为游戏中可能会有层次化或别的不经过循环处理不能实现的效果,所以引擎在LInit中就用了setInterval来周期性调用onShow函数,进行驱动渲染。这些就是lufylegend.js的事件、渲染机制。
还有就是LEvent类,这个类保存了大量的引擎中的自带事件,并且有addEventListener和removeEventListener函数,这些函数都是对html元素进行事件操作的,也就是说如果你想为你自己写的一个html标签创建或删除一个事件,并且要兼容多个浏览器的话,就可以用LEvent.addEventListener和LEvent.removeEventListener。一般需要传入的参数有:[ 添加对象,事件名,调度的函数 ]。LEvent其他的用法可以看:http://lufylegend.com/api/zh_CN/out/classes/LEvent.html
Ⅱ addChild函数
调用这个函数相当于调用ActionScript里的stage.addChild,也就是说把显示对象加入到底层。显示对象有哪些呢?主要的有LSprite,LBitmap,LTextField等。相关用法请看:
http://lufylegend.com/api/zh_CN/out/classes/%E5%85%A8%E5%B1%80%E5%87%BD%E6%95%B0.html#method_addChild
内部的代码如下:
1 function addChild (o) {2 LGlobal.stage.addChild(o);3 }
Ⅲ removeChild函数
调用这个函数相当于调用ActionScript里的stage.removeChild,也就是说把显示对象从底层删除。相关用法请看:
http://lufylegend.com/api/zh_CN/out/classes/%E5%85%A8%E5%B1%80%E5%87%BD%E6%95%B0.html#method_removeChild
内部的代码如下:
1 function removeChild (o) {2 LGlobal.stage.removeChild(o);3 }
三,LGlobal静态类
LGlobal是lufylegend.js中的全局类,用于装载许多关于全局设置的函数和全局属性,比如说全屏处理,获取canvas信息等。LGlobal的文档地址如下:http://lufylegend.com/api/zh_CN/out/classes/LGlobal.html
注意LSystem = LStage = LGlobal。
在LGlobal中,拉伸界面的函数叫screen,这个函数很有意思,通常情况下用来实现全屏游戏,我们不妨来看看这个函数内部的实现方法:
1 LGlobal.screen = function (a) { 2 LGlobal.displayState = a; 3 if (LGlobal.stage) { 4 if (typeof LGlobal.displayState == "number") { 5 LGlobal.resize(LGlobal.width * LGlobal.displayState, LGlobal.height * LGlobal.displayState); 6 } else { 7 LGlobal.resize(); 8 } 9 }10 };
首先使用时我们需要往这里面传一个参数,也就是拉伸大小,如果传个数字就会把界面按拉伸模式拉伸到指定的倍数。如果你想弄成全屏,那就传入LGlobal.FULL_SCREEN,这个属性的值其实是一个字符串。介绍完参数,我们来看看代码,在LGlobal.screen里第一行代码就是保存一下拉伸大小,第二行的判断条件中有个LGlobal.stage,这个是一个LSprite对象,LSprite会在今后的文章中讲到,因为这是一个非常重要的类;第二行里的判断主要作用是在LInit调用后screen函数也有拉伸界面的效果,因为在调用LInit前,Html里的元素可能并没有加载完成,但拉伸界面的时候必须要找到canvas对象,所以在LInit调用时也会使用到这个判断中的代码来保证LInit前使用screen也能达到拉伸界面的效果。第三行和第五行就是在进行代码运行分岔,条件是拉伸大小是否为数字。虽然这里通过if...else...分了两条路出来,不过都同时调用了resize函数,接下来就该看看resize函数了:
1 LGlobal.resize = function (canvasW, canvasH) { 2 var w, h, t = 0, l = 0, ww = window.innerWidth, wh = window.innerHeight; 3 if (canvasW) { 4 w = canvasW; 5 } 6 if (canvasH) { 7 h = canvasH; 8 } 9 if (LGlobal.stageScale == "noScale") {10 w = canvasW || LGlobal.width;11 h = canvasH || LGlobal.height;12 }13 switch (LGlobal.stageScale) {14 case "exactFit":15 w = canvasW || ww;16 h = canvasH || wh;17 break;18 case "noBorder":19 w = canvasW || ww;20 h = canvasH || LGlobal.height*ww/LGlobal.width;21 switch (LGlobal.align) {22 case LStageAlign.BOTTOM:23 case LStageAlign.BOTTOM_LEFT:24 case LStageAlign.BOTTOM_RIGHT:25 case LStageAlign.BOTTOM_MIDDLE:26 t = wh - h;27 break;28 }29 break;30 case "showAll":31 if (ww / wh > LGlobal.width / LGlobal.height) {32 h = canvasH || wh;33 w = canvasW || LGlobal.width * wh / LGlobal.height;34 } else {35 w = canvasW || ww;36 h = canvasH || LGlobal.height * ww / LGlobal.width;37 }38 case "noScale":39 default:40 switch (LGlobal.align) {41 case LStageAlign.BOTTOM:42 case LStageAlign.BOTTOM_LEFT:43 t = wh - h;44 break;45 case LStageAlign.RIGHT:46 case LStageAlign.TOP_RIGHT:47 l = ww - w;48 break;49 case LStageAlign.TOP_MIDDLE:50 l = (ww - w) * 0.5;51 break;52 case LStageAlign.BOTTOM_RIGHT:53 t = wh - h;54 l = ww - w;55 break;56 case LStageAlign.BOTTOM_MIDDLE:57 t = wh - h;58 l = (ww - w) * 0.5;59 break;60 case LStageAlign.MIDDLE:61 t = (wh - h) * 0.5;62 l = (ww - w) * 0.5;63 break;64 case LStageAlign.TOP:65 case LStageAlign.LEFT:66 case LStageAlign.TOP_LEFT:67 default:68 }69 }70 LGlobal.canvasObj.style.marginTop = t + "px";71 LGlobal.canvasObj.style.marginLeft = l + "px";72 if (LGlobal.isFirefox) {73 LGlobal.left = parseInt(LGlobal.canvasObj.style.marginLeft);74 LGlobal.top = parseInt(LGlobal.canvasObj.style.marginTop);75 }76 LGlobal.ll_setStageSize(w, h);77 };
这里面主要是实现了界面对齐,和计算拉伸尺寸。
实现界面对齐是因为使用者可能有需求使界面处于屏幕的不同位置,当然通常情况下使用居中,大家可以看看文档上关于这方面的介绍:http://lufylegend.com/api/zh_CN/out/classes/LStageAlign.html
计算拉伸尺寸是为了下一步进行拉伸操作做准备,lufylegend.js中全屏拉伸模式有那么几种,在resize函数里会根据不同的模式进行不同的尺寸计算,详情请移步:http://lufylegend.com/api/zh_CN/out/classes/LStageScaleMode.html
界面拉伸的实现我们一直没看到,是吧?其实就离我们一步之遥了,拉伸方面的实现就在ll_setStageSize里,这个函数有两个参数,分别是拉伸的宽度和高度,这些都已经计算好了,所以直接传给了ll_setStageSize函数。
ll_setStageSize里的代码:
1 LGlobal.ll_setStageSize = function (w, h) {2 w = Math.ceil(w);3 h = Math.ceil(h);4 LGlobal.canvasObj.style.width = w + "px";5 LGlobal.canvasObj.style.height = h + "px";6 LGlobal.canvasStyleWidth = w;7 LGlobal.canvasStyleHeight = h;8 };
就短短的8行就解决了问题。那么总得来说,要实现拉伸canvas效果,直接改canvas元素的style.width和style.height就能实现。最后来看看效果图吧:
Demo中用到的代码如下:
1 LInit(1000/60, "legend", 240, 240, main); 2 function main () { 3 LGlobal.stageScale = LStageScaleMode.SHOW_ALL; 4 LGlobal.screen(LStage.FULL_SCREEN); 5 //you can also use it like : LGlobal.screen(1.5); 6 var loader = new LLoader(); 7 loader.addEventListener(LEvent.COMPLETE, loadBitmapdata); 8 loader.load("http://lufylegend.com/api/api/LGlobal/face.jpg 9 ", "bitmapData");10 }11 function loadBitmapdata (event) {12 var bitmapdata = http://www.mamicode.com/new LBitmapData(event.target); 13 var bitmap = new LBitmap(bitmapdata);14 addChild(bitmap);15 }
Ok,今天就先到此为止,欢迎大家留言,下次我们就来看看所有显示对象的基类LDisplayObject,敬请期待~
欢迎大家继续关注我的博客http://www.cnblogs.com/yuehao