成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android游戲引擎libgdx使用教程2:如何繪制圖形

移動開發 Android
SpriteBatch被賦予了紋理和坐標以便每個圖形的繪制。它(SpriteBatch)匯集了很多圖形而沒有直接提交給GPU。如果它被賦予的紋理不同于原有的,它將保持原有的圖形,并獲取新的圖形。上一篇文章其實就使用了SpriteBatch,但是沒有繪制圖形,現在我們來試試繪制。

本文主要為大家講解使用libgdx時圖形的繪制,文章詳細介紹了圖形繪制方法和步驟,大家可以細細研讀。

首先了解一下何為texture。按照英文解釋來理解:一個圖片從原始格式解碼并上傳到GPU就被稱為紋理。

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

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

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

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

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

SpriteBatch被賦予了紋理和坐標以便每個圖形的繪制。它(SpriteBatch)匯集了很多圖形而沒有直接提交給GPU。如果它被賦予的紋理不同于原有的,它將保持原有的圖形,并獲取新的圖形。

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

先找張圖片來,分辨率必須是2的次方(如32*32,256*512)。

我截取了我的桌面的一部分,分辨率調成512*512。

Android游戲引擎libgdx使用教程2:如何繪制圖形

拷貝到assets文件夾中,圖片文件最好都是放在這個里面哈。

Android游戲引擎libgdx使用教程2:如何繪制圖形

然后修改代碼

private Texture texture;

實例化texture,texture=new Texture(Gdx.files.internal("image1.jpg"));然后來說一下為什么要將圖片放在assets文件夾中。 Gdx.files是libgdx的文件模塊,主要提供以下5大功能。

1、讀取文件

2、寫文件

3、復制文件

4、移動文件

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是坐標,笛卡爾座標,以左下角為原點。

完整代碼:

  1. package com.cnblogs.htynkn;     
  2. import com.badlogic.gdx.ApplicationListener;     
  3. import com.badlogic.gdx.Gdx;     
  4. import com.badlogic.gdx.graphics.GL10;     
  5. import com.badlogic.gdx.graphics.Texture;     
  6. import com.badlogic.gdx.graphics.g2d.SpriteBatch;     
  7. public class FirstGame implements ApplicationListener {     
  8. //繪圖用的SpriteBatch     
  9. private SpriteBatch batch;     
  10. //紋理     
  11. private Texture texture;     
  12. @Override     
  13. public void create() {     
  14. batch = new SpriteBatch(); //實例化     
  15. texture=new Texture(Gdx.files.internal("image1.jpg"));     
  16. }     
  17. @Override     
  18. public void dispose() {     
  19. // TODO Auto-generated method stub     
  20. }     
  21. @Override     
  22. public void pause() {     
  23. // TODO Auto-generated method stub     
  24. }     
  25. @Override     
  26. public void render() {     
  27. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏     
  28. batch.begin();     
  29. batch.draw(texture,20,10);     
  30. batch.end();     
  31. }     
  32. @Override     
  33. public void resize(int width, int height) {     
  34. // TODO Auto-generated method stub     
  35. }     
  36. @Override     
  37. public void resume() {     
  38. // TODO Auto-generated method stub     
  39. }     
  40. }   

效果:

Android游戲引擎libgdx使用教程2:如何繪制圖形

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

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

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

指定初始點和長寬。

修改代碼:

  1. package com.cnblogs.htynkn;     
  2. import com.badlogic.gdx.ApplicationListener;     
  3. import com.badlogic.gdx.Gdx;     
  4. import com.badlogic.gdx.graphics.GL10;     
  5. import com.badlogic.gdx.graphics.Texture;     
  6. import com.badlogic.gdx.graphics.g2d.SpriteBatch;     
  7. import com.badlogic.gdx.graphics.g2d.TextureRegion;     
  8. public class FirstGame implements ApplicationListener {     
  9. //繪圖用的SpriteBatch     
  10. private SpriteBatch batch;     
  11. //紋理     
  12. private Texture texture;     
  13. //區域     
  14. private TextureRegion region;     
  15. @Override     
  16. public void create() {     
  17. batch = new SpriteBatch(); //實例化     
  18. texture=new Texture(Gdx.files.internal("image1.jpg"));     
  19. region=new TextureRegion(texture, 30,80200,200);     
  20. }     
  21. @Override     
  22. public void dispose() {     
  23. // TODO Auto-generated method stub     
  24. }     
  25. @Override     
  26. public void pause() {     
  27. // TODO Auto-generated method stub     
  28. }     
  29. @Override     
  30. public void render() {     
  31. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏     
  32. batch.begin();     
  33. batch.draw(region,0,0);     
  34. batch.end();     
  35. }     
  36. @Override     
  37. public void resize(int width, int height) {     
  38. // TODO Auto-generated method stub     
  39. }     
  40. @Override     
  41. public void resume() {     
  42. // TODO Auto-generated method stub     
  43. }     
  44. }   

效果:

Android游戲引擎libgdx使用教程2:如何繪制圖形

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

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

關鍵代碼:

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

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

