android下libgdx 中文字符显示初探

原创 2012年03月29日 15:52:27

最近开始学习libgdx这个开源的游戏框架,使用bitmapfont有很多缺陷,还要自己动手制作,通过查看代码发现libgdx带了freetype,所以应该是能通过使用中文字体来显示中文字符, 下面是具体使用的代码,有不正确的地方还请多多指正。


package com.GreenLemonMobile.achellies;

import android.opengl.GLES10;
import android.os.Bundle;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.AudioDevice;
import com.badlogic.gdx.audio.io.VorbisDecoder;
import com.badlogic.gdx.audio.transform.SoundTouch;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Jpeg;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData;
import com.badlogic.gdx.math.Vector2;

public class HelloWorld extends AndroidApplication implements ApplicationListener {
    
    private FreeTypeFontGenerator freetypeGenerator;
    private Texture backgroundTexture;
    private SpriteBatch spriteBatch;
    private Vector2 textPosition = new Vector2(100, 100);
    private Vector2 textDirection = new Vector2(1, 1);
    private BitmapFont freetypeBitmapFont;
    private BitmapFont defaultBitmapFont;
    private Pixmap jpegPixmap;
    private Texture jpegTexture;
    
    /** the file to playback **/
    private static final String FILE = "data/bg.ogg";
    /** a VorbisDecoder to read PCM data from the ogg file **/
    VorbisDecoder decoder;
    /** an AudioDevice for playing back the PCM data **/
    AudioDevice device;
    /** SoundTouch instance to modify the PCM data **/
    SoundTouch soundTouch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        initialize(this, false);
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void create() {
        freetypeGenerator = new FreeTypeFontGenerator(Gdx.files.internal("data/STXINGKA.TTF"));   
        FreeTypeBitmapFontData fontData = freetypeGenerator.generateData(48, FreeTypeFontGenerator.DEFAULT_CHARS + "开源游戏引擎", false);
        freetypeGenerator.dispose();    
        freetypeBitmapFont = new BitmapFont(fontData, fontData.getTextureRegion(), false);  
        
        backgroundTexture = new Texture(Gdx.files.internal("data/badlogic.jpg"));
        spriteBatch = new SpriteBatch();
        jpegPixmap = Jpeg.read(Gdx.files.internal("data/badlogic.jpg"));
        jpegTexture = new Texture(jpegPixmap);
        defaultBitmapFont = new BitmapFont();
        
        freetypeBitmapFont.setColor(Color.RED);
        defaultBitmapFont.setColor(Color.BLUE);
    }

    @Override
    public void dispose() {
        backgroundTexture.dispose();
        spriteBatch.dispose();
        jpegPixmap.dispose();
        jpegTexture.dispose();
    }

    @Override
    public void pause() {
    }

    @Override
    public void render() {
        int centerX = Gdx.graphics.getWidth() / 2;
        int centerY = Gdx.graphics.getHeight() / 2;
        
        Gdx.gl10.glClear(GLES10.GL_COLOR_BUFFER_BIT);  

        textPosition.x += textDirection.x * Gdx.graphics.getDeltaTime() * 60;
        textPosition.y += textDirection.y * Gdx.graphics.getDeltaTime() * 60;
        
        if (textPosition.x < 0) {
            textPosition.x = 0;
            textDirection.x = -textDirection.x; 
        }
        
        if (textPosition.x > Gdx.graphics.getWidth()) {
            textPosition.x = Gdx.graphics.getWidth();
            textDirection.x = -textDirection.x;
        }
        
        if (textPosition.y < 0) {
            textPosition.y = 0;
            textDirection.y = -textDirection.y; 
        }
        
        if (textPosition.y > Gdx.graphics.getHeight()) {
            textPosition.y = Gdx.graphics.getHeight();
            textDirection.y = -textDirection.y;
        }
        
        spriteBatch.begin();
        spriteBatch.draw(backgroundTexture, centerX - backgroundTexture.getWidth() / 2,
                centerY - backgroundTexture.getHeight() / 2,  0, 0, backgroundTexture.getWidth(), backgroundTexture.getHeight());
        spriteBatch.draw(jpegTexture, 0, 0);
        spriteBatch.draw(jpegTexture, Gdx.graphics.getWidth() - jpegTexture.getWidth(), Gdx.graphics.getHeight() - jpegTexture.getHeight());
        spriteBatch.draw(jpegTexture, 0, Gdx.graphics.getHeight() - jpegTexture.getHeight());
        spriteBatch.draw(jpegTexture, Gdx.graphics.getWidth() - jpegTexture.getWidth(), 0);
        
        freetypeBitmapFont.draw(spriteBatch, "hello libgdx 开源游戏引擎", textPosition.x, textPosition.y);
        spriteBatch.end();
    }

    @Override
    public void resize(int arg0, int arg1) {
        spriteBatch.getProjectionMatrix().setToOrtho2D(0, 0, arg0, arg1);
    }

    @Override
    public void resume() {
    }

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

libgdx 学习笔记(四)中文支持

libgdx 源码  BitmapFont类本身是不支持中文的 public BitmapFont () {         this(Gdx.files.c...

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

在上一篇的文章中,我们介绍了Hiero这个非常好用工具的使用,但是LIbgdx的BitmapFont不支持多图,常用汉字 3500个,你总不能用hiero自己做吧,那怎么办呢?这其实微软早就解决这个...

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

在字体的显示和绘制中,Libgdx的作者(Mario Zechner,美国人)给我们提供了一个非常好用的工具 ——Hiero,那么下面就来看看它具体的使用方法。 一、Hiero工具的使...

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

本来这篇想写场景的,但是昨天和群里一个朋友讨论了一下libgdx显示汉字的问题。以前没有注意到这个问题,发现还是蛮严重的,要是不支持中文,libgdx用着就有点不愉快了。 我们来看看BitmapFo...

libGDX开发教程(三)--中文显示与汉字绘制

1.Hiero工具的使用 如何得到一个“.fnt”和“相应的.png”的文件呢?作者(Mario Zechner)给我们提供了一个非常好用的s工具:Hiero。 ...

Android游戏框架libgdx笔记(四):文字显示

通过 Android游戏框架libgdx笔记(二):图像处理我们知道文字绘制的相关内容,在Libgdx的com.badlogic.gdx.utils包下有提供内置字库,目前仅支持英文、数字和常见符号。...

Libgdx 中文输入显示

  • 2013-03-12 22:17
  • 21.54MB
  • 下载

Android NDK的C/C++代码中利用JNI回调实现字符编码转换的试验(中文UTF8与GBK)

在NDK下做网络传输时,遇到一个编码转换的问题,就是对方传过来的文件名是中文GBK编码,需要转成UTF8来处理。 平常在C/C++环境下编程时,系统都会提供字符编码转换的API。如Windows下有M...
  • huzgd
  • huzgd
  • 2011-02-14 00:17
  • 8242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)