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

原文: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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值