Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制

时间:2024-04-11 11:35:22

本文使用的libgdx是0.98版本,可能和最新版有一些不同地方。全文内容仅供参考。

 
Libgdx虽然是由美国人Mario Zechner(即BadlogicGames)写的开源引擎,由于Libgdx底层是用OpenGL实现的,所以Libgdx是可以支持中文的。但是libgdx中的汉字都是通过贴图的方式显示的。通过BitmapFontSpriteBatch组合来完成文字的绘制,构造BitmapFont时需要一个描述文字构成的fnt文件,和一个提供文字图片的png文件。因此显示中文,归根结底就是读取一个包含中文信息的.fnt文件和相应的.png文件并展示出来的问题。
 
Libgdx游戏引擎(1群):187378034
Libgdx游戏引擎(2群):148848483
Libgdx游戏引擎(3群): 79168470
 
1.Hiero工具的使用
 
如何得到一个“.fnt”和“相应的.png”的文件呢?作者(Mario Zechner)给我们提供了一个非常好用的s工具:Hiero
Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制
 
下载结束后,双击hiero.jar文件开,打开后,我们可以看到Hiero的一些基本功能,相比来说作者做的还是比较简单易懂的。从界面上知道,它包括很多选项,像可以制作特效、改变背景颜色、设置内间距等等,右侧还有作提供给我们的做好的字体效果点击 Add按钮就可以添加。这里土豆做了一张图片,将它的功能简单的标注了下,这就不详细介绍了.
如下图:
 
Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制
 
编辑好你要写的文字后,File—Save as BMFont Files,生成两个文件(如下图),将它们拷贝到asserts文件夹。
Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制

注意如果你要使用的字,只能是.fnt文件里面存在的文字,否则是显示不出来的.比如,我文件里面有“奋斗小土豆”几个字,那么我可以在程序输出的时候写出这几个字,但是我要是想输出“杜甫很忙”这4个字,因为编辑文件里面没有这几个字,那么就显示不出来。

PS 为什么要加载fnt文件?.fnt文件是做什么用的呢?
由于Libgdx底层是用OpenGL实现的,所以Libgdx是可以支持中文的。但是libgdx中的汉字都是通过贴图的方式显示的,我们用记事本打开 Potato.fnt文件,里面显示的部分内容(如下图),同时对照.png图片来参考下,可以发现可以很明显看出,libgdx的文字绘制是根据fnt文件获取对应文字的在png中的坐标位置,然后截取图片的相应部分进行绘制。
2.BitmapFont 类
API介绍:呈现位图字体,包括2个文件:一个图像文件textureregion,包含符号在anglecode bmfont文本格式,描述了每个字形是图像文件。文本是使用一个SpriteBatch画。
功能用途:渲染静态文本,同时可以设置文字颜色,文字大小等。
使用方法:我们可以手动设置文字大小和颜色以及旋转,这里使用函数设置是可以的,在Hiero里面也是可以设置的,同学们可以自行选择哪种方法设置new()里面的false是管理翻转的,如下图:
Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制

下面我们简单的介绍下用代码来实现一下,我们就画出“奋斗小土豆丶”这几个字,我们依旧使用之前的HelloWorld项目,修改代码如下:
package com.potato;
 
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
 
public class HelloWorld implements ApplicationListener {
 
public SpriteBatch batch;
BitmapFont font;
@Override
public void create() {
font = new BitmapFont(Gdx.files.internal("data/Potato.fnt"), Gdx.files.internal("data/Potato.png"), false);
font.setColor(0.5f,0.4f,0.6f,1);//设置颜色
font.setScale(1.0f);//字体比例大小
batch = new SpriteBatch();
}
 
@Override
public void dispose() {
 
}
 
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "奋斗小土豆丶",200,160);
batch.end();
}
 
@Override
public void resize(int width, int height) {
}
 
@Override
public void pause() {
}
 
@Override
public void resume() {
}
}
输出效果图:
Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制
 
