Android游戲框架AndEngine使用入門_第1頁
Android游戲框架AndEngine使用入門_第2頁
Android游戲框架AndEngine使用入門_第3頁
Android游戲框架AndEngine使用入門_第4頁
Android游戲框架AndEngine使用入門_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Android游戲框架AndEngine使用入門項目站點: 項目地址:示例地址:PS:本文中使用的AndEngine源碼為2011年3月3日獲得。 AndEngine是一款以OpenGLES方式進行畫面渲染的2D游戲引擎,可以運行在支持Android 1.6及以上版本的系統(tǒng)當中。應該說,相較前文介紹的Libgdx引擎,AndEngine擁有更多的游戲組件與擴展功能。并且與Libgdx不同,它在默認情況下已經可以支持中文,采用屏幕坐標系繪也更符合一般Android繪圖習慣。然而,有其利也必有其弊,AndEngine作為游戲引擎雖然

2、在功能上較Libgdx更為豐富也更人性化,但相比Libgdx的繪圖渲染機能卻遜色不少(粗讀源碼可以發(fā)現,Libgdx有較為完善的OpenGLES環(huán)境適應性,而AndEngine在這方面的投入明顯不足)。事實上,市井也一直有流言說AndEngine引擎在不同手機機型上的表現并不穩(wěn)定(詳見:所以,您是否選擇AndEngine引擎,還是應該從實際出發(fā),多做真機測試才好下決定。下面開始,我將逐步講解一些有關AndEngine引擎的基礎信息。AndEngine引擎基礎構成如下圖所示: 一、如何使用AndEngine: 1.1 AndEngine的基本運行原理: 解讀AndE

3、ngine源碼后我們可以發(fā)現,AndEngine除了采取低耦合、高內聚的框架策略細分引擎模塊,使用OpenGLES進行游戲渲染之外;該引擎還以雙線程方式分別驅動繪圖與事務更新,事實上,它將游戲畫面和游戲業(yè)務分為兩組邏輯,并行跑在同級的互斥線程當中。具體地說,其繪圖線程位于AndEngine提供的GLSurfaceView內部類GLThread(在AndEngine的org.anddev.andengine.opengl.view包下,非Android默認的GLSurfaceView),并通過GLSurfaceView子類,即AndEngine提供的RenderSurfaceView類調用重載的

4、onDrawFrame函數加以渲染控制;而業(yè)務線程在Engine類的內部類UpdateThread中,AndEngine將始終以while(true)這樣的死循環(huán)方式快速執(zhí)行其中的onTickUpdate函數,所有AndEngine提供的游戲業(yè)務最終都會由此函數調用及執(zhí)行,比如AndEngine常用的registerUpdateHandler方法就是向它提交數據。當AndEngine進行游戲繪圖時,游戲業(yè)務線程會通過wait方式鎖定,而當游戲業(yè)務處理時,也會以同樣的手段鎖定繪圖線程,二者間具體交互關系由Engine類中的State子類控制,以此保證游戲畫面與游戲業(yè)務同步。另外,或許是考慮到持續(xù)

5、雙線程運行電量消耗較大的緣故,AndEngine默認情況下要求用戶啟動PowerManager進行電源管理,故此需要<uses-permission android:name="android.permission.WAKE_LOCK"/>權限支持,否則初始化時Log會提示缺少相關配置,并建議你在AndroidManifest.xml中添加權限。PS:無此權限不影響運行,只會在Log有警告信息,并且耗電較快。1.2 AndEngine的基本運行流程: 由于AndEngine是專供Android使用的2D游戲引擎,所以作為啟動類的Activity肯定必不

6、可少,而AndEngine也理所應當的提供給我們這樣一個Activity,那就是BaseGameActivity。一個標準的AndEngine應用,至少應該對BaseGameActivity做如下繼承:view plain1. public class Main extends BaseGameActivity   2.     public void onLoadComplete()   3.    &#

7、160;     4.       5.     public Engine onLoadEngine()   6.         return null;  7.       8.    

8、0;public void onLoadResources()   9.          10.       11.     public Scene onLoadScene()   12.         return

9、0;null;  13.         14.   其中四個必須被重載函數的啟動順序如下: onLoadEngine->onLoadResources->onLoadScene->onLoadComplete 具體的講,AndEngine會首先加載Engine類實例通知系統(tǒng)游戲引擎的基本運行方式,而后加載游戲資源,其次加載游戲場景實例,最后通過onLoadComplete通知用戶加載完畢并于此進行善后工作。此外,由于BaseGameAc

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

11、AndEngine還是無法實際運行,因為Engine與Scene都沒有獲得具體實現。假如我們想要在屏幕上顯示出當前應用FPS數,至少需要做如下改動,才能滿足一個最為基本的AndEngine應用:view plain1. public class Main extends BaseGameActivity   2.     private static final int CAMERA_WIDTH = 320; 

12、60;3.     private static final int CAMERA_HEIGHT = 480;  4.     private Camera andCamera;  5.     private Texture myFontTexture;  6.     pri

13、vate Font myFont;  7.     public void onLoadComplete()   8.       9.     public Engine onLoadEngine()   10.         /

14、60;構建攝像機  11.         this.andCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);  12.         / 構建Engine,全屏顯示,手機方向為豎屏,按比例拉伸  13.    

