天天看点

libgdx游戏引擎开发笔记(四)文字显示BitmapFont

      由于Libgdx底层是用OpenGL实现的,所以Libgdx是可以支持中文的,在libgdx中的汉字都是通过贴图的方式显示,使用BitmapFont和SpriteBatch组合来完成文字的绘制,构造BitmapFont时需要一个描述文字构成的fnt文件,和一个提供文字图片的png文件。因此显示中文,归根结底就是读取一个包含中文信息的.fnt文件和相应的.png文件并展示出来的问题。

1.如何生成这两个文件那?

    下载完成之后,双击打开界面很简单,可以对文字制作特效、改变背景颜色、设置内间距等等,右侧还有作提供给我们的做好的字体效果点击, Add按钮就可以添加,看下图我写的几个文字:

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

   最后,点击File,保存即可,我们可以看到生成了两个文件喽!

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

2.如何使用这两个文件并显示出来那?

  A.将这两个文件放到项目的Asset文件夹下,之后就是代码中的调用了。

   (为什么使用这两个文件那?由于Libgdx底层是用OpenGL实现的,所以Libgdx是可以支持中文的。但是libgdx中的汉字都是通过贴图的方式显示的,我们用EditPlus打开 Potato.fnt文件,可以很明显看出,libgdx的文字绘制是根据fnt文件获取对应文字的在png中的坐标位置,然后截取图片的相应部分进行绘制。)

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

   B.在代码调用显示

1

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>

  主界面:

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

54

55

56

57

<code>import</code> <code>javax.microedition.khronos.opengles.GL10;</code>

<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.g2d.BitmapFont;</code>

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

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

<code>    </code><code>private</code> <code>SpriteBatch batch; </code><code>// 绘图时用的SpriteBatch</code>

<code>    </code><code>private</code> <code>BitmapFont bitmapFont;</code>

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

<code>        </code><code>// 实例化</code>

<code>        </code><code>batch = </code><code>new</code> <code>SpriteBatch();</code>

<code>        </code><code>bitmapFont = </code><code>new</code> <code>BitmapFont(Gdx.files.</code><code>internal</code><code>(</code><code>"photo.fnt"</code><code>), Gdx.files.</code><code>internal</code><code>(</code><code>"photo.png"</code><code>), </code><code>false</code><code>);</code>

<code>        </code><code>bitmapFont.setColor(</code><code>0</code><code>.5f, </code><code>0</code><code>.5f, </code><code>0</code><code>.5f, </code><code>1</code><code>);  </code><code>//设置颜色</code>

<code>        </code><code>bitmapFont.setScale(</code><code>1</code><code>.0f);  </code><code>//设置字体比例大小</code>

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

<code>        </code><code>// STUB</code>

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

<code>        </code><code>Gdx.gl.glClearColor(0f, 0f, 0f, 0f);</code>

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

<code>                                                                                                   </code> 

<code>        </code><code>bitmapFont.draw(batch, </code><code>"狂奔的蜗牛"</code><code>,</code><code>200</code><code>, </code><code>160</code><code>);</code>

<code>        </code><code>//显示特定的字符</code>

<code>//      bitmapFont.draw(batch, "狂奔的蜗牛",100,200,3,5);  //只显示蜗牛</code>

<code>        </code><code>//一行根本写不完,我们只需要在中文字符中加入换行符(\n)即可,而且它还是自动识别的,非常简单。</code>

<code>        </code><code>bitmapFont.drawMultiLine(batch, </code><code>"技术路,\n一步一个脚印!"</code><code>, Gdx.graphics.getWidth() / </code><code>5</code><code>, Gdx.graphics.getHeight()*</code><code>0</code><code>.8f);</code>

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

<code>//显示特定的字符:可以调用public TextBounds draw(SpriteBatch spriteBatch, CharSequence str, float x, float y)</code>

<code>//      第一个参数是SpriteBatch类的对象,这里不多解释了。</code>

<code>//      第二个参数是字符串,也你要输出的中文字符,例如刚才我们写的“狂奔的蜗牛”这个就是第二个对应的字符。</code>

<code>//      第三个和第四个参数(即float x, float y),它们是绘制字中文字符的起点坐标,遵循普通坐标系(左下角起点)。</code>

<code>//      第五个参数和第六个参数,是设置从第几个字符开始输出,到第几个字符结束,比如我们要输出“蜗牛”这2个字就将start改为3,end改为5,这里面第一个字符默认编码是0而不是1,请牢记。</code>

<code>                                                                                               </code> 

<code>//或者public TextBounds drawMultiLine (SpriteBatch spriteBatch, CharSequence str, float x, float y, float alignmentWidth,HAlignment alignment)</code>

<code>//      后两个参数介绍: float alignmentWidth----》是指文字的对齐方式,有LEFT、RIGHT、CENTER几种方式。其中,LEFT的绘制原点是左上角、RIGHT的绘制原点是由上角、CENTER的绘制原点是每行文字中心,向两边展开。</code>

<code>//                 HAlignment alignment----》对LEFT不起作用,只对RIGHT和CENTER起作用,对RIGHT来说就相当于把绘制原点平移alignmentWidth的宽度,对CENTER来说相当于平移绘制原点平移alignmentWidth/2的宽度。</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>pause() {</code>

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

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

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

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

   C.效果图:

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

ok!搞定! 中文显示出来了,到时候大家可以根据自己的情况来制作自己喜欢的文字效果

<b>     本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1256054</b><b>,如需转载请自行联系原作者</b>

继续阅读