轉自:http://blog.csdn.net/cping1982/article/details/6176191#
Libgdx是一款支援2D與3D遊戲開發的遊戲類庫,相容大多數微機平台(標準JavaSE實現,能運行在Mac、Linux、Windows等系統)與Android平台(Android1.5以上即可使用,Android2.1以上可滿功率發揮),
Libgdx由audio、files、graphics、math、physics、scenes、utils這些主要類庫所組成,它們分別對應了 Libgdx中的音頻操作,檔案讀取,2D/3D渲染,Libgdx繪圖相關運算,Box2D封裝,2D/3D遊戲組件(3D部分目前無組件),以及 Libgdx內建工具類。
關於Libgdx中的Gdx類:
單從表面上看,Gdx類佔用空間不足2KB,甚至不具備一行可以被直接執行的函數,並沒什麼重要好說。
然而,真實的Gdx卻是Libgdx類庫啟動並執行核心所在,沒有它你將寸步難行,不單運行Graphics、Input、Files、Audio、 AndroidApplication等Libgdx關鍵區段所必需的執行個體會在Libgdx初始化時注入Gdx中對應的graphics、input、 files、audio、app等靜態變數裡面,就連Libgdx對OpenGL介面(或OpenGLES,視Libgdx運行平台而定,以下統稱 OpenGL)的GL10、GL11、GL20、GLCommon等封裝類也會在Graphics執行個體化時分別注入到gl10、gl11、gl20、gl 這四個同樣位於Gdx的靜態變數當中(在Graphics中也會繼續保留它們的引用,因此無論你執行Gdx.graphics.getGL10還是 Gdx.gl10,其實都在調用同一個靜態變數)。事實上,如果你想不使用Gdx而正常運行Libgdx,那麼除了重構源碼,就再沒有任何辦法可想了。
PS:如果你不清楚自己究竟在什麼環境使用Libgdx,其實也不必強分gl10或gl11,大可以通過Gdx.gl方式調用Libgdx中對於OpenGL介面的預設封裝(執行某些非多版本共有介面時,依舊需要使用對應版本專屬gl)。
想要使用Libgdx,卻不明白Gdx是幹什麼用的,那麼一切就都是空談。
下面開始,我將具體講解Libgdx中的影像處理與遊戲組件部分:
Mesh:
本質上講,Libgdx中所有可見的3D物體首先都是一個Mesh(網格,或者說三維網格形式的進階圖元)。Mesh是如何產生的呢。眾所周知,數學上講 的立體幾何由點、線、面三部分組成,無論多麼複雜的映像也可以分解為無數細小的這三部分,或者說可以由非常基礎的N個這三部分所組合而成;到了3D遊戲開 發時,當我們要構建複雜的3D映像,首先會以一系列有序的vertices(頂點)構成這些具體的點、線、三角要素,即構成繪圖基本圖元 (Primitives),再將基本圖元組合成更完整的進階圖元也就是具體3D對象。因此,如果對Mesh概念進行簡單的理解,其實它就是一個象徵完整圖 像的基本圖元集合體,Libgdx先讓我們把一個個細分的vertices組成基本圖元,再由Mesh類將基本圖元製成更加複雜的進階圖元展示出來。
具體可見Libgdx作者提供的returntomarchfeld樣本,基本效果如下圖所示:
Texture:
Libgdx所提供的遊戲紋理用類,其實質可理解為儲存在顯存中的Image,它以貼圖的方式通過OpenGL將圖片顯示到遊戲介面之上。Libgdx的 紋理可以直接從指定檔案路徑載入,也可以通過它提供的Pixmap類憑空建立(它的Texture(int width, int height, Format format)構造內部直接調用了Pixmap,不是必須在外部產生Pixmap後注入)。另外在載入Texture時,個人建議通過Libgdx提供的 TextureDict.loadTexture函數調用,該方法內部提供了Texture緩衝管理,能夠避免無意義的資源重複載入。此 外,Texture通常會與TextureRegion類配套使用,利用TextureRegion封裝Texture後,再利用SpriteBatch 進行繪製,可以很方便的修訂Texture為我們需要的顯示範圍。還有,Libgdx中Sprite類為TextureRegion子類,因此能夠將 Sprite當作TextureRegion來使用,只是Sprite類比TextureRegion有所擴充。不過Libgdx的 SpriteCache類並沒有繼承Sprite或TextureRegion,所以起不到TextureRegion的作用,只能構建一組靜態貼圖集合 罷了,特此說明。
// Libgdx的Texture與Sprite使用 public class Main extends AndroidApplication { class TestSprite implements ApplicationListener { // 準備繪圖用SpriteBatch SpriteBatch spriteBatch; // 準備遊戲精靈 Sprite sprite; // 準備圖片載入用Texture Texture texture; public void create() { // 構建SpriteBatch spriteBatch = new SpriteBatch(); // 構建Texture,映像寬與高大小都必須為2的整數次冪,否則提示異常 // PS:在Android環境使用Libgdx的internal載入時必須檔案必須位於assets目錄下 texture = new Texture(Gdx.files.internal("mySprite.png")); // 以指定Texture構建Sprite sprite = new Sprite(texture); // 定位到100, 180(Libgdx使用標準笛卡爾座標系,自左下0,0開始) sprite.setPosition(100, 180); } public void render() { // 清屏 Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // 初始化繪圖調用 spriteBatch.begin(); // 繪製精靈到遊戲螢幕 sprite.draw(spriteBatch); // 結束繪圖調用 spriteBatch.end(); } public void dispose() { // 釋放佔用的資源 spriteBatch.dispose(); texture.dispose(); } public void resume() { } public void pause() { } public void resize(int width, int height) { } } public void onCreate(Bundle bundle) { super.onCreate(bundle); // 初始化遊戲螢幕,並設定是否支援GLES 2.0,如果您對向下相容沒什麼需要選擇true即可(2.1以上),否則選擇false。 initialize(new TestSprite(), true); } }
Pixmap:
Libgdx所提供的像素級映像渲染用類,由於Libgdx目前以JNI方式內建映像解碼器,所以我們可以直接將Pixmap理解為一個Android中Bitmap的替代者,兩者間實現細節雖有差別,但具體作用卻大同小異。Pixmap支援Alpha、LuminanceAlpha、RGB565、RGBA4444、RGB888、RGBA8888等五種映像彩色模式,支援png、jpg、bmp等三種影像檔的讀取和載入。一般來說,Pixmap必須和Texture混用才能真正顯示畫面。不過在事實上,Libgdx的Texture裡已經內建有Pixmap了。
Libgdx作者部落格:http://www.badlogicgames.com/
Libgdx項目地址:http://code.google.com/p/libgdx/