15、60;    return new Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT,  14.                 new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), &

16、#160;15.                 this.andCamera);  16.       17.     public void onLoadResources()   18.       &#

17、160; / 構建一個紋理用以顯示文字  19.         this.myFontTexture = new Texture(256, 256, TextureOptions.DEFAULT);  20.         / 構建字體  21.     

18、    this.myFont = new Font(this.myFontTexture, Typeface.create(  22.                 Typeface.DEFAULT, Typeface.BOLD), 32, true, Color.WHITE); &#

19、160;23.         / 注入相關紋理及字體  24.         this.mEngine.getTextureManager().loadTexture(this.myFontTexture);  25.         this.mEngine.getFontManager().loadF

20、ont(this.myFont);  26.       27.     public Scene onLoadScene()   28.         / 構建場景,允許的最大Layer數量為1  29.         final&#

21、160;Scene scene = new Scene(1);  30.         / 使用可以變更內容的ChangeableText顯示FPS(它的父類Text不允許改變顯示內容),位置在15,5,  31.         / 字體為myFont中所規(guī)定的,最多允許顯示5個字符(設置能顯示幾個字符,實際就能顯示幾個, 

22、 32.         / AndEngine不能自動擴充,不填以初始化時輸入的字符數計算)  33.         final ChangeableText text = new ChangeableText(5, 5, this.myFont,  34.     

23、;            "0.0", 5);  35.         / 注冊FPS監(jiān)聽  36.         this.mEngine.registerUpdateHandler(new FPSLogger() 

24、;  37.             protected void onHandleAverageDurationElapsed(final float pFPS)   38.                 super.onHa

25、ndleAverageDurationElapsed(pFPS);  39.                 / 傳遞內容到ChangeableText  40.                 text.setText(&quo

26、t;" + pFPS);  41.               42.         );  43.         / 將ChangeableText注入場景  44.   &

27、#160;     scene.attachChild(text);  45.         / 構建場景,可容納圖層數為1  46.         return scene;  47.       48.   運行效果如下圖

28、所示:  另外,事實上BaseGameActivity并非AndEngine提供的唯一Activity,其UI包下尚有以SplashScene場景作為特效啟動的BaseSplashActivity類,以及通過重載getLayoutID與getRenderSurfaceViewID這兩個抽象函數,調用指定布局與視圖的LayoutGameActivity類。不過除了上述特點,它們與BaseGameActivity就再無區(qū)別了。二、如何使用AndEngine中的常用功能: 事實上,AndEngine中組件顆粒都非常細小,幾乎每個由AndEngine提供的功能都會有一個對

29、應的類存在;個人認為,AndEngine將許多很小很小的功能,做成了太多太多的模塊,似乎有些封裝過度。 比如僅Engine就衍生出DoubleSceneSplitScreenEngine(可以同時顯示并緩存兩個Scene的Engine,通過setFirstScene以及setSecondScene進行雙屏切換,即分屏用Engine)、SingleSceneSplitScreenEngine(與DoubleSceneSplitScreenEngine類似,但一次只能顯示一個畫面)、LimitedFPSEngine(可限制FPS速度的Engine,重載了標準Engine的onUpdate

30、函數,減速方式為常見的線程延遲)、FixedStepEngine(與LimitedFPSEngine近似,重載了標準Engine的onUpdate函數,但是它通過反復while方式最大限度矯正AndEngine內部計時器的累加數值,以求每次線程主循環(huán)的幀數都與預想幀數相等)等許多子類(目前細分還在不斷增加)。 其實,這些功能完全可以進行統(tǒng)一實現,而不必占據那么的應用空間與用戶記憶細胞(PS:有日本人(疑似,服務器在東京)做過一個叫e3roid的同類項目,雖然結構異常近似AndEngine,個人認為具體實現卻比AndEngine更合理,項目在:,有時間小弟會單獨介紹一下)。當然,這篇文

31、章是對AndEngine的使用入門,而并非對AndEngine的“抱怨入門”,所以下面開始,小弟將對AndEngine的主要功能進行初步講解。2.1 AndEngine的IUpdateHandler接口: IUpdateHandler類是AndEngine引擎中使用頻率非常之高的組件之一,其本身是一個接口,內部有onUpdate以及reset兩個函數等待實現,幾乎所有AndEngine應用中都必然會看到它的身影,它也是AndEngine添加具體業(yè)務到游戲業(yè)務線程中的主要方法之一。具體的講,所有通過AndEngine中registerUpdateHandler函數注冊的IUpdateH

32、andler,都會被保存到一個叫做UpdateHandlerList的IUpdateHandler接口集合當中。雖然UpdateHandlerList本身也是一個IUpdateHandler接口的實現,然而它的地位卻比較特殊,基本只存在于Engine及Scene類中,并只供Engine類中的onTickUpdate函數調用(PS:Scene類中雖有獨立的UpdateHandlerList,但事實上它依舊只被Engine中的onTickUpdate執(zhí)行)。每當AndEngine業(yè)務線程循環(huán)onTickUpdate這個Engine內部方法時,都會調用UpdateHandlerList中存在的所有I

33、UpdateHandler,直到注銷相關的IUpdateHandler實例為止。另外,與UpdateHandlerList集合類作用類似的還有RunnableHandler類,該類同樣是IUpdateHandler的具體實現,它的作用在于保存并執(zhí)行一次標準Runnable(每次業(yè)務循環(huán)后都會清空RunnableHandler的內部數據)。該類在AndEngine業(yè)務線程中的執(zhí)行時機略早于UpdateHandlerList,我們可以通過RunnableHandler類中的postRunnable函數,或Engine類中的runOnUpdateThread函數添加Runnable到該集合(runO

34、nUpdateThread函數為postRunnable函數的調用封裝,Engine類及相關子類,BaseGameActivity類及相關子類中可見)。2.2 AndEngine的Async方法: 默認情況下,AndEngine的資源加載會在構建Engine之后,調用onLoadResources函數時進行同步加載。但如果一次性加載資源太多時,便可能會面臨一個問題,那就是Android系統(tǒng)將自動關閉長期無響應的UI。所以一旦采取同步執(zhí)行的加載策略,數據量過大時就有可能將我們的APK卡死。因此,這就需要異步加載策略來解決問題,而AndEngine也確實提供了我們這樣的異步加載方式。具體

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

36、; private static final int CAMERA_WIDTH = 320;  3.     private static final int CAMERA_HEIGHT = 480;  4.     private Camera andCamera;  5.   

37、0; public void onLoadComplete()   6.       7.     public Engine onLoadEngine()   8.         / 構建攝像機  9.       

38、  this.andCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);  10.         / 構建Engine,全屏顯示,手機方向為豎屏,按比例拉伸  11.         return new Engine(new&#

39、160;EngineOptions(true, ScreenOrientation.PORTRAIT,  12.                 new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),  13.         

40、60;       this.andCamera);  14.       15.     public void onLoadResources()   16.         / 運行一個異步加載,設定內部ProgressDialog標題為資源索引test1對應的字

41、符,內容為test2對應的資源  17.         this.doAsync(R.string.test1, R.string.test2, new Callable<Void>()   18.             / 希望AndEngine異步加載的數據  19.

42、            public Void call() throws Exception   20.                 for (int i = 0; i <

43、60;Integer.MAX_VALUE; i+)   21.                   22.                 return null;  23.  &

44、#160;            24.             / 當加載完成后回調,可在此進行一些加載完畢的事后處理  25.         , new org.anddev.andengine.util.Callback&

45、lt;Void>()   26.             public void onCallback(final Void pCallbackValue)   27.                 Log.d(

46、"Callback", "over");  28.               29.         );  30.       31.     public Scene

47、0;onLoadScene()   32.         / 構建場景,允許的最大Layer數量為1  33.         final Scene scene = new Scene(1);  34.         ret

48、urn scene;  35.       36.    效果圖如下所示: 2.3 AndEngine中的精靈調用: 精靈類,是一個大家耳熟能詳,并且任何游戲引擎無法回避的關鍵性組件之一,它常常被用來表示一個游戲中角色或者特定畫面要素。如此重要的存在,AndEngine當然也不能缺少,其精靈類的基本使用方法如下所示:view plain1. public class Main extends BaseGameActi

49、vity   2.     private static final int CAMERA_WIDTH = 320;  3.     private static final int CAMERA_HEIGHT = 480;  4.     private Camera 

50、;andCamera;  5.     private TextureRegion myTextureRegion;  6.     public void onLoadComplete()   7.       8.     public Engine onLoadEngine()

51、60;  9.         / 構建攝像機  10.         this.andCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);  11.         /