完整代碼如下:

  1. package com.cnblogs.htynkn;     
  2. import com.badlogic.gdx.ApplicationListener;     
  3. import com.badlogic.gdx.Gdx;     
  4. import com.badlogic.gdx.graphics.GL10;     
  5. import com.badlogic.gdx.graphics.Texture;     
  6. import com.badlogic.gdx.graphics.g2d.Sprite;     
  7. import com.badlogic.gdx.graphics.g2d.SpriteBatch;     
  8. public class FirstGame implements ApplicationListener {     
  9. //繪圖用的SpriteBatch     
  10. private SpriteBatch batch;     
  11. //紋理     
  12. private Texture texture;     
  13. //精靈     
  14. private Sprite sprite;     
  15. @Override     
  16. public void create() {     
  17. batch = new SpriteBatch(); //實例化     
  18. texture=new Texture(Gdx.files.internal("image1.jpg"));     
  19. sprite=new Sprite(texture, 8080400300);     
  20. sprite.setPosition(1010); //位置     
  21. sprite.setRotation(15); //旋轉     
  22. }     
  23. @Override     
  24. public void dispose() {     
  25. // TODO Auto-generated method stub     
  26. }     
  27. @Override     
  28. public void pause() {     
  29. // TODO Auto-generated method stub     
  30. }     
  31. @Override     
  32. public void render() {     
  33. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏     
  34. batch.begin();     
  35. sprite.draw(batch);     
  36. batch.end();     
  37. }     
  38. @Override     
  39. public void resize(int width, int height) {     
  40. // TODO Auto-generated method stub     
  41. }     
  42. @Override     
  43. public void resume() {     
  44. // TODO Auto-generated method stub     
  45. }     
  46. }   

效果:

Android游戲引擎libgdx使用教程2:如何繪制圖形

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

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

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

Android游戲引擎libgdx使用教程2:如何繪制圖形

Android游戲引擎libgdx使用教程2:如何繪制圖形

繪制的內容基本就這么多,下一篇是關于關于2D場景的。

寫在最后

1、關于混合問題,默認是開啟混合了的。這意味著圖形繪制完成時半透明的部分已經被混合了。當混合被關閉是任何已經在場景上的東西都會被紋理代替,這適合繪制大背景。

batch.disableBlending(); 
backgroundSprite.draw(batch);
batch.enableBlending();

2、關于性能優化

SpriteBatch 有個構造函數可以指定最大緩沖數目。如果數值過低會造成額外的GPU調用;過高的話將占用過多的內存。

在SpriteBatch有個字段為maxSpritesInBatch,可以先設置一個很高的緩沖數目,然后觀察maxSpritesInBatch的值以確定合適的緩沖值。

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

還有一個構造函數可以指定緩沖大小和數量,合理的設置可以極大地提供性能。

責任編輯:閆佳明 來源: jizhuomi
相關推薦

2013-12-04 13:30:45

Android游戲引擎libgdx教程

2013-12-04 16:21:02

Android游戲引擎libgdx教程

2013-12-27 13:00:30

Android開發Android應用Context Men

2013-12-06 10:22:42

Android游戲引擎libgdx教程

2013-12-06 10:31:14

Android游戲引擎libgdx教程

2013-12-06 09:59:53

Android游戲引擎libgdx教程

2023-09-07 08:24:35

圖形編輯器開發繪制圖形工具

2013-12-04 17:27:10

Android游戲引擎libgdx教程

2011-06-30 15:09:37

QT 繪制 圖形

2009-10-23 16:43:01

VB.NET繪制圖形

2013-12-06 10:12:49

Android游戲引擎libgdx教程

2013-12-04 16:28:29

Android游戲引擎libgdx教程

2013-12-04 17:14:57

Android游戲引擎libgdx教程

2013-12-06 10:35:28

Android游戲引擎libgdx教程

2023-01-04 11:18:21

Canvas 封裝pixi.js

2011-07-18 11:07:12

iPhone 游戲 引擎

2023-05-16 07:44:03

紋理映射WebGL

2021-09-24 09:45:27

Python神經網絡人工智能

2014-07-15 10:34:14

Android游戲引擎

2011-07-18 10:53:09

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 岛国av免费看 | 日韩视频高清 | 日韩综合网 | 激情视频中文字幕 | 国产 日韩 欧美 制服 另类 | 久久精品99久久 | 国产一区在线免费观看视频 | 国产精品久久精品 | 亚洲高清一区二区三区 | 91精品国产综合久久小仙女图片 | 亚洲理论在线观看电影 | 国产成人精品一区 | 精品欧美一区二区三区久久久 | 日干夜干 | 91在线视频播放 | 中文字幕av第一页 | 久久精品国产99国产精品亚洲 | av一区在线观看 | 免费一级黄色电影 | 99久久精品国产一区二区三区 | 黄色一级免费 | 国产 日韩 欧美 制服 另类 | 亚洲欧美在线视频 | 日韩二区 | 欧美激情在线播放 | 久久久久亚洲精品中文字幕 | 国产精品www | 日韩一区二区三区视频 | 欧美不卡视频 | 一区二区三区四区在线免费观看 | 日韩一区二区免费视频 | 成年人在线观看视频 | 国产午夜精品一区二区三区嫩草 | 久久99精品久久久久久国产越南 | 国产一区二区在线视频 | 成人久久久 | 色婷婷久久久亚洲一区二区三区 | 欧美日韩在线播放 | 久久99精品久久久 | 国产成人久久精品一区二区三区 | 精品av|