(1)文字单行显示
文字单行显示很简单,font.draw()就可以,下面我介绍下font中持有的draw方法,解释下里面的参数是做什么用的。
方法:draw(SpriteBatch spriteBatch,,java.lang.CharSequence str, float x, float y, int start, int end) 
 
第一个参数是SpriteBatch类的对象,这里不多解释了。
第二个参数是字符串,也你要输出的中文字符,例如刚才我们写的“奋斗小土豆丶”这个就是第二个对应的字符。
第三个和第四个参数(即float x, float y),它们是绘制字中文字符的起点坐标,遵循笛卡尔坐标系
第五个参数和第六个参数,是设置从第几个字符开始输出,到第几个字符结束,比如我们要输出“小土豆”这3个字就将start改为2,end改为5,这里面第一个字符默认编码是0而不是1,请牢记
下面给大家用代码演示,代码如下:
package com.potato;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
 
public class HelloWorld implements ApplicationListener {
 
public SpriteBatch batch;
BitmapFont font;
@Override
public void create() {
font = new BitmapFont(Gdx.files.internal("data/Potato.fnt"), Gdx.files.internal("data/Potato.png"), false);
// font.setColor(0.5f,0.4f,0.6f,1);//设置颜色
//
// font.setScale(1.0f);//字体比例大小
batch = new SpriteBatch();
}
 
@Override
public void dispose() {
 
}
 
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "奋斗小土豆丶",200,160,2,5);
batch.end();
}
 
@Override
public void resize(int width, int height) {
}
 
@Override
public void pause() {
}
 
@Override
public void resume() {
}
}
 
效果图:
Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制

(2)文字换行显示
文字进入可以写出了,但是有的同学的文字比较多,一行根本写不完。BitmapFont类中有一个drawMultiLine()方法帮我们解决了多行显示的问题,我们只需要在中文字符中加入换行符(\n)即可,而且它还是自动识别的,非常简单。
 
方法:drawMultiLine(SpriteBatch spriteBatch, java.lang.CharSequence str, float x, float y, float alignmentWidth,BitmapFont.HAlignment alignment) 
 
这里面前几个参数我都详细介绍了,坐后面2个 “float alignmentWidth,BitmapFont.HAlignment alignment” 土豆也不知道是什么参数,希望大神能指点一下。
 
下面给大家用代码演示,代码如下:
 
package com.potato;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
 
public class HelloWorld implements ApplicationListener {
 
public SpriteBatch batch;
BitmapFont font;
@Override
public void create() {
font = new BitmapFont(Gdx.files.internal("data/Potato.fnt"), Gdx.files.internal("data/Potato.png"), false);
// font.setColor(0.5f,0.4f,0.6f,1);//设置颜色
//
// font.setScale(1.0f);//字体比例大小
batch = new SpriteBatch();
}
 
@Override
public void dispose() {
 
}
 
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "------奋斗小土豆丶",200,160);
font.drawMultiLine(batch, "爱情来得快,去的也快,\n只有猪肉卷是永恒的", Gdx.graphics.getWidth()/5, 0.8f*Gdx.graphics.getHeight());
batch.end();
}
 
@Override
public void resize(int width, int height) {
}
 
@Override
public void pause() {
}
 
@Override
public void resume() {
}
}
 
 
效果图:
Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制Android游戏开发框架Libgdx的使用(三)--中文显示与汉字绘制

 
写在最后,有关于中文显示的基本方法今天就介绍到这里了,下一篇是也是关于libgdx框架中文显示的博文,我会介绍下《TTF字库的使用》。如果大家有什么问题可以加我QQ:316344618,一起讨论下。。PS:今天写的比较仓促,有很多准备不充分的地方,希望大家能多给予指点,帮助修改完善。
                                                                                                                                                                                                                                                                        
 
------------奋斗小土豆丶
                                                                                                                             2013 年 4 月 10 日

转载于:https://www.cnblogs.com/WeYingKG/archive/2013/04/17/3025849.html