52、 構建Engine,全屏顯示,手機方向為豎屏,按比例拉伸  12.         return new Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT,  13.                 ne

53、w RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),  14.                 this.andCamera);  15.       16.     public void onLoadR

54、esources()   17.         /構建紋理  18.         Texture myTexture = new Texture(64, 64, TextureOptions.DEFAULT);  19.        

55、; /加載指定路徑紋理到myTextureRegion  20.         this.myTextureRegion = TextureRegionFactory.createFromAsset(myTexture,  21.                 this, &

56、quot;Ball.png", 0, 0);  22.         /載入紋理到TextureManager  23.         this.getEngine().getTextureManager().loadTextures(myTexture);  24.       25

57、.     public Scene onLoadScene()   26.         / 構建場景,允許的最大Layer數量為1  27.         final Scene scene = new Scene(1);  28. 

58、0;       / 以myTextureRegion構建Sprite(TextureRegion內部有Texture的引用,AndEngine在構建Sprite時一起加載了),到坐標55,55  29.         Sprite sprite = new Sprite(55, 55, myTextureRegion);  30. &

59、#160;       / 添加精靈  31.         scene.attachChild(sprite);  32.         return scene;  33.       34.   2.

60、3 AndEngine的精靈動畫: 在絕大多數的游戲開發(fā)中,僅僅有精靈類存在是并不足夠的,我們往往還需要讓精靈作出絢麗的效果以吸引用戶眼球,而這些效果在AndEngine中,統(tǒng)一通過它所提供的各個Modifier類進行實現。具體調用代碼如下所示:view plain1. public class Main extends BaseGameActivity   2.     private static final int CAMERA_

61、WIDTH = 320;  3.     private static final int CAMERA_HEIGHT = 480;  4.     private Camera andCamera;  5.     private TextureRegion myTextureRegion;

62、60; 6.     public void onLoadComplete()   7.       8.     public Engine onLoadEngine()   9.         / 構建攝像機  10.  &

63、#160;      this.andCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);  11.         / 構建Engine,全屏顯示,手機方向為豎屏,按比例拉伸  12.         retu

64、rn new Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT,  13.                 new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),  14.    

