列出檔案和目錄而擷取操作檔案的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的次數。
還有一個建構函式可以指定緩衝大小和數量,合理的設定可以極大地提供效能。