【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
www.dafont.com
www.1001freefonts.com
www.urbanfonts.com
Slick-Util库会将AWT字体转换,用在OpenGL内。然后通过TrueTypeFont类来保存和描画。
读取TrueType字体的例子如下:
之后想在屏幕上渲染出文字,也同样简单:
以下是一个完整的例子:
你会得到和下图类似的效果:
Kevin Glass for writing the Slick Library and initial example code.
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 CaveKevin Glass for writing the Slick Library and initial example code.
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树