天天看點

libgdx遊戲引擎開發筆記(二)主要類的詳解(圖像繪制)

   下面我們來看看libgdx遊戲引擎中一些常用的類

1.Gdx類

    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,其實都在調用同一個靜态變量),總之一句話,要想運作Libgdx必須的使用Gdx!

2.圖形繪制

   2.1.Texture類:

定義:圖檔從原始格式解碼并上傳到GPU就被稱為紋理,其實質可了解為儲存在顯存中的Image。

   Libgdx的紋理可以直接從指定檔案路徑加載,也可以通過它提供的Pixmap類憑空建立(它的Texture(int width, int height, Format format)構造内部直接調用了Pixmap,不是必須在外部生成Pixmap後注入)。這裡說一下前者:

1

<code>Gdx.files.</code><code>internal</code><code>(</code><code>"button.jpg"</code><code>)</code>

   Gdx.files,它是libgdx的檔案子產品,主要提供以下5大功能:讀取檔案,寫入檔案、複制檔案、移動檔案、列出檔案和目錄。其中擷取檔案有許多種辦法:

   1.Classpath:  路徑相對于classpath,檔案通常為隻讀。

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

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

   4.Absolute:assets檔案夾本身就是存儲資源的檔案夾,而且相比resource檔案夾,它其中的資源不會生成R中的ID,用來放圖檔很是合适。

   2.2.SpriteBatch類:

   定義:SpriteBatch用于繪制二維矩形參考紋理(區域)。SpriteBatch類可用于批量繪圖指令和優化處理的GPU。

   Libgdx所提供的紋理渲染器,本質上是OpenGL的簡易封裝體,每次調用SpriteBatch類都必須以begin函數開頭,以end函數結尾,中間調用draw()進行繪制。SpriteBatch可以把許多相同紋理一起描述并一起送入GPU,同時賦予紋理和坐标以便每個圖形的繪制。

   2.3TextureRegion類

定義:定義了一個矩形區域的紋理。使用的坐标系統與x軸指向右,Y軸向下在左上角的起源。

   将多個圖檔資源集合在一個圖檔檔案夾中,而要顯示圖檔的一部分就要使用該類,TextureRegion一般都是截取texture,然後定義截取起點(x,y)随後再定義寬高(width,height),如果寬高是正數,那麼就是沿x,y正方向截取,如果是負就是沿x,y負方向截取,方向隻和寬高的正負有關。

<code>textureRegion = </code><code>new</code> <code>TextureRegion(texture,</code><code>0</code><code>,</code><code>0</code><code>,</code><code>48</code><code>,</code><code>48</code><code>);</code>

<a target="_blank" href="http://blog.51cto.com/attachment/201307/094703726.png"></a>

<code>textureRegion = </code><code>new</code> <code>TextureRegion(texture,</code><code>48</code><code>,</code><code>48</code><code>,-</code><code>48</code><code>,-</code><code>48</code><code>);</code>

<a target="_blank" href="http://blog.51cto.com/attachment/201307/094844609.png"></a>

   2.4.Sprite類

   定義:持有的幾何形狀,顔色,和紋理資訊使用加載繪制2D精靈。一個精靈有定位和給定的寬度和高度尺寸。的位置是相對于通過加載指定的坐标系的原點。begin()和各自的矩陣。一個精靈總是矩形和它的位置(x,y)是位于左下角的矩形。一個精靈也有一個起點,旋轉和縮放的執行(即,産地不通過旋轉和縮放修改),起點是相對于左下角的精靈,它的位置。

   它是TextureRegion的加強版,還能指定位置,顔色,旋轉等等。

鑒于以上的總結,我們來看一個顯示圖檔的例子(部分裁剪)

2

3

4

5

6

7

8

9

10

11

12

<code>package</code> <code>com.zhf.android_libgdx;</code>

<code>import</code> <code>com.badlogic.gdx.backends.android.AndroidApplication;</code>

<code>import</code> <code>android.os.Bundle;</code>

<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>AndroidApplication {</code>

<code>    </code><code>@Override</code>

<code>    </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>

<code>        </code><code>super</code><code>.onCreate(savedInstanceState);</code>

<code>        </code><code>//在此啟動遊戲,FirstGame實作了ApplicationListener的類</code>

<code>        </code><code>initialize(</code><code>new</code> <code>FirstGame(), </code><code>false</code><code>);  </code><code>//specifying the configuration for the GLSurfaceView.</code>

<code>        </code><code>//第二個參數如果設為true,則在opengl 2.0可用的情況下會使用opengl 2.0。</code>

<code>    </code><code>}</code>

<code>}</code>

FirstGame類

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

<code>import</code> <code>com.badlogic.gdx.ApplicationListener;</code>

