zoukankan      html  css  js  c++  java
  • 【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)

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

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

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

    一、FreeType的使用

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

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

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

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

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

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

     
    答:一般来说.so文件就是常说的动态链接库, 是C或C++编译出来的,在可执行文件装载或运行时,由Android操作系
    统的程序来加载库。作为加载过程的一部分它负责解析外部引用(比如库)。在不同的系统上,可执行文件包含一个叫做import   directory的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序所需要的库,然后将其加载到内存中,之后根据加载库后确定的库的地址更新可执行程序,更新后调用库中的函数或引用库中的数据。这就是.so文件的原理作用。
     
     
     
    二、FreeTypeFontGenerator和FreeTypeBitmapFontData
     
     
    1、FreeTypeFontGenerator用途
     
       负责保存和解析“.ttf”格式文件,一般都配合 FreeTypeBitmapFontData 来使用。如下图:
     
    注意: 这里要特别注意一下,如果是你下载的是“中文名.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希望大家注意。
     
     
    三、实现效果图
     
     
    四、详细代码编写
     
    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: 
     
    晚风把荣华吹散,
    名利是如此浅薄。",
    				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进程的优先级说明
    Android的有序广播和无序广播(解决安卓8.0版本之后有序广播的接收问题)
    Android开发中常用Dialog(普通弹窗&时间选择器&日历选择器)
    Android的显示意图和隐式意图总结
    Android的启动模式
    怎么评论一段php语言文本单词one-hot编码的健壮性
    python 基础知识,解决模板引擎实现原理流程
    SQL----EXISTS 关键字EXISTS基本意思
    omcat启动Publishing failed with multiple errors
    AngularJs directive详解及示例代码
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3161548.html
Copyright © 2011-2022 走看看