字体渲染中的换行符

时间:2013-12-08 01:19:08

标签: java line break

所以我刚刚为我的Java游戏创建了一个字体精灵表,并已将此方法实现到一个类中,以使用该精灵表绘制文本。

public static void renderText(Graphics2D g, String message, int x, int y, int size) {

    message = message.toUpperCase();
    for(int i = 0; i < message.length(); i++) {
        char c = message.charAt(i);
        if(c == 47) c = 36; // slash
        if(c == 58) c = 37; // colon
        if(c == 32) c = 38; // space
        if(c == 46) c = 40; // period
        if(c == 95) c = 39; // underscore
        if(c == 33) c = 41; // exclamation point
        if(c == 63) c = 42; // question mark
        if(c == 39) c = 43; // apostrophe
        if(c >= 65 && c <= 90) c -= 65; // letters
        if(c >= 48 && c <= 57) c -= 22; // numbers
        int row = c / font[0].length; // font is a 2D Array of BufferedImages from the sprite sheet 
        int col = c % font[0].length;
        g.drawImage(font[row][col], x + size * i, y, size, size, null);
    }

}

这一切都很好,但它渲染的字符串通常比窗口长。我尝试使用String newline = System.getProperty("line.separator"),但这会给我一个错误,因为当它尝试渲染newline字符串时,它不知道要使用哪个字符。

如何测试字符串是否比窗口长,然后实现某种换行符?

2 个答案:

答案 0 :(得分:1)

你可以简单地调用font[row][col].getTileWidth()来获取每个精灵的像素宽度,并确保总和&lt; =面板的宽度。

此外,这里发生了什么?

if(c == 95) c = 39; // underscore
...
if(c == 39) c = 43; // apostrophe

这真的是意图吗?

答案 1 :(得分:0)

您没有理由需要滚动自己的渲染器。使用系统字体渲染器有许多优点,包括它能够利用高级缓存以及图形系统只是想让它做的各种其他事情。 (更不用说它实际上也有效。)

如果要在自定义字体中显示文本,请使用自定义字体。快速谷歌会提供各种结果,了解如何create a font from imagescreate a custom font或使用icon font generator。获得字体后,将其作为资源添加到项目中,类似于添加图像的方式,并使用它。

另一个相关选项是将其定义为java.awt.Font的新子类。