libgdx 圖形繪製

來源:互聯網
上載者:User

紋理(texture)

一個圖片從原始格式解碼並上傳到GPU就被稱為紋理。OpenGL要求紋理的高度和寬度都必須是2的n次方大小,只有滿足這個條件紋理圖片才是有效。 一旦擷取了像素值,我們就可以將這些資料傳給OpenGL,讓OpenGL產生一個紋理貼圖

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


要繪圖時,首先要綁定紋理,然後傳遞一個幾何描述(如矩形的四個頂點)給OpenGL進行繪製。而繪圖的大小和位置由幾何描述和OpenGL的viewport的設定共同決定。當然大部分的遊戲都會讓viewport的大小和螢幕一致,這就意味使用像素更容易讓紋理繪製在合適的大小和位置。

繪製一個矩形的幾何圖形是非常常見的,同樣讓同一個紋理在不同位置以不同大小位置也是非常常見的,比如漫天的彈幕。但是每次都傳遞每個形狀到GPU進行繪製的效率是較低的。所以許多相同紋理可以一起描述並一起送入GPU,這就是libgdx SpriteBatch類所要做的。

SpriteBatch被賦予了紋理和座標以便每個圖形的繪製,它彙集了很多圖形而沒有直接提交給GPU。如果它被賦予的紋理不同於原有的,它將保持原有的圖形,並擷取新的圖形。繪製的圖片,解析度必須是2的次方(如32x32, 128x128, 256x512, 512x1024等)

例如: 本樣本採用解析度為 256x256 像素:



圖形繪製

繪製圖形,程式啟動(create)——》讀取圖片(image)——》紋理(texture)綁定——》繪製初始化(sprite.begin)——》繪製(render)——》繪製完處理(sprite.end)——》銷毀(dispose)等步驟。

MainActivity

public class MainActivity extends AndroidApplication {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initialize(new MyGame(), false);}}

MyGame

public class MyGame implements ApplicationListener {private SpriteBatch batch;// 批量繪製private Texture texture;// 紋理@Overridepublic void create() {batch = new SpriteBatch();texture = new Texture(Gdx.files.internal("image03.png"));// 從asset檔案讀取圖片}@Overridepublic void resize(int arg0, int arg1) {}@Overridepublic void render() {Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);// 清屏Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1);// 設定螢幕背景為灰色batch.begin();batch.draw(texture, 10, 10);batch.end();}@Overridepublic void pause() {}@Overridepublic void resume() {}@Overridepublic void dispose() {texture.dispose();batch.dispose();}}

MyGame程式碼片段中,image03.png 圖片需要儲存在 assets 檔案夾內,這是有libgdx檔案模組設計決定的

Gdx.files是libgdx的檔案模組,主要提供以下5大功能:

  • 讀取檔案
  • 寫檔案
  • 複製檔案
  • 移動檔案

而擷取操作檔案的FileHandle有5種方法:

1) Classpath,  路徑相對於classpath,檔案通常為唯讀。注意: classpath與android的某些函數不相容,如 Audio.newSound(FileHandle) 和 Audio.newMusic(FileHandle)

2) Internal,  內部檔案路徑相對於desktop程式根目錄,或者android 的assets檔案夾。assets檔案夾本身就是儲存資源的檔案夾,相比res檔案夾,它其中的資源不會產生R中的ID,用來放圖片很是合適

3) External,  外部檔案路徑相對於desktop程式home目錄,或者android 的SD卡根目錄

4) Absolute, 絕對的檔案系統目錄,跨平台時需要注意對應的絕對路徑

5) Local, 本地目錄,對於android是應用Application自身內部的files目錄,對於desktop是root根目錄

因此,用Gdx.files.internal("image1.jpg")擷取的圖片,需要儲存在assets檔案夾下

讀取圖片後,調用batch.draw(texture,10,10) 繪製圖形,(10,10)是繪製座標,它基於笛卡爾座標,即以左下角為座標原點。


運行結果:

上面樣本說明:

首先,在create()申請texture,從內部assets檔案夾中讀取圖片 image03.png

texture = new Texture(Gdx.files.internal("image03.png"));

然後,在render() 中渲染繪製圖片

batch.draw(texture, 10, 10);// 繪製region

最後,在dispose中銷毀資源

texture.dispose();
batch.dispose();



參考推薦:

android遊戲開發架構libgdx 圖形繪製

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.