您的位置:首页 > 产品设计 > UI/UE

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

2016-01-03 18:56 706 查看
原文: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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lwjgl java