Android遊戲框架AndEngine使用

AndEngine是一款以OpenGLES方式進行畫面渲染的2D遊戲引擎,能夠運行在支持Android 1.6及以上版本的系統當中。應該說,相較前文介紹的Libgdx引擎,AndEngine擁有更多的遊戲組件與擴展功能。而且與Libgdx不一樣,它在默認狀況下已經能夠支持中文,採用屏幕座標系繪也更符合通常Android繪圖習慣。
然而,有其利也必有其弊,AndEngine做爲遊戲引擎雖然在功能上較Libgdx更爲豐富也更人性化,但相比Libgdx的繪圖渲染機能卻遜色很多(粗讀源碼能夠發現,Libgdx有較爲完善的OpenGLES環境適應性,而AndEngine在這方面的投入明顯不足)。事實上,市井也一直有流言說AndEngine引擎在不一樣手機機型上的表現並不穩定(詳見:http://www.badlogicgames.com/wordpress/?p=816http://www.badlogicgames.com/wordpress/?p=803 ,Libgdx做者Mario所寫)。
因此,您是否選擇AndEngine引擎,仍是應該從實際出發,多作真機測試纔好下決定。下面開始,我將逐步講解一些有關AndEngine引擎的基礎信息。
AndEngine引擎基礎構成以下圖所示:  android

1、如何使用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作以下繼承:緩存

  1. publicclass Main extends BaseGameActivity { 
  2.     publicvoid onLoadComplete() { 
  3.         
  4.     } 
  5.     public Engine onLoadEngine() { 
  6.         returnnull
  7.     } 
  8.     publicvoid onLoadResources() { 
  9.         
  10.     } 
  11.     public Scene onLoadScene() { 
  12.         returnnull
  13.     }   

其中四個必須被重載函數的啓動順序以下: 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應用:服務器

  1. publicclass Main extends BaseGameActivity { 
  2.     privatestaticfinalint CAMERA_WIDTH = 320
  3.     privatestaticfinalint CAMERA_HEIGHT = 480
  4.     private Camera andCamera; 
  5.     private Texture myFontTexture; 
  6.     private Font myFont; 
  7.     publicvoid onLoadComplete() { 
  8.     } 
  9.     public Engine onLoadEngine() { 
  10.         // 構建攝像機 
  11.         this.andCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
  12.         // 構建Engine,全屏顯示,手機方向爲豎屏,按比例拉伸 
  13.         returnnew Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT, 
  14.                 new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), 
  15.                 this.andCamera)); 
  16.     } 
  17.     publicvoid onLoadResources() { 
  18.         // 構建一個紋理用以顯示文字 
  19.         this.myFontTexture = new Texture(256, 256, TextureOptions.DEFAULT); 
  20.         // 構建字體 
  21.         this.myFont = new Font(this.myFontTexture, Typeface.create( 
  22.                 Typeface.DEFAULT, Typeface.BOLD), 32, true, Color.WHITE); 
  23.         // 注入相關紋理及字體 
  24.         this.mEngine.getTextureManager().loadTexture(this.myFontTexture); 
  25.         this.mEngine.getFontManager().loadFont(this.myFont); 
  26.     } 
  27.     public Scene onLoadScene() { 
  28.         // 構建場景,容許的最大Layer數量爲1 
  29.         final Scene scene = new Scene(1); 
  30.         // 使用能夠變動內容的ChangeableText顯示FPS(它的父類Text不容許改變顯示內容),位置在15,5, 
  31.         // 字體爲myFont中所規定的,最多容許顯示5個字符(設置能顯示幾個字符,實際就能顯示幾個, 
  32.         // AndEngine不能自動擴充,不填以初始化時輸入的字符數計算……) 
  33.         final ChangeableText text = new ChangeableText(5, 5, this.myFont, 
  34.                 "0.0", 5); 
  35.         // 註冊FPS監聽 
  36.         this.mEngine.registerUpdateHandler(new FPSLogger() { 
  37.             protectedvoid onHandleAverageDurationElapsed(finalfloat pFPS) { 
  38.                 super.onHandleAverageDurationElapsed(pFPS); 
  39.                 // 傳遞內容到ChangeableText 
  40.                 text.setText("" + pFPS); 
  41.             } 
  42.         }); 
  43.         // 將ChangeableText注入場景 
  44.         scene.attachChild(text); 
  45.         // 構建場景,可容納圖層數爲1 
  46.         return scene; 
  47.     } 

 


