android遊戲開發架構libgdx的使用(二)–圖形繪製

來源:互聯網
上載者:User

本文使用的libgdx是0.92版本,和現在的最新版可能有一些不一樣的地方。全文內容僅供參考。

首先瞭解一下何為texture。按照英文解釋來理解:一個圖片從原始格式解碼並上傳到GPU就被稱為紋理。(說實話我不是很清楚這個的定義哈,求指點)

為了繪製texture,常常使用幾何來描述,通過幾何對應的頂點來描述紋理。比如要描述一個矩形,可以通過描述每個頂點來描述矩形。

 

要繪圖時,首先要綁定紋理,然後傳遞一個幾何描述給OpenGL進行繪製。而繪圖的大小和位置由幾何描述和OpenGL的viewport的設定共同決定。

當然大部分的遊戲都會讓viewport的大小和螢幕一致。這就意味使用像素更容易讓紋理繪製在合適的大小和位置。

 

繪製一個矩形的幾何圖形是非常常見的,同樣讓同一個紋理在不同位置以不同大小位置也是非常常見的,比如漫天的彈幕。但是每次都傳遞每個形狀到GPU進行繪製的效率是較低的。

所以許多相同紋理可以一起描述並一起送入GPU,這就是SpriteBatch類所要做的。

 

SpriteBatch被賦予了紋理和座標以便每個圖形的繪製。它(SpriteBatch)彙集了很多圖形而沒有直接提交給GPU。如果它被賦予的紋理不同於原有的,它將保持原有的圖形,並擷取新的圖形。

上一篇文章其實就使用了SpriteBatch,但是沒有繪製圖形,現在我們來試試繪製。

先找張圖片來,解析度必須是2的次方(如32*32,256*512)。

我截取了我的案頭的一部分,解析度調成512*512。

拷貝到assets檔案夾中,圖片檔案最好都是放在這個裡面哈。

然後修改代碼

private Texture texture;
執行個體化texture,texture=new Texture(Gdx.files.internal("image1.jpg"));
然後來說一下為什麼要將圖片放在assets檔案夾中。
Gdx.files是libgdx的檔案模組,主要提供以下5大功能。
  • 讀取檔案
  • 寫檔案
  • 複製檔案
  • 移動檔案
  • 列出檔案和目錄

    而擷取操作檔案的FileHandle有4種方法。

    1.Classpath
    路徑相對於classpath,檔案通常為唯讀。

    2.Internal
    內部檔案路徑相對於程式根目錄或者android 的assets檔案夾。

    3.External
    外部檔案路徑是相對於SD卡根目錄

    4.Absolute

    assets檔案夾本身就是儲存資源的檔案夾,而且相比resource檔案夾,它其中的資源不會產生R中的ID,用來放圖片很是合適。

    所以用Gdx.files.internal("image1.jpg")擷取圖片,然後調用batch.draw(texture,20,10);繪製圖形,20,10是座標,笛卡爾座標,以左下角為原點。

    完整代碼:

    package com.cnblogs.htynkn;import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch;public class FirstGame implements ApplicationListener {     //繪圖用的SpriteBatch     private SpriteBatch batch;     //紋理     private Texture texture;     @Override     public void create() {         batch = new SpriteBatch(); //執行個體化         texture=new Texture(Gdx.files.internal("image1.jpg"));     }    @Override     public void dispose() {         // TODO Auto-generated method stub    }    @Override     public void pause() {         // TODO Auto-generated method stub    }    @Override     public void render() {         Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏         batch.begin();         batch.draw(texture,20,10);         batch.end();     }    @Override     public void resize(int width, int height) {         // TODO Auto-generated method stub    }    @Override     public void resume() {         // TODO Auto-generated method stub    }}

    效果:

    可以看到圖片不能完整顯示,而實際操作中我們也經常使用圖片的一部分,或者將多個圖片資源集合在一個圖片檔案中。

    而要顯示圖片的一部分就可以使用TextureRegion類了。

    最常用的方法是draw(TextureRegion region, float x, float y, float width, float height)

    指定初始點和長寬。

    修改代碼:

    package com.cnblogs.htynkn;import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion;public class FirstGame implements ApplicationListener {     //繪圖用的SpriteBatch     private SpriteBatch batch;     //紋理     private Texture texture;     //地區     private TextureRegion region;     @Override     public void create() {         batch = new SpriteBatch(); //執行個體化         texture=new Texture(Gdx.files.internal("image1.jpg"));         region=new TextureRegion(texture, 30,80, 200,200);     }    @Override     public void dispose() {         // TODO Auto-generated method stub    }    @Override     public void pause() {         // TODO Auto-generated method stub    }    @Override     public void render() {         Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏         batch.begin();         batch.draw(region,0,0);         batch.end();     }    @Override     public void resize(int width, int height) {         // TODO Auto-generated method stub    }    @Override     public void resume() {         // TODO Auto-generated method stub    }} 

      

    效果:

    也許你覺得TextureRegion不夠強大,沒有關係,還可以使用Sprite。

    Sprite不光包含TextureRegion的功能,還可以指定位置和顏色。

    關鍵代碼:

    sprite=new Sprite(texture, 80, 80, 400, 300); sprite.setPosition(10, 10); //位置 sprite.setRotation(15);

    稍微想一下前幾個例子就可以發現,其實Sprite的功能就是以上的集合。但是Sprite更方便,它用一個對象描述了一切。

    完整代碼如下:

    package com.cnblogs.htynkn;import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch;public class FirstGame implements ApplicationListener {     //繪圖用的SpriteBatch     private SpriteBatch batch;     //紋理     private Texture texture;     //精靈     private Sprite sprite;     @Override     public void create() {         batch = new SpriteBatch(); //執行個體化         texture=new Texture(Gdx.files.internal("image1.jpg"));         sprite=new Sprite(texture, 80, 80, 400, 300);         sprite.setPosition(10, 10); //位置         sprite.setRotation(15); //旋轉     }    @Override     public void dispose() {         // TODO Auto-generated method stub    }    @Override     public void pause() {         // TODO Auto-generated method stub    }    @Override     public void render() {         Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏         batch.begin();         sprite.draw(batch);         batch.end();     }    @Override     public void resize(int width, int height) {         // TODO Auto-generated method stub    }    @Override     public void resume() {         // TODO Auto-generated method stub    }} 

    效果:

    同時可以通過sprite的setColor方法為圖形著色。

    setColor(float r, float g, float b, float a)

    其中顏色的表述都是介於0,1之間的數。

    繪製的內容基本就這麼多,下一篇是關於關於2D情境的。

    寫在最後:

    1.關於混合問題,預設是開啟混合了的。這意味著圖形繪製完成時半透明的部分已經被混合了。當混合被關閉是任何已經在情境上的東西都會被紋理代替,這適合繪製大背景。

    batch.disableBlending();backgroundSprite.draw(batch);batch.enableBlending();
    2.關於效能最佳化

    SpriteBatch 有個建構函式可以指定最大緩衝數目。如果數值過低會造成額外的GPU調用;過高的話將佔用過多的記憶體。

    在SpriteBatch有個欄位為maxSpritesInBatch,可以先設定一個很高的緩衝數目,然後觀察maxSpritesInBatch的值以確定合適的緩衝值。

    還有一個欄位renderCalls,在end被調用時,它的值表示在begin和end之間幾何聲明被送入GPU的次數。

    還有一個建構函式可以指定緩衝大小和數量,合理的設定可以極大地提供效能。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.