Java 非英语字母,带有光滑的Util
我在游戏中使用LWJGL和Slick Util。但现在我无法使用俄语语言环境,因为slick.TrueTypeFont不能呈现西里尔字母(ЯЯssiaПVodа,Сааd,Уа)。Java 非英语字母,带有光滑的Util,java,lwjgl,non-unicode,Java,Lwjgl,Non Unicode,我在游戏中使用LWJGL和Slick Util。但现在我无法使用俄语语言环境,因为slick.TrueTypeFont不能呈现西里尔字母(ЯЯssiaПVodа,Сааd,Уа)。 有人知道如何修复吗?为了解决这个问题,我采用了以下方法: private Texture letter(char i) { if (letter[(int) i] != null) { return letter[(int) i]; } else {
有人知道如何修复吗?为了解决这个问题,我采用了以下方法:
private Texture letter(char i) {
if (letter[(int) i] != null) {
return letter[(int) i];
} else {
/*
Making empty buffer to get character's width.
*/
BufferedImage im = new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_BINARY);
Graphics g = im.getGraphics();
FontMetrics fm = g.getFontMetrics(f);
int w = fm.charWidth(i);
int h = fm.getHeight() * 5 / 4;
/*
Making the java.awt.BufferedImage with character.
*/
if (w == 0) {
w = 1;
}
im = new BufferedImage(w, h*2, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = (Graphics2D) im.getGraphics();
g2.setFont(f);
g2.setColor(java.awt.Color.WHITE);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2.drawString(i + "", 0, h);
{
/*
Converting image to the Texture.
*/
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(im, "png", os);
InputStream is = new ByteArrayInputStream(os.toByteArray());
Texture t = TextureLoader.getTexture("PNG", is);
letter[(int) i] = t;
return t;
} catch (IOException ex) {
System.out.println("\"" + i + "\" isn't loaded.");
}
return null;
}
}
}
这个textrender类:
package TheTimeless.gui;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import static org.lwjgl.opengl.GL11.*;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
/**
*
* @author yew_mentzaki
*/
public final class VTextRender {
private final Texture letter[] = new Texture[Short.MAX_VALUE];
private Font f;
public VTextRender(int size, String name){
f= new Font(name, 0, size);
getWidth("ABCCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`'[](){}<>:,-.?\";/|\\!@#$%^&*_+-*=§АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя");
}
private Texture letter(char i) {
if (letter[(int) i] != null) {
return letter[(int) i];
} else {
/*
Making empty buffer to get character's width.
*/
BufferedImage im = new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_BINARY);
Graphics g = im.getGraphics();
FontMetrics fm = g.getFontMetrics(f);
int w = fm.charWidth(i);
int h = f.getSize()+5;
/*
Making the java.awt.BufferedImage with character.
*/
if (w == 0) {
w = 1; h = 1;
}
im = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = (Graphics2D) im.getGraphics();
g2.setFont(f);
g2.setColor(Color.WHITE);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2.drawString(i + "", 0, f.getSize());
{
/*
Converting image to the Texture.
*/
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(im, "png", os);
InputStream is = new ByteArrayInputStream(os.toByteArray());
Texture t = TextureLoader.getTexture("PNG", is);
letter[(int) i] = t;
return t;
} catch (IOException ex) {
System.out.println("\"" + i + "\" isn't loaded.");
}
return null;
}
}
}
public int getWidth(String text) {
int width=0;
String[] fText=text.split("\n");
for(String str:fText) {
int w = 0;
for (char c : str.toCharArray()) {
Texture t = letter(c);
if (t == null) {
continue;
}
w += t.getImageWidth();
}
if(w>width){
width=w;
}
}
return width;
}
public String splitString(String text,int maxWidth)
{
try {
if (getWidth(text) > maxWidth && !text.contains(" "))
throw new Exception("the word is to big, insert space");
}catch(Exception e) {
e.printStackTrace();
}
int w = 0;
String[] fText = text.split(" ");
String result = "";
for (String str : fText) {
if (str.contains("\n"))
w = 0;
if (getWidth(str + " ") + w <= maxWidth) {
result += (str + " ");
w += getWidth(str + " ");
} else if(getWidth(str + " ") + w >= maxWidth){
w = 0;
result += "\n";
}
}
return result;
}
public void drawString(String text, int fx, int fy, org.newdawn.slick.Color clr) {
int x=fx, y=fy;
glColor4f(clr.r,clr.g,clr.b,clr.a);
for (char c : text.toCharArray()) {
Texture t = letter(c);
if (t == null) {
continue;
}
t.bind();
if(c=='\n')
{
y+=f.getSize()+5;
x=fx;
}
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(x, y);
glTexCoord2f(t.getWidth(), 0);
glVertex2i(x + t.getImageWidth(), y);
glTexCoord2f(t.getWidth(), t.getHeight());
glVertex2i(x + t.getImageWidth(), y + t.getImageHeight());
glTexCoord2f(0, t.getHeight());
glVertex2i(x, y + t.getImageHeight());
glEnd();
x += t.getImageWidth();
}
}
public int getHeight()
{
return f.getSize()+5;
}
}
打包timeless.gui;
导入java.awt.Color;
导入java.awt.Font;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.RenderingHints;
导入java.awt.image.buffereImage;
导入java.io.ByteArrayInputStream;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入javax.imageio.imageio;
导入静态org.lwjgl.opengl.GL11.*;
导入org.newdawn.slick.opengl.Texture;
导入org.newdawn.slick.opengl.TextureLoader;
/**
*
*@作者yew_mentzaki
*/
公开期末班{
私有最终纹理字母[]=新纹理[Short.MAX_VALUE];
专用字体f;
公共VTextRender(整数大小,字符串名称){
f=新字体(名称、0、大小);
getWidth(“abccdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz`[…](-):,-.?\”;/?\!$%和*+*=§АБСГзззззЮггж;
}
私人纹理字母(字符i){
如果(字母[(int)i]!=null){
回信[(int)i];
}否则{
/*
创建空缓冲区以获取字符宽度。
*/
BuffereImage im=新的BuffereImage(1,1,BuffereImage.TYPE_BYTE_BINARY);
Graphics g=im.getGraphics();
FontMetrics fm=g.getFontMetrics(f);
int w=调频字符宽度(i);
inth=f.getSize()+5;
/*
使用字符生成java.awt.buffereImage。
*/
如果(w==0){
w=1;h=1;
}
im=新的BuffereImage(w,h,BuffereImage.TYPE_4BYTE_ABGR);
Graphics2D g2=(Graphics2D)im.getGraphics();
g2.setFont(f);
g2.设置颜色(颜色为白色);
g2.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_插值,
渲染提示值(插值双三次);
g2.抽绳(i+“”,0,f.getSize());
{
/*
将图像转换为纹理。
*/
试一试{
ByteArrayOutputStream os=新建ByteArrayOutputStream();
ImageIO.write(即时消息,“png”,操作系统);
InputStream is=newbytearrayinputstream(os.toByteArray());
Texture t=TextureLoader.getTexture(“PNG”,is);
字母[(int)i]=t;
返回t;
}捕获(IOEX异常){
System.out.println(“\”+i+“\”未加载);
}
返回null;
}
}
}
公共整型getWidth(字符串文本){
整数宽度=0;
字符串[]fText=text.split(“\n”);
用于(字符串str:fText){
int w=0;
for(字符c:str.toCharArray()){
纹理t=字母(c);
如果(t==null){
继续;
}
w+=t.getImageWidth();
}
如果(w>宽度){
宽度=w;
}
}
返回宽度;
}
公共字符串拆分字符串(字符串文本,int maxWidth)
{
试一试{
if(getWidth(text)>maxWidth&&!text.contains(“”)
抛出新异常(“单词太大,插入空格”);
}捕获(例外e){
e、 printStackTrace();
}
int w=0;
字符串[]fText=text.split(“”);
字符串结果=”;
用于(字符串str:fText){
如果(str.contains(“\n”))
w=0;
if(getWidth(str+“”)+w=maxWidth){
w=0;
结果+=“\n”;
}
}
返回结果;
}
public void drawString(字符串文本、int-fx、int-fy、org.newdawn.slick.Color clr){
int x=fx,y=fy;
glColor4f(clr.r、clr.g、clr.b、clr.a);
for(char c:text.toCharArray()){
纹理t=字母(c);
如果(t==null){
继续;
}
t、 bind();
如果(c=='\n')
{
y+=f.getSize()+5;
x=外汇;
}
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex2i(x,y);
glTexCoord2f(t.getWidth(),0);
glVertex2i(x+t.getImageWidth(),y);
glTexCoord2f(t.getWidth(),t.getHeight());
glVertex2i(x+t.getImageWidth(),y+t.getImageHeight());
glTexCoord2f(0,t.getHeight());
glVertex2i(x,y+t.getImageHeight());
格伦德();
x+=t.getImageWidth();
}
}
公共整数getHeight()
{
返回f.getSize()+5;
}
}