【LWJGL2 WIKI】【辅助库篇】Slick-Util库:第三部分-读取TrueType字体

翻译 2016年01月03日 18:56:05

原文:http://wiki.lwjgl.org/wiki/Slick-Util_Library_-Part_3-_TrueType_Fonts_for_LWJGL

NOTES: 注意:

TrueTypeFont类已经被标记为deprecated(过时类),因为现在Slick2D用的是UnicodeFont来读取TTF字体了。你仍然可以用TrueTypeFont,或者也可以更新为最新的Slick2D然后用UnicodeFont。(译注:想支持中文显示的话,必须得用UnicodeFont)

When to use Bitmap Fonts vs. Unicode Fonts 使用位图字和Unicode字体的时机

大部分游戏并不需要有一套可以无限缩放的字形,因此额外在上面花费内存去读TTF字体并没有必要。大部分图形库(比如Slick2D和TWL)也支持位图字。一般来讲,用位图字比用TTF字体更简便。当然,如果你需要有一个动态的字体大小改变,或者想要适当的unicode字体支持,TrueTypeFont或UnicodeFont才是更优解决方案。

Why is a Library needed for Fonts? 为何还专门要用一个库去读字体

OpenGL默认并不对字体有任何的支持。为了显示字体,你需要手动实现。因为想在OpenGL里实现的话其实并没有唯一解,所以想完美地实现这整个字体支持过程实在是有点无从下手。用位图来显示字体在OpenGL里应该说是非常流行的一种方法。

True Type Font Format TrueType字体格式

TTF这种格式是保存和分享字体所使用的最广泛的一种格式了,有许多网站提供了海量的TFF字体,比如:
www.dafont.com
www.1001freefonts.com
www.urbanfonts.com

Basics 基础

Slick-Util使用Java内置的AWT Font支持功能读取字体,所以你需要对AWT字体类有所了解。你可以用Java内置字体,也可以用外部读取的TTF字体文件。
Slick-Util库会将AWT字体转换,用在OpenGL内。然后通过TrueTypeFont类来保存和描画。
读取TrueType字体的例子如下:

TrueTypeFont font;
TrueTypeFont font2;

public void init() {
    // load a default java font
    Font awtFont = new Font("Times New Roman", Font.BOLD, 24);
    font = new TrueTypeFont(awtFont, false);

    // load font from a .ttf file
    try {
        InputStream inputStream = ResourceLoader.getResourceAsStream("myfont.ttf");

        Font awtFont2 = Font.createFont(Font.TRUETYPE_FONT, inputStream);
        awtFont2 = awtFont2.deriveFont(24f); // set font size
        font2 = new TrueTypeFont(awtFont2, false);

    } catch (Exception e) {
        e.printStackTrace();
    }  
}

之后想在屏幕上渲染出文字,也同样简单:

public void render() {
    font.drawString(100, 50, "THE LIGHTWEIGHT JAVA GAMES LIBRARY", Color.yellow);
    font2.drawString(100, 100, "NICE LOOKING FONTS!", Color.green);
}

以下是一个完整的例子:

import java.awt.Font;
import java.io.InputStream;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

import org.newdawn.slick.Color;
import org.newdawn.slick.TrueTypeFont;
import org.newdawn.slick.util.ResourceLoader;

public class FontExample {

    /** The fonts to draw to the screen */
    private TrueTypeFont font;
    private TrueTypeFont font2;

    /** Boolean flag on whether AntiAliasing is enabled or not */
    private boolean antiAlias = true;

    /**
     * Start the test
     */
    public void start() {
        initGL(800,600);
        init();

        while (true) {
            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
            render();

            Display.update();
            Display.sync(100);

            if (Display.isCloseRequested()) {
                Display.destroy();
                System.exit(0);
            }
        }
    }

    /**
     * Initialise the GL display
     *
     * @param width The width of the display
     * @param height The height of the display
     */
    private void initGL(int width, int height) {
        try {
            Display.setDisplayMode(new DisplayMode(width,height));
            Display.create();
            Display.setVSyncEnabled(true);
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }

        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glShadeModel(GL11.GL_SMOOTH);       
        GL11.glDisable(GL11.GL_DEPTH_TEST);
        GL11.glDisable(GL11.GL_LIGHTING);                   

        GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);               
        GL11.glClearDepth(1);                                      

        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