另外,事實上BaseGameActivity並不是AndEngine提供的惟一Activity,其UI包下尚有以SplashScene場景做爲特效啓動的BaseSplashActivity類,以及經過重載getLayoutID與getRenderSurfaceViewID這兩個抽象函數,調用指定佈局與視圖的LayoutGameActivity類。不過除了上述特色,它們與BaseGameActivity就再無區別了。 2、如何使用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函數就能夠調用,實現代碼以下所示:ide

  1. publicclass Main extends BaseGameActivity { 
  2.     privatestaticfinalint CAMERA_WIDTH = 320
  3.     privatestaticfinalint CAMERA_HEIGHT = 480
  4.     private Camera andCamera; 
  5.     publicvoid onLoadComplete() { 
  6.     } 
  7.     public Engine onLoadEngine() { 
  8.         // 構建攝像機 
  9.         this.andCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
  10.         // 構建Engine,全屏顯示,手機方向爲豎屏,按比例拉伸 
  11.         returnnew Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT, 
  12.                 new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), 
  13.                 this.andCamera)); 
  14.     } 
  15.     publicvoid onLoadResources() { 
  16.         // 運行一個異步加載,設定內部ProgressDialog標題爲資源索引test1對應的字符,內容爲test2對應的資源 
  17.         this.doAsync(R.string.test1, R.string.test2, new Callable<Void>() { 
  18.             // 但願AndEngine異步加載的數據 
  19.             public Void call() throws Exception { 
  20.                 for (int i = 0; i < Integer.MAX_VALUE; i++) { 
  21.                 } 
  22.                 returnnull
  23.             } 
  24.             // 當加載完成後回調,可在此進行一些加載完畢的過後處理 
  25.         }, new org.anddev.andengine.util.Callback<Void>() { 
  26.             publicvoid onCallback(final Void pCallbackValue) { 
  27.                 Log.d("Callback", "over"); 
  28.             } 
  29.         }); 
  30.     } 
  31.     public Scene onLoadScene() { 
  32.         // 構建場景,容許的最大Layer數量爲1 
  33.         final Scene scene = new Scene(1); 
  34.         return scene; 
  35.     } 

 

 

2.3 AndEngine中的精靈調用:
精靈類,是一個你們耳熟能詳,而且任何遊戲引擎沒法迴避的關鍵性組件之一,它經常被用來表示一個遊戲中角色或者特定畫面要素。如此重要的存在,AndEngine固然也不能缺乏,其精靈類的基本使用方法以下所示:wordpress

  1. publicclass Main extends BaseGameActivity { 
  2.     privatestaticfinalint CAMERA_WIDTH = 320
  3.     privatestaticfinalint CAMERA_HEIGHT = 480
  4.     private Camera andCamera; 
  5.     private TextureRegion myTextureRegion; 
  6.     publicvoid onLoadComplete() { 
  7.     } 
  8.     public Engine onLoadEngine() { 
  9.         // 構建攝像機 
  10.         this.andCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
  11.         // 構建Engine,全屏顯示,手機方向爲豎屏,按比例拉伸 
  12.         returnnew Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT, 
  13.                 new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), 
  14.                 this.andCamera)); 
  15.     } 
  16.     publicvoid onLoadResources() { 
  17.         //構建紋理 
  18.         Texture myTexture = new Texture(64, 64, TextureOptions.DEFAULT); 
  19.         //加載指定路徑紋理到myTextureRegion 
  20.         this.myTextureRegion = TextureRegionFactory.createFromAsset(myTexture, 
  21.                 this, "Ball.png", 0, 0); 
  22.         //載入紋理到TextureManager 
  23.         this.getEngine().getTextureManager().loadTextures(myTexture); 
  24.     } 
  25.     public Scene onLoadScene() { 
  26.         // 構建場景,容許的最大Layer數量爲1 
  27.         final Scene scene = new Scene(1); 
  28.         // 以myTextureRegion構建Sprite(TextureRegion內部有Texture的引用,AndEngine在構建Sprite時一塊兒加載了),到座標55,55 
  29.         Sprite sprite = new Sprite(55, 55, myTextureRegion); 
  30.         // 添加精靈 
  31.         scene.attachChild(sprite); 
  32.         return scene; 
  33.     } 

