lufylegend基础知识1
這是官方的介紹:
lufylegend是一個(gè)HTML5開源引擎,它實(shí)現(xiàn)了利用仿ActionScript3.0的語法進(jìn)行HTML5的開發(fā), 包含了LSprite,LBitmapData,LBitmap,LLoader,LURLLoader,LTextField,LEvent等多個(gè)AS開發(fā)人員熟悉的類, 支持Google Chrome,Firefox,Opera,IE9,IOS,Android等多種熱門環(huán)境。 利用lufylegend可以輕松的使用面向?qū)ο缶幊?#xff0c;并且可以配合Box2dWeb制作物理游戲, 另外它還內(nèi)置了LTweenLite緩動類等非常實(shí)用的功能, 現(xiàn)在開始使用它吧,它可以讓你更快的進(jìn)入HTML5的世界!
?
從上面的文字可以看出啊,lufy大神的文字功底還是很屌的。其實(shí)說白了,lufylegend是一個(gè)兼容性極高,功能極多,使用方便的HTML5游戲引擎。
那么,在眾多html5游戲引擎中,lufylegend優(yōu)勢何呢?
首先我覺得,最扯的一個(gè)優(yōu)勢就是:Lufylegend is made by Chinese。當(dāng)然Cocos2d-html5也是made by Chinese啊~但是,lufylegend的API文檔是中文的,Cocos2d-html5就不一樣了。也許你非常懂英文,但是至少而言,你看中文還是比看英文習(xí)慣一些,不是嗎?
第二個(gè)優(yōu)點(diǎn)就是它效率十分高。在單核CPU上跑,FPS在15-23之間,在手機(jī)也就差不多是這個(gè)檔次了。也許有朋友笑曰:“我X,FPS在15-23之間好意思說出口?”,但其實(shí)不然,你要清楚啊,html5和OpenGL等不是一個(gè)檔次的,OpenGL發(fā)展N年了,而html5仍然被認(rèn)為是一項(xiàng)新技術(shù)。以前,我也試著去學(xué)習(xí)Cocos2d-html5,但說真的,效率感覺比不上lufylegend。
第三個(gè)優(yōu)點(diǎn)就是配置簡單。有些引擎,東西一大堆,使用者根本無從下手。而使用lufylegend,只需要把lufylegend-xxx.min.js復(fù)制到項(xiàng)目下面即可。
其實(shí)說實(shí)話,只有你使用它以后,才能真正地感受到帶來的方便。
?
當(dāng)然,我還是再次把引擎的地址display出來:
官方網(wǎng)站:http://lufylegend.com/lufylegend
API文檔:http://lufylegend.com/lufylegend/api
?
1,引擎原理
我們知道,游戲主要由事件和畫面組成,在lufylegend的事件中,有鼠標(biāo)事件(MOUSE_DOWN,MOUSE_UP,MOUSE_MOVE),鍵盤事件(KEY_DOWN,KEY_UP),時(shí)間軸事件(ENTER_FRAME),這些事件中,前兩項(xiàng)so easy,好理解,但時(shí)間軸事件對于一些剛接觸游戲開發(fā)的新生而言,有些摸不著頭腦。其實(shí)時(shí)間軸事件相當(dāng)于一個(gè)定時(shí)器,這個(gè)事件的監(jiān)聽者(listener,也就是事件回調(diào)函數(shù))每隔一段時(shí)間就會觸發(fā)一次。但這個(gè)東西有什么用呢?我們舉個(gè)例子吧,假如我們做一個(gè)飛機(jī)大戰(zhàn)的游戲,要讓敵機(jī)緩緩地移動起來,如果我們直接將它們的x或者y設(shè)置為某值,那飛機(jī)就會在嗖地一聲在瞬間之內(nèi)移動到那里。這樣很不“禮貌”,因?yàn)閯幼魈罅藒我們要做到緩緩地移動,這時(shí)候時(shí)間軸事件就該派上用處了,我們可以在監(jiān)聽函數(shù)中給飛機(jī)的x或者y增加某個(gè)值,這樣的話,監(jiān)聽函數(shù)每被調(diào)用一次,就會將飛機(jī)移動一下,又因?yàn)槊扛粢欢螘r(shí)間監(jiān)聽函數(shù)才被調(diào)用一次,所以說飛機(jī)就能夠達(dá)到慢慢移動的效果,這樣就”禮貌“多了,對吧?當(dāng)然,要讓飛機(jī)移動地更帥一點(diǎn),那就要用到緩動類LTweenLite,什么是緩動類?好吧,我直觀地告訴你,就是像jQuery淡入淡出那種逐漸變化從而實(shí)現(xiàn)某種效果的一個(gè)功能。這里有l(wèi)ufy對緩動類進(jìn)行巧妙地利用,做出的一個(gè)超帥動畫:HTML5超帥動畫制作-LTweenLite的妙用
說完事件,我們再來說說畫面。lufylegend中,但凡是加入到畫面上的顯示對象都是通過一個(gè)setInverval不停繪制的,這樣做有什么必要呢?首先,是可以實(shí)現(xiàn)層次化,如果我們把所有對象放入一個(gè)數(shù)組中,通過遍歷的方式獲取每個(gè)對象并調(diào)用函數(shù)將其顯示,那么第一個(gè)被加入的對象就會先被畫在最下面,其余的依次畫上,這樣一來就實(shí)現(xiàn)了層次化效果。其次,還有個(gè)好處就是可以通過直接更改對象的屬性從而在下次重繪時(shí)表現(xiàn)出來,比如說我們加入一個(gè)圖片對象(對象名字為img),這時(shí)我們要改變它的顯示方式為不顯示(visible屬性改為false),那么直接把img.visible改為false即可,那在下次重繪時(shí)就控制它不顯示。另外,在上面提到的時(shí)間軸事件觸發(fā)的速度也是由重畫速度決定的——每畫一次就調(diào)用一次。
在lufylegend中,但凡是可顯示的對象,大都繼承自LDisplayObject。這個(gè)類有個(gè)ll_show方法,用于在循環(huán)渲染時(shí)變幻畫布,繪制該顯示的東西。
?
2,利用引擎初始化游戲
在引擎中,要初始化游戲需要用到引擎內(nèi)部的init函數(shù),使用方法舉例如下:
?
[javascript] view plaincopyprint?這個(gè)函數(shù)的參數(shù)是:
?
init(speed,divid,width,height,completeFunc);
speed:游戲速度設(shè)定
divid:傳入一個(gè)div的id,庫件進(jìn)行初始化的時(shí)候,會自動將canvas加入到此div內(nèi)部
width:游戲界面寬
height:游戲界面高
completeFunc:游戲初始化后,調(diào)用此函數(shù)
在使用lufylegend時(shí),不用在html文件中寫什么<canvas>標(biāo)簽,不過要寫一個(gè)div,如下:
?
[javascript] view plaincopyprint?還是很簡單的,不是嗎?不過值得一提的是,init的參數(shù)speed或許有的朋友不理解什么是游戲速度,其實(shí)就是我在原理中介紹到的setInterval的速度,這個(gè)速度控制的是重繪速度和時(shí)間軸觸發(fā)速度,如果設(shè)得超大,你的畫面會很卡,不管你是什么雙核CPU還是什么四核CPU。如果設(shè)得超小,比如說1-10,那有些性能差的電腦顯示起來就會有些差,一卡一卡的~所以我一般設(shè)置為30-50,這之間的數(shù)應(yīng)該都挺合適的。
?
?
3,引擎基本功能及原理
?
1,LGlobal(LStage、LSystem)靜態(tài)類
這個(gè)類掌管游戲中許多全局的設(shè)置,比如說更改游戲速度,獲取游戲界面高度、寬度,canvas標(biāo)簽,canvas標(biāo)簽的getContext("2d"),和當(dāng)前操作系統(tǒng)等,可以到API文檔中看個(gè)究竟。
在LGlobal中,有個(gè)childList屬性,這個(gè)屬性在最新的幾個(gè)版本里面主要存放LGlobal.stage(最底層,一個(gè)LSprite對象。LSprite是什么?下文會慢慢介紹的),LTweenLite(緩動類),LSound.Container(音頻容器,貌似里面有用于判斷音頻是否結(jié)束的函數(shù))。引擎循環(huán)渲染便是從這個(gè)地方開始的。引擎中通過遍歷LGlobal.childList獲取這幾個(gè)對象,然后調(diào)用每個(gè)對象的ll_show方法來實(shí)現(xiàn)循環(huán)執(zhí)行每個(gè)對象應(yīng)該執(zhí)行的命令,例如LGlobal.stage就應(yīng)該執(zhí)行LSprite該做的向下循環(huán)子對象,LTweenLite就應(yīng)該調(diào)用緩動函數(shù)來改變緩動數(shù)據(jù)等。
?
2,全屏設(shè)置
html5最大的優(yōu)勢就是跨平臺,所以游戲要能在手機(jī)上運(yùn)行最好,但是能運(yùn)行不能就完了,還要能達(dá)到全屏。以前l(fā)ufylegend的全屏有點(diǎn)問題,不過最近改好了,不僅能手機(jī)全屏,PC機(jī)也OK,還提供了三種全屏模式:
LStageScaleMode.EXACT_FIT:[靜態(tài)] 指定整個(gè)應(yīng)用程序在指定區(qū)域中可見,但不嘗試保持原始高寬比。
LStageScaleMode.SHOW_ALL:[靜態(tài)] 指定整個(gè)應(yīng)用程序在指定區(qū)域中可見,且不會發(fā)生扭曲,同時(shí)保持應(yīng)用程序的原始高寬比。
LStageScaleMode.NO_SCALE:[靜態(tài)] 指定應(yīng)用程序的大小是固定的,因此,即使在更改播放器窗口大小時(shí),它仍然保持不變。
※設(shè)置完舞臺的縮放模式之后,調(diào)用LSystem.screen(LStage.FULL_SCREEN);就可以實(shí)現(xiàn)全屏。
原理很簡單,就是設(shè)置canvas標(biāo)簽的style.width和style.height來實(shí)現(xiàn)GPU縮放。
?
3,加入對象/移除對象:addChild,removeChild
在lufylegend中要加入顯示對象到銀幕上,需要使用addChild,如果直接調(diào)用這個(gè)函數(shù),就是把對象加入最底層,當(dāng)然LSprite也有addChild,是把對象添加到LSprite上,從而實(shí)現(xiàn)層次化效果。
removeChild是一樣的,只不過是把對象刪除而已~
addChild和removeChild等同于LGlobal.stage.addChild和LGlobal.stage.removeChild。原理為把參數(shù)所指定的對象從LSprite的childList里面刪除掉。
?
4,LLoadManage加載文件
主要用于加載游戲中的文件,如圖片,音頻,js文件,其他文件(需要用到服務(wù)器),用法可查API文檔。
原理:通過判斷文件不同的類型從而分別調(diào)用LLoader(讀取圖片),LURLLoader(讀取文本文件,包括js文件),LSound(讀取音頻)。當(dāng)然你可以直接用上述的幾個(gè)類讀取數(shù)據(jù),但是咱們的LLoadManage胃口更大,可以批量讀取不同類型的文件,使用起來還會更方便,因?yàn)槠渲羞€提供了進(jìn)度條的顯示。
?
5,圖片類LBitmap,LBitmapData
這個(gè)兩個(gè)類主要配合顯示圖片,不過顯示之前需要加載圖片,方法如下:
?
[javascript] view plaincopyprint??
通過這倆的名字可以看出來,一個(gè)是負(fù)責(zé)提供數(shù)據(jù),一個(gè)負(fù)責(zé)按數(shù)據(jù)要求顯示,類似于教研員和考生。LBitmap是LDisplayObject的子類,在ll_show中會調(diào)用到繪制圖像的函數(shù)。同時(shí)也會進(jìn)行相應(yīng)的畫布變幻。
?
6,LSprite層次化效果
?
LSprite的定義是:LSprite 類是基本顯示列表構(gòu)造塊,一個(gè)可顯示圖形并且也可包含子項(xiàng)的顯示列表節(jié)點(diǎn)。這個(gè)有點(diǎn)復(fù)雜,但其實(shí)說白了就是一個(gè)Layer層。我們在前面說到過,加入越后的對象會顯示在最頂部,但是我要讓后加的對象顯示在先加的對象下方,就要用到LSprite分層顯示了。LSprite也有addChild和removeChild方法,用于添加對象。此外,LSprite還有addEventListener函數(shù),用于給對象加入事件。具體的一些功能可以到官方API去看看。
LSprite也有個(gè)childList屬性,裝有其子成員,在ll_show中,LSprite執(zhí)行畫布變幻和循環(huán)自己的childList,然后調(diào)用循環(huán)到的子對象的ll_show方法。
?
7,LTextField文字顯示
這個(gè)類如LBitmap一般,需要用addChild加入到界面中。這個(gè)類的屬性很多,不過用起來挺不錯(cuò)的,大家可以到API中去看一看,使用舉例如下:
?
[javascript] view plaincopyprint?這個(gè)類嘛和LBitmap執(zhí)行的命令差不多,畫圖的命令改為畫文字的命令即可。
總結(jié)
以上是生活随笔為你收集整理的lufylegend基础知识1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三目运算符 改变a标签的class属性
- 下一篇: 解决Myeclipse下Debug出现S