<code>import</code> <code>com.badlogic.gdx.Gdx;</code>

<code>import</code> <code>com.badlogic.gdx.graphics.GL10;</code>

<code>import</code> <code>com.badlogic.gdx.graphics.Texture;</code>

<code>import</code> <code>com.badlogic.gdx.graphics.g2d.SpriteBatch;</code>

<code>import</code> <code>com.badlogic.gdx.graphics.g2d.TextureRegion;</code>

<code>                                                                                                                                                                                                                                                     </code> 

<code>public</code> <code>class</code> <code>FirstGame </code><code>implements</code> <code>ApplicationListener {</code>

<code>    </code><code>//繪圖用的SpriteBatch</code>

<code>    </code><code>private</code> <code>SpriteBatch batch;</code>

<code>    </code><code>//紋理</code>

<code>    </code><code>private</code> <code>Texture texture;</code>

<code>    </code><code>//區域</code>

<code>    </code><code>private</code> <code>TextureRegion region;</code>

<code>    </code><code>public</code> <code>void</code> <code>create() {</code>

<code>        </code><code>batch = </code><code>new</code> <code>SpriteBatch(); </code><code>//執行個體化</code>

<code>        </code><code>texture=</code><code>new</code> <code>Texture(Gdx.files.</code><code>internal</code><code>(</code><code>"image1.jpg"</code><code>));</code>

<code>        </code><code>region=</code><code>new</code> <code>TextureRegion(texture, </code><code>30</code><code>,</code><code>80</code><code>, </code><code>200</code><code>,</code><code>200</code><code>);</code>

<code>    </code><code>public</code> <code>void</code> <code>dispose() {</code>

<code>        </code><code>batch.dispose();</code>

<code>        </code><code>texture.dispose();</code>

<code>        </code><code>region.dispose();</code>

<code>    </code><code>public</code> <code>void</code> <code>pause() {</code>

<code>        </code><code>// TODO Auto-generated method stub</code>

<code>    </code><code>public</code> <code>void</code> <code>render() {</code>

<code>        </code><code>Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); </code><code>//清屏</code>

<code>        </code><code>batch.begin();</code>

<code>        </code><code>batch.draw(region,</code><code>0</code><code>,</code><code>0</code><code>);</code>

<code>        </code><code>batch.end();</code>

<code>    </code><code>public</code> <code>void</code> <code>resize(</code><code>int</code> <code>width, </code><code>int</code> <code>height) {</code>

<code>    </code><code>public</code> <code>void</code> <code>resume() {</code>

效果圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201307/100636926.png"></a>

使用Sprite類:

聲明

<code>//Sprite不光包含TextureRegion的功能,還可以指定位置和顔色</code>

<code>privateSprite sprite;</code>

執行個體化

<code>//精靈類</code>

<code>sprite=newSprite(texture, </code><code>80</code><code>, </code><code>80</code><code>, </code><code>400</code><code>, </code><code>300</code><code>);</code>

<code>sprite.setPosition(</code><code>10</code><code>, </code><code>10</code><code>); </code><code>//位置</code>

<code>sprite.setRotation(</code><code>20</code><code>); </code><code>//旋轉</code>

<code>sprite.setColor(</code><code>0</code><code>.5f, </code><code>0</code><code>.0f, </code><code>0</code><code>.0f,</code><code>0</code><code>.5f); </code><code>//為圖形着色死奧用</code>

調用

<code>sprite.draw(batch); </code><code>//精靈類繪畫</code>

<a target="_blank" href="http://blog.51cto.com/attachment/201307/102812466.png"></a>

   對了,這裡還有很重要的一點哦!

   Android上畫圖可以使用OpenGL ES,分兩個不相容的版本:OpenGL ES 1.x,和 OpenGL ES 2.0。

它們之間的一個重要差別就是:OpenGL ES 1.x的圖檔大小必須是2的整數次幂,而OpenGL ES 2.0則無此要求。

而libgdx在早期使用OpenGL es1.x 的版本是以隻支援2的整數次幂的圖像,并一直沿用至今,新版本(0.9.8)中允許開發者使用OpenGL ES 2.0,這樣使用OpenGL ES 2.0就可以不用管圖檔分辨率的問題了。android系統對opengl es的支援情況: OpenGL ES 1.0------------&gt;andoid 1.0-2.1(api 7)

OpenGL ES 2.0------------&gt;android 2.2(api 8)以上

   恩,暫時就這麼多,下次繼續總結吧!

參考部落格:http://www.apkbus.com/Android-159-1.html

     本文轉自zhf651555765 51CTO部落格,原文連結:http://blog.51cto.com/smallwoniu/1255140,如需轉載請自行聯系原作者

繼續閱讀