2.3 AndEngine的精靈動畫: 在絕大多數的遊戲開發中,僅僅有精靈類存在是並不足夠的,咱們每每還須要讓精靈做出絢麗的效果以吸引用戶眼球,而這些效果在AndEngine中,統一經過它所提供的各個Modifier類進行實現。具體調用代碼以下所示:函數

  1. publicclass Main extends BaseGameActivity { 
  2.     privatestaticfinalint CAMERA_WIDTH = 320
  3.     privatestaticfinalint CAMERA_HEIGHT = 480
  4.     private Camera andCamera; 
  5.     private TextureRegion myTextureRegion; 
  6.     publicvoid onLoadComplete() { 
  7.     } 
  8.     public Engine onLoadEngine() { 
  9.         // 構建攝像機 
  10.         this.andCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
  11.         // 構建Engine,全屏顯示,手機方向爲豎屏,按比例拉伸 
  12.         returnnew Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT, 
  13.                 new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), 
  14.                 this.andCamera)); 
  15.     } 
  16.     publicvoid onLoadResources() { 
  17.         // 構建紋理 
  18.         Texture myTexture = new Texture(64, 64, TextureOptions.DEFAULT); 
  19.         // 加載指定路徑紋理到myTextureRegion 
  20.         this.myTextureRegion = TextureRegionFactory.createFromAsset(myTexture, 
  21.                 this, "Ball.png", 0, 0); 
  22.         // 載入紋理到TextureManager 
  23.         this.getEngine().getTextureManager().loadTextures(myTexture); 
  24.     } 
  25.     public Scene onLoadScene() { 
  26.         // 在Log中顯示FPS數 
  27.         getEngine().registerUpdateHandler(new FPSLogger()); 
  28.         // 構建場景,容許的最大Layer數量爲1 
  29.         final Scene scene = new Scene(1); 
  30.         // 得到相對中心座標 
  31.         finalint centerX = (CAMERA_WIDTH - this.myTextureRegion.getWidth()) / 2
  32.         finalint centerY = (CAMERA_HEIGHT - this.myTextureRegion.getHeight()) / 2
  33.         // 以myTextureRegion構建Sprite(TextureRegion內部有Texture的引用,AndEngine在構建Sprite時一塊兒加載了),到屏幕中心 
  34.         final Sprite sprite = new Sprite(centerX, centerY, this.myTextureRegion); 
  35.         // 添加精靈 
  36.         scene.attachChild(sprite); 
  37.         // 製做一組動做序列,首先10秒內不斷順時針旋轉360度,然後10秒內不斷逆時針旋轉360度 
  38.         SequenceEntityModifier ballAction = new SequenceEntityModifier( 
  39.                 new RotationModifier(10, 0, 360), new RotationModifier(10, 360
  40.                         0)); 
  41.         // 註冊動做序列到精靈 
  42.         sprite.registerEntityModifier(ballAction); 
  43.         return scene; 
  44.     } 

 

 

3、AndEngine的經常使用模塊介紹:
因爲AndEngine包的下屬類較多,而且細分也較爲龐雜,在一篇文章中一次性介紹完畢幾乎不可能實現。因此下面開始,小弟會就AndEngine的一些核心模塊進行簡明扼要的說明,但若是前文作過說明的下文會一筆帶過。
PS:事實上,就連AndEngine做者也不可能作到詳細介紹,畢竟到目前爲止AndEngine壓根沒有出過文檔。(連andengineexamples下的示例代碼都已經和最新的AndEngine源碼脫離了……)
一、關於Engine:
Engine是AndEngine的核心所在,它對AndEngine引擎中Camera、Scene等重要組件進行了統一管理,但必須和BaseGameActivity合做使用,利用EngineOptions類能夠對其進行必要的參數配置。 佈局

二、關於BaseGameActivity:
若是您想正常使用AndEngine,那麼當前Activity就必須繼承自BaseGameActivity或其子類,不然你連初始化Engine也作不到。雖然它還有父類BaseActivity,但BaseActivity只提供了一些異步加載方法而無關AndEngine的主體實現。所以,BaseGameActivity就是實際上的AndEngine最基礎用類無疑。 三、關於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實例才起做用。 四、關於Camera:
該類即咱們常說的遊戲攝像機,在AndEngine的Camera有兩種做用,一是用以調節屏幕的顯示區域,二是利用HUD類實際繪製遊戲屏幕於手機之上。 五、關於Scene:
場景容器,做用相似於LGame中的Screen,可以將某一特定場景做爲遊戲模塊進行調用,咱們能夠利用它來切換當前遊戲的畫面與觸摸屏監聽,切換方法是利用Engine.setScene。 六、關於Entity:
Entity是IEntity接口的具體實現,也是AndEngine中不管Scene、Layer、Sprite(這個繼承關係比較遠,中間隔了BaseRectangle、RectangularShape、GLShape、Shape等上級類,不過追溯源頭始終繼承自Entity)的統一父類,經過Entity咱們可讓AndEngine中場景,或場景中某精靈實現統一效果的縮放、旋轉、變色等操做。 七、關於Texture:
Texture是AndEngine所提供的紋理用類,但Texture自己(在AndEngine中)並無提供加載圖片的方法,必須經過TextureRegionFactory類(更準確的說,依賴它內部封裝的TextureRegion、BuildableTexture等類)與之合做才能夠加載紋理。除此以外,AndEngine要求所加載紋理(圖片)大小必須爲2的整數次冪。 八、關於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,兩者沒法分離,缺一不可。 九、關於TextureOptions
在AndEngine中,TextureRegionFactory類決定紋理的加載路徑,Texture類做爲承載紋理的實體對象,而TextureOptions類決定了紋理的渲染方式。
也便是說,OpenGLES將以何種方式顯示紋理圖像,都由TextureOptions類所決定。在當前最新版本的AndEngine中,默認提供了:post

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

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

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

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

五、NEAREST_PREMULTIPLYALPHA(全部[PREMULTIPLYALPHA]結尾的TextureOptions與其它同名類差異僅在因而否支持根據Alpha值設置透明紋理,如下同)

六、BILINEAR_PREMULTIPLYALPHA

七、REPEATING_PREMULTIPLYALPHA

八、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模式對硬件要求較高,若是以此模式將較大紋理放到低端機上渲染,速度極可能沒法保證。可是,假如您的遊戲只針對高端機用戶便無需介懷了。

相關文章
相關標籤/搜索