65、0;            this.andCamera);  15.       16.     public void onLoadResources()   17.         / 構建紋理 

66、0;18.         Texture myTexture = new Texture(64, 64, TextureOptions.DEFAULT);  19.         / 加載指定路徑紋理到myTextureRegion  20.        

67、; this.myTextureRegion = TextureRegionFactory.createFromAsset(myTexture,  21.                 this, "Ball.png", 0, 0);  22.       

68、  / 載入紋理到TextureManager  23.         this.getEngine().getTextureManager().loadTextures(myTexture);  24.       25.     public Scene onLoadScene()   26.

69、         / 在Log中顯示FPS數  27.         getEngine().registerUpdateHandler(new FPSLogger();  28.         / 構建場景,允許的最大Layer數量為1  29.  &#

70、160;      final Scene scene = new Scene(1);  30.         / 獲得相對中心坐標  31.         final int centerX = (CAMERA_WIDTH 

71、- this.myTextureRegion.getWidth() / 2;  32.         final int centerY = (CAMERA_HEIGHT - this.myTextureRegion.getHeight() / 2;  33.         /

72、0;以myTextureRegion構建Sprite(TextureRegion內部有Texture的引用,AndEngine在構建Sprite時一起加載了),到屏幕中心  34.         final Sprite sprite = new Sprite(centerX, centerY, this.myTextureRegion);  35.     

73、60;   / 添加精靈  36.         scene.attachChild(sprite);  37.         / 制作一組動作序列,首先10秒內不斷順時針旋轉360度,而后10秒內不斷逆時針旋轉360度  38.         

74、;SequenceEntityModifier ballAction = new SequenceEntityModifier(  39.                 new RotationModifier(10, 0, 360), new RotationModifier(10, 360,  

75、;40.                         0);  41.         / 注冊動作序列到精靈  42.         spri

76、te.registerEntityModifier(ballAction);  43.         return scene;  44.       45.   效果如下圖所示:三、AndEngine的常用模塊介紹: 由于AndEngine包的下屬類較多,并且細分也較為龐雜,在一篇文章中一次性介紹完畢幾乎不可能實現。所以下面開始,小弟會就AndEngine的一些核心模塊進行

77、簡明扼要的說明,但如果前文做過說明的下文會一筆帶過。PS:事實上,就連AndEngine作者也不可能做到詳細介紹,畢竟到目前為止AndEngine壓根沒有出過文檔。(連andengineexamples下的示例代碼都已經和最新的AndEngine源碼脫離了)1、關于Engine: Engine是AndEngine的核心所在,它對AndEngine引擎中Camera、Scene等重要組件進行了統(tǒng)一管理,但必須和BaseGameActivity合作使用,利用EngineOptions類可以對其進行必要的參數配置。2、關于BaseGameActivity: 如果您想正常使用And

78、Engine,那么當前Activity就必須繼承自BaseGameActivity或其子類,否則你連初始化Engine也做不到。雖然它還有父類BaseActivity,但BaseActivity只提供了一些異步加載方法而無關AndEngine的主體實現。因此,BaseGameActivity就是實際上的AndEngine最基礎用類無疑。3、關于IResolutionPolicy: IResolutionPolicy是一個接口類,其中只規(guī)定了onMeasure函數的實現格式。事實上,AndEngine中所有該類具體實現的作用與標準View中的onMeasure函數幾乎一致,也會被標準V

79、iew中的onMeasure函數重載調用(具體調用在AndEngine的RenderSurfaceView類當中)。而且除BaseResolutionPolicy外,所有AndEngine的IResolutionPolicy實現也都調用了View的setMeasuredDimensionProxy函數。在AndEngine的org.anddev.andengine.engine.options.resolutionpolicy包下有一組IResolutionPolicy接口的具體實現,分別為BaseResolutionPolicy(除了會校驗一下屏幕大小外,什么也不做)、FillResolut

80、ionPolicy(拉伸游戲畫面為全屏填充,視攝像機大小不同,會有不同程度變形)、FixedResolutionPolicy(強行規(guī)定游戲畫面為固定大小,此設置不會自動適應屏幕大?。?,RatioResolutionPolicy(按比例修正畫面大小,以適應屏幕大?。琑elativeResolutionPolicy(根據構建RelativeResolutionPolicy時的縮放參數,縮放游戲屏幕為指定比例)。最后,所有IResolutionPolicy的實現類,都要隨著EngineOptions于初試化時傳遞給Engine實例才起作用。4、關于Camera: 該類即我們常說的游戲攝像機,在AndEngine的Camera有兩種作用,一是用以調節(jié)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論