【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)

     在上一篇的文章中,我们介绍了Hiero这个非常好用工具的使用,但是LIbgdx的BitmapFont不支持多图,常用汉字

3500个,你总不能用hiero自己做吧,那怎么办呢?这其实微软早就解决这个问题了,它给我们提供了这个TTF字

库,保存汉字字,方便我们使用。

 

 

一、FreeType的使用

 

1、打开解压好的0.9.8版的包,找到里面的extensions文件夹

【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)_第1张图片

 

打开后,再点击进入gdx-freetype文件夹

【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)_第2张图片

 

找到gdx-freetype.jar 文件和armeabi、armeabi-v7a两个文件夹

【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)_第3张图片

 

2、找到之后,将gdx-freetype.jar文件和这两个文件夹下的libgdx-freetype.so文件复制粘贴到核心项目的libs文件夹中,如图所示:

【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)_第4张图片

其他的Jar包和so文件都是之前的项目必须要添加的。

 

3、可能大家会好奇这个libgdx.so是什么文件,为什么有就可以运行.TTF的文件了呢?而没有他就一直报错呢?

 
答:一般来说.so文件就是常说的动态链接库, 是C或C++编译出来的,在可执行文件装载或运行时,由Android操作系
统的程序来加载库。作为加载过程的一部分它负责解析外部引用(比如库)。在不同的系统上,可执行文件包含一个叫做import   directory的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序所需要的库,然后将其加载到内存中,之后根据加载库后确定的库的地址更新可执行程序,更新后调用库中的函数或引用库中的数据。这就是.so文件的原理作用。
 
 
 
二、FreeTypeFontGenerator和FreeTypeBitmapFontData
 
 
1、FreeTypeFontGenerator用途
 
   负责保存和解析“.ttf”格式文件,一般都配合 FreeTypeBitmapFontData 来使用。如下图:
【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)_第5张图片
 
注意: 这里要特别注意一下,如果是你下载的是“中文名.ttf”,使用的时候一定要将文件名改成“英文名.ttf ”,这是
因为 LibGdx读取文件的时候并不支持中文文件名,否则会报错。
 
 
2、FreeTypeBitmapFontData用途
 
负责处理FreeTypeGenerator的数据,和 BitmapFontData 类似 。
 
      在FreeTypeBitmapFontData类有一个重要成员变量DEFAULT_CHARS ,它是作者给我们封装好的基本英文字符打开 FreeTypeBitmapFontData 你会看见如下图的变量赋值,这样即使".TTF"字库中没有英文字符,我们也可以输出英文字符的,因为作者已经给我们打包了。
注意: freetypeGenerator.generateData( int Size, some Chinese String, false)方法中“some Chinese String ”参数不允许有重复字符出现,比如这句话“今天天气晴朗”中“天”字出现了2次,这是不允许的,generateData是不允许同样字符重复加载的,否则会报错 Key with name '****' is already in map希望大家注意。
 
 
三、实现效果图
 
【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)_第6张图片
 
四、详细代码编写
 
package com.example.mylibgdxfont03;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData;

public class MyGame implements ApplicationListener {
	private BitmapFont font;

	private FreeTypeFontGenerator generator;

	private FreeTypeBitmapFontData fontData;

	private SpriteBatch batch;

	@Override
	public void create() {
		generator = new FreeTypeFontGenerator(Gdx.files.internal("testfont.ttf"));

		fontData = generator.generateData(25, generator.DEFAULT_CHARS
				+ "晚风把荣华吹散,名利是如此浅薄。—我一条寻水的鱼!", false);// 这里需要把你要输出的字,全部写上,前提是不能有重复的字。

		font = new BitmapFont(fontData, fontData.getTextureRegion(), false);

		font.setColor(Color.PINK);

		batch = new SpriteBatch();

	}

	@Override
	public void dispose() {
		font.dispose();
		generator.dispose();
		batch.dispose();
	}

	@Override
	public void render() {
		Gdx.gl.glClearColor(1, 1, 1, 1);
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
		batch.begin();
		font.drawMultiLine(
				batch,
				"Hello Everyone: \n \n晚风把荣华吹散,\n名利是如此浅薄。",
				50, 220);
		font.draw(batch, "——我是一条寻水的鱼!", 150, 90);

		batch.end();
	}

	@Override
	public void resize(int width, int height) {
	}

	@Override
	public void pause() {
	}

	@Override
	public void resume() {
	}

}

freetypeGenerator.generateDataint Size, some Chinese String, false);
 
第一个参数 是字号的大小,第二个参数是中文的字符串(即汉字,需要加引号),第三个参数是翻转的状态。
 
 

 

你可能感兴趣的:(android)