        GL11.glViewport(0,0,width,height);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, width, height, 0, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
    }

    /**
     * Initialise resources
     */
    public void init() {
        // load a default java font
        Font awtFont = new Font("Times New Roman", Font.BOLD, 24);
        font = new TrueTypeFont(awtFont, antiAlias);

        // load font from file
        try {
            InputStream inputStream = ResourceLoader.getResourceAsStream("myfont.ttf");

            Font awtFont2 = Font.createFont(Font.TRUETYPE_FONT, inputStream);
            awtFont2 = awtFont2.deriveFont(24f); // set font size
            font2 = new TrueTypeFont(awtFont2, antiAlias);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Game loop render
     */
    public void render() {
        Color.white.bind();

        font.drawString(100, 50, "THE LIGHTWEIGHT JAVA GAMES LIBRARY", Color.yellow);
        font2.drawString(100, 100, "NICE LOOKING FONTS!", Color.green);
    }

    /**
     * Main method
     */
    public static void main(String[] argv) {
        FontExample fontExample = new FontExample();
        fontExample.start();
    }
}

你会得到和下图类似的效果:
效果图

UnicodeFont类用法:(译者加)

此教程对UnicodeFont的具体用法并没有细提,去官方论坛看到作者发过一段应用代码,可以用来顺利支持中文。但是需要像flash那样,预先把要用到的所有汉字做成字形。

            UnicodeFont uf = new UnicodeFont("fonts/bgqc.ttf", 24, false, false);
            uf.getEffects().add(new ColorEffect(java.awt.Color.white)); //Requires at least one effect
            uf.addGlyphs("所有可能出现的字都要放在这里面"); //enter all the characters you want to use
            uf.loadGlyphs(); //packs the glyphs onto a texture

// 在循环里这样描画
uf.drawString(100,150, "所有字 没做字形的字不会显示", Color.white);

Credit

Tutorial Credit - Ninja Cave

Kevin Glass for writing the Slick Library and initial example code.

相关文章推荐

HTML5全球普及加速:预计将终结iOS与Android界限(转载)

每经记者 齐文婷 发自深圳   HTML5或将成为未来移动互联网时代的颠覆者。   5年前,当第一台iPhone诞生时,乔布斯断然拒绝了FlashPlayer,而选择HTML5(新型网页标准)取代...

浅谈2011年上半年Java游戏领域动态

浅谈2011年上半年Java游戏领域动态

浅谈Java游戏引擎在智能机领域的发展

1.为什么专注于Java而不是C/C++? 一、首先,Java人讨厌C/C++ 对任何一名忠实的Javaer来说,我们都不会喜欢复杂的C++代码结构,都不会喜欢解决那些因繁琐的指针、引用所...

Android与JavaSE游戏引擎LGame-0.3.1版正式发布

2011-07-03 LGame-0.3.1-Update: 下载地址(内含源码、jar以及九种不同类型的游戏示例):http://loon-simple.googlecode.com/files/L...

【LWJGL2 WIKI】【辅助库篇】Slick-Util库:第二部分-读取声音

原文:http://wiki.lwjgl.org/wiki/Slick-Util_Library_-Part_2-_Loading_Sounds_for_LWJGLJava自带支持WAV和AIF格式,...

【LWJGL2 WIKI】【辅助库篇】Slick-Util库:第一部分-读取图片

原文:http://wiki.lwjgl.org/wiki/Slick-Util_Library_-Part_1-_Loading_Images_for_LWJGLSlick-Util支持png, j...

【LWJGL2 WIKI】【辅助库篇】Slick-Util库:介绍

原文:Introduction”>http://wiki.lwjgl.org/wiki/Slick-Util_Library-_Introduction 译注:获取地址和安装方法去原文里找吧,这里只...

【LWJGL2 WIKI】【现代OpenGL篇】画颜色方形

原文:http://wiki.lwjgl.org/wiki/The_Quad_coloredIntroduction 介绍本教程介绍颜色。每个方形的角将被分配一个不同的颜色,为此我们必须使用shade...

【LWJGL2 WIKI】【现代OpenGL篇】交叉数据画方形

原文:http://wiki.lwjgl.org/wiki/The_Quad_interleavedIntroduction 介绍我们之前把顶点数据分别存在不同的VBO之内。其实也可以交叉或混合保存数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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