所以我刚刚为我的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
字符串时,它不知道要使用哪个字符。
如何测试字符串是否比窗口长,然后实现某种换行符?
答案 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 images,create a custom font或使用icon font generator。获得字体后,将其作为资源添加到项目中,类似于添加图像的方式,并使用它。
另一个相关选项是将其定义为java.awt.Font
的新子类。