欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Android游戲框架AndEngine使用入門

系統 1909 0

項目站點: http://www.andengine.org

項目地址: http://code.google.com/p/andengine

示例地址: http://code.google.com/p/andengineexamples

PS:本文中使用的AndEngine源碼為2011年3月3日獲得。


AndEngine是一款以OpenGLES方式進行畫面渲染的2D游戲引擎,可以運行在支持Android 1.6及以上版本的系統當中。應該說,相較前文介紹的Libgdx引擎,AndEngine擁有更多的游戲組件與擴展功能。并且與Libgdx不同,它在默認情況下已經可以支持中文,采用屏幕坐標系繪也更符合一般Android繪圖習慣。

然而,有其利也必有其弊,AndEngine作為游戲引擎雖然在功能上較Libgdx更為豐富也更人性化,但相比Libgdx的繪圖渲染機能卻遜色不少(粗讀源碼可以發現,Libgdx有較為完善的OpenGLES環境適應性,而AndEngine在這方面的投入明顯不足)。事實上,市井也一直有流言說AndEngine引擎在不同手機機型上的表現并不穩定(詳見: http://www.badlogicgames.com/wordpress/?p=816 http://www.badlogicgames.com/wordpress/?p=803 ,Libgdx作者Mario所寫)。

所以,您是否選擇AndEngine引擎,還是應該從實際出發,多做真機測試才好下決定。下面開始,我將逐步講解一些有關AndEngine引擎的基礎信息。

AndEngine引擎基礎構成如下圖所示:

00

一、如何使用AndEngine:


1.1 AndEngine的基本運行原理:


解讀AndEngine源碼后我們可以發現,AndEngine除了采取低耦合、高內聚的框架策略細分引擎模塊,使用OpenGLES進行游戲渲染之外;該引擎還以雙線程方式分別驅動繪圖與事務更新,事實上,它將游戲畫面和游戲業務分為兩組邏輯,并行跑在同級的互斥線程當中。

具體地說,其繪圖線程位于AndEngine提供的GLSurfaceView內部類GLThread(在AndEngine的org.anddev.andengine.opengl.view包下,非Android默認的GLSurfaceView),并通過GLSurfaceView子類,即AndEngine提供的RenderSurfaceView類調用重載的onDrawFrame函數加以渲染控制;而業務線程在Engine類的內部類UpdateThread中,AndEngine將始終以while(true)這樣的死循環方式快速執行其中的onTickUpdate函數,所有AndEngine提供的游戲業務最終都會由此函數調用及執行,比如AndEngine常用的registerUpdateHandler方法就是向它提交數據。

當AndEngine進行游戲繪圖時,游戲業務線程會通過wait方式鎖定,而當游戲業務處理時,也會以同樣的手段鎖定繪圖線程,二者間具體交互關系由Engine類中的State子類控制,以此保證游戲畫面與游戲業務同步。

另外,或許是考慮到持續雙線程運行電量消耗較大的緣故,AndEngine默認情況下要求用戶啟動PowerManager進行電源管理,故此需要<uses-permission android:name="android.permission.WAKE_LOCK"/>權限支持,否則初始化時Log會提示缺少相關配置,并建議你在AndroidManifest.xml中添加權限。PS:無此權限不影響運行,只會在Log有警告信息,并且耗電較快。

1.2 AndEngine的基本運行流程:


由于AndEngine是專供Android使用的2D游戲引擎,所以作為啟動類的Activity肯定必不可少,而AndEngine也理所應當的提供給我們這樣一個Activity,那就是BaseGameActivity。

一個標準的AndEngine應用,至少應該對BaseGameActivity做如下繼承:



其中四個必須被重載函數的啟動順序如下:


onLoadEngine->onLoadResources->onLoadScene->onLoadComplete


具體的講,AndEngine會首先加載Engine類實例通知系統游戲引擎的基本運行方式,而后加載游戲資源,其次加載游戲場景實例,最后通過onLoadComplete通知用戶加載完畢并于此進行善后工作。

此外,由于BaseGameActivity類重載了父類Activity的onResume與onPause函數以保證其自身的正常運行,所以不建議在繼承BaseGameActivity時再次重載上述函數(重載的話不要忘記super調用),推薦直接重載AndEngine提供的onGamePaused和onGameResumed實現同等功能(最近把LGame也加上了這樣的兩個函數,并且禁止了LGameAndroid2DActivity子類重載onResume與onPause,務求減少用戶錯誤重載導致的程序異常)。

1.3 AndEngine的基本運行方式:


上文介紹了AndEngine的基本運行機制與運行流程,然而僅僅這樣AndEngine還是無法實際運行,因為Engine與Scene都沒有獲得具體實現。假如我們想要在屏幕上顯示出當前應用FPS數,至少需要做如下改動,才能滿足一個最為基本的AndEngine應用:


運行效果如下圖所示:

00

另外,事實上BaseGameActivity并非AndEngine提供的唯一Activity,其UI包下尚有以SplashScene場景作為特效啟動的BaseSplashActivity類,以及通過重載getLayoutID與getRenderSurfaceViewID這兩個抽象函數,調用指定布局與視圖的LayoutGameActivity類。不過除了上述特點,它們與BaseGameActivity就再無區別了。

二、如何使用AndEngine中的常用功能:


事實上,AndEngine中組件顆粒都非常細小,幾乎每個由AndEngine提供的功能都會有一個對應的類存在;個人認為,AndEngine將許多很小很小的功能,做成了太多太多的模塊,似乎有些封裝過度。

比如僅Engine就衍生出DoubleSceneSplitScreenEngine(可以同時顯示并緩存兩個Scene的Engine,通過setFirstScene以及setSecondScene進行雙屏切換,即分屏用Engine)、SingleSceneSplitScreenEngine(與DoubleSceneSplitScreenEngine類似,但一次只能顯示一個畫面)、LimitedFPSEngine(可限制FPS速度的Engine,重載了標準Engine的onUpdate函數,減速方式為常見的線程延遲)、FixedStepEngine(與LimitedFPSEngine近似,重載了標準Engine的onUpdate函數,但是它通過反復while方式最大限度矯正AndEngine內部計時器的累加數值,以求每次線程主循環的幀數都與預想幀數相等)等許多子類(目前細分還在不斷增加)。

其實,這些功能完全可以進行統一實現,而不必占據那么的應用空間與用戶記憶細胞(PS:有日本人(疑似,服務器在東京)做過一個叫e3roid的同類項目,雖然結構異常近似AndEngine,個人認為具體實現卻比AndEngine更合理,項目在:http://www.e3roid.com,有時間小弟會單獨介紹一下)。

當然,這篇文章是對AndEngine的使用入門,而并非對AndEngine的“抱怨入門”,所以下面開始,小弟將對AndEngine的主要功能進行初步講解。

2.1 AndEngine的IUpdateHandler接口:


IUpdateHandler類是AndEngine引擎中使用頻率非常之高的組件之一,其本身是一個接口,內部有onUpdate以及reset兩個函數等待實現,幾乎所有AndEngine應用中都必然會看到它的身影,它也是AndEngine添加具體業務到游戲業務線程中的主要方法之一。

具體的講,所有通過AndEngine中registerUpdateHandler函數注冊的IUpdateHandler,都會被保存到一個叫做UpdateHandlerList的IUpdateHandler接口集合當中。雖然UpdateHandlerList本身也是一個IUpdateHandler接口的實現,然而它的地位卻比較特殊,基本只存在于Engine及Scene類中,并只供Engine類中的onTickUpdate函數調用(PS:Scene類中雖有獨立的UpdateHandlerList,但事實上它依舊只被Engine中的onTickUpdate執行)。每當AndEngine業務線程循環onTickUpdate這個Engine內部方法時,都會調用UpdateHandlerList中存在的所有IUpdateHandler,直到注銷相關的IUpdateHandler實例為止。

另外,與UpdateHandlerList集合類作用類似的還有RunnableHandler類,該類同樣是IUpdateHandler的具體實現,它的作用在于保存并執行一次標準Runnable(每次業務循環后都會清空RunnableHandler的內部數據)。該類在AndEngine業務線程中的執行時機略早于UpdateHandlerList,我們可以通過RunnableHandler類中的postRunnable函數,或Engine類中的runOnUpdateThread函數添加Runnable到該集合(runOnUpdateThread函數為postRunnable函數的調用封裝,Engine類及相關子類,BaseGameActivity類及相關子類中可見)。

2.2 AndEngine的Async方法:


默認情況下,AndEngine的資源加載會在構建Engine之后,調用onLoadResources函數時進行同步加載。但如果一次性加載資源太多時,便可能會面臨一個問題,那就是Android系統將自動關閉長期無響應的UI。所以一旦采取同步執行的加載策略,數據量過大時就有可能將我們的APK卡死。因此,這就需要異步加載策略來解決問題,而AndEngine也確實提供了我們這樣的異步加載方式。

具體的講,AndEngine對Android系統自帶的AsyncTask類進行了適當封裝(具體封裝在BaseActivity類中,該類為BaseGameActivity的父類,AndEngine由此類開始實際繼承Activity,但BaseGameActivity的主要功能并不在此類),只要通過doAsync或者doProgressAsync函數就可以調用,實現代碼如下所示:

效果圖如下所示:

00


2.3 AndEngine中的精靈調用:


精靈類,是一個大家耳熟能詳,并且任何游戲引擎無法回避的關鍵性組件之一,它常常被用來表示一個游戲中角色或者特定畫面要素。如此重要的存在,AndEngine當然也不能缺少,其精靈類的基本使用方法如下所示:


2.3 AndEngine的精靈動畫:


在絕大多數的游戲開發中,僅僅有精靈類存在是并不足夠的,我們往往還需要讓精靈作出絢麗的效果以吸引用戶眼球,而這些效果在AndEngine中,統一通過它所提供的各個Modifier類進行實現。具體調用代碼如下所示:


效果如下圖所示:

00


三、AndEngine的常用模塊介紹:


由于AndEngine包的下屬類較多,并且細分也較為龐雜,在一篇文章中一次性介紹完畢幾乎不可能實現。所以下面開始,小弟會就AndEngine的一些核心模塊進行簡明扼要的說明,但如果前文做過說明的下文會一筆帶過。

PS:事實上,就連AndEngine作者也不可能做到詳細介紹,畢竟到目前為止AndEngine壓根沒有出過文檔。(連andengineexamples下的示例代碼都已經和最新的AndEngine源碼脫離了……)

1、關于Engine:

Engine是AndEngine的核心所在,它對AndEngine引擎中Camera、Scene等重要組件進行了統一管理,但必須和BaseGameActivity合作使用,利用EngineOptions類可以對其進行必要的參數配置。

2、關于BaseGameActivity:


如果您想正常使用AndEngine,那么當前Activity就必須繼承自BaseGameActivity或其子類,否則你連初始化Engine也做不到。雖然它還有父類BaseActivity,但BaseActivity只提供了一些異步加載方法而無關AndEngine的主體實現。因此,BaseGameActivity就是實際上的AndEngine最基礎用類無疑。

3、關于IResolutionPolicy:


IResolutionPolicy是一個接口類,其中只規定了onMeasure函數的實現格式。事實上,AndEngine中所有該類具體實現的作用與標準View中的onMeasure函數幾乎一致,也會被標準View中的onMeasure函數重載調用(具體調用在AndEngine的RenderSurfaceView類當中)。而且除BaseResolutionPolicy外,所有AndEngine的IResolutionPolicy實現也都調用了View的setMeasuredDimensionProxy函數。

在AndEngine的org.anddev.andengine.engine.options.resolutionpolicy包下有一組IResolutionPolicy接口的具體實現,分別為BaseResolutionPolicy(除了會校驗一下屏幕大小外,什么也不做)、FillResolutionPolicy(拉伸游戲畫面為全屏填充,視攝像機大小不同,會有不同程度變形)、FixedResolutionPolicy(強行規定游戲畫面為固定大小,此設置不會自動適應屏幕大小),RatioResolutionPolicy(按比例修正畫面大小,以適應屏幕大小),RelativeResolutionPolicy(根據構建RelativeResolutionPolicy時的縮放參數,縮放游戲屏幕為指定比例)。

最后,所有IResolutionPolicy的實現類,都要隨著EngineOptions于初試化時傳遞給Engine實例才起作用。

4、關于Camera:


該類即我們常說的游戲攝像機,在AndEngine的Camera有兩種作用,一是用以調節屏幕的顯示區域,二是利用HUD類實際繪制游戲屏幕于手機之上。

5、關于Scene:


場景容器,作用類似于LGame中的Screen,能夠將某一特定場景作為游戲模塊進行調用,我們可以利用它來切換當前游戲的畫面與觸摸屏監聽,切換方法是利用Engine.setScene。

6、關于Entity:


Entity是IEntity接口的具體實現,也是AndEngine中無論Scene、Layer、Sprite(這個繼承關系比較遠,中間隔了BaseRectangle、RectangularShape、GLShape、Shape等上級類,不過追溯源頭始終繼承自Entity)的統一父類,通過Entity我們可以讓AndEngine中場景,或場景中某精靈實現統一效果的縮放、旋轉、變色等操作。

7、關于Texture:


Texture是AndEngine所提供的紋理用類,但Texture本身(在AndEngine中)并沒有提供加載圖片的方法,必須通過TextureRegionFactory類(更準確的說,依賴它內部封裝的TextureRegion、BuildableTexture等類)與之合作才可以加載紋理。除此之外,AndEngine要求所加載紋理(圖片)大小必須為2的整數次冪。

8、關于TextureRegion:


TextureRegion的父類是抽象類BaseTextureRegion,主要功能也被封裝在BaseTextureRegion類當中,AndEngine提供了TextureRegionFactory這個工廠類用以簡化構建TextureRegion的流程。單就TextureRegion來講,它的作用似乎就是讓系統知道如何剪切一個紋理,并返回一個這樣的紋理給你。

然而,事實上AndEngine中只有TextureRegion才更接近于通常意義上的Texture。或者說,只有TextureRegion + Texture時,我們才能較為完整的使用AndEngine紋理功能。嚴肅的講,AndEngine中的Texture有很多功能必須靠TextureRegion最終完成,比如AndEngine中的Sprite必須加載TextureRegion才能使用Texture,而不是直接調用Texture,TMXTiledMap中讀取指定瓦片返回的也是TextureRegion,而非直接的Texture(進行畫面渲染時AndEngine內部會調用TextureRegion中的Texture引用,但也只允許如此調用);應該說,AndEngine中見Texture幾乎必見TextureRegion,二者無法分離,缺一不可。

9、關于TextureOptions


在AndEngine中,TextureRegionFactory類決定紋理的加載路徑,Texture類作為承載紋理的實體對象,而TextureOptions類決定了紋理的渲染方式。

也即是說,OpenGLES將以何種方式顯示紋理圖像,都由TextureOptions類所決定。在當前最新版本的AndEngine中,默認提供了:

1、NEAREST(Nearest濾波,實現上依賴GL_NEAREST做不光滑過濾,紋理環繞模式為GL_CLAMP_TO_EDGE,顯示速度快畫質差)

2、BILINEAR(雙線性插值,實現上依賴GL_LINEAR做線性濾波,紋理環繞模式為GL_CLAMP_TO_EDGE,顯示速度慢畫質佳)

3、REPEATING(與NEAREST同為Nearest濾波,但紋理環繞模式為GL_REPEAT,會自動填充紋理上的空白區域,顯示速度較快畫質差)

4、REPEATING_BILINEAR(與BILINEAR同為雙線性插值,但紋理環繞模式為GL_REPEAT,會自動填充紋理上的空白區域,顯示速度很慢畫質佳(低端機跑此模式異常悲劇,高端機尚可))

5、NEAREST_PREMULTIPLYALPHA(所有[PREMULTIPLYALPHA]結尾的TextureOptions與其它同名類差別僅在于是否支持根據Alpha值設置透明紋理,以下同)

6、BILINEAR_PREMULTIPLYALPHA

7、REPEATING_PREMULTIPLYALPHA

8、REPEATING_BILINEAR_PREMULTIPLYALPHA等靜態對象。

以上TextureOptions實例都可以通過“TextureOptions.XXXXXX”的方式進行引用并設置給Texture。事實上,除了AndEngine提供的Texture渲染模式,我們也可以按照規則自行構建需要的TextureOptions。

比如構建一個混插的TextureOptions:


new TextureOptions(GL10.GL_LINEAR_MIPMAP_LINEAR, GL10.GL_LINEAR_MIPMAP_NEAREST, GL10.GL_REPEAT, GL10.GL_REPEAT, GL10.GL_MODULATE, true);


另外,TextureOptions默認還有DEFAULT模式,不過該模式實際引用為NEAREST_PREMULTIPLYALPHA,也就是紋理低畫質但支持Alpha。如果您想要兼容低端機,則建議不要使用含有【BILINEAR】字樣的AndEngine加載大圖,而應直接使用TextureOptions.DEFAULT或TextureOptions.NEAREST_PREMULTIPLYALPHA;因為BILINEAR模式對硬件要求較高,如果以此模式將較大紋理放到低端機上渲染,速度很可能無法保證。但是,假如您的游戲只針對高端機用戶便無需介懷了。

————————————————————————————————————————

最近準備先把常見Android游戲引擎的粗略使用入門寫全,如果大家對某幾個引擎表現的興趣較為濃厚,小弟也會進一步詳細講解。

另外小弟前天剛回北京,所以把LGame的開發又耽誤了一段,沒能如預想中在本周發布0.3,但也快到收尾,在性能上也強化了不少。另外近期www.java4k.com網站更新了不少有價值的Java小游戲Demo。(小弟不是教大家偷奸耍滑,但反向一下源碼,就可以按照常規的Java2D方式把其業務實現挪到LGame中了嘛,純學習用……)

Android游戲框架AndEngine使用入門


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人午夜天堂 | 看免费的毛片 | 欧美成人在线免费观看 | 中文字幕在线精品 | 天天操很很操 | 国产高清在线精品免费 | 猫鼠游戏电影在线观看免费版 | 日韩精品久久久久久 | 在线国产视频 | 久久亚洲精品玖玖玖玖 | 一道本不卡一区 | a毛片成人免费全部播放 | 猫鼠游戏电影在线观看免费版 | 久久精品一区二区国产 | 一区二区三区毛片 | 久久精品视香蕉蕉er大臿蕉 | 欧美久久一区二区三区 | 欧美精品一二区 | 久草手机在线视频 | 免费精品美女久久久久久久久久 | 奇米影视888狠狠狠777不卡 | 成在线人视频免费视频 | 欧美日韩在线一区 | 日韩加勒比| 国产精品国产精品 | 日韩精品一区二区在线观看 | 久久久久国产成人精品亚洲午夜 | 亚洲午夜精品aaa级久久久久 | 91免费在线播放 | www亚洲成人| 日韩欧美二区 | 成人性大片免费观看网站 | 欧美成人一区在线 | 99久久99热久久精品免费看 | a欧美 | jiucao视频在线观看 | 欧美aaa级片 | 免费黄色小视频 | 黄色一级大片在线免费看产 | 国产成人精品999在线观看 | 精品一区久久 |