Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非英语字母,带有光滑的Util_Java_Lwjgl_Non Unicode - Fatal编程技术网

Java 非英语字母,带有光滑的Util

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 {

我在游戏中使用LWJGL和Slick Util。但现在我无法使用俄语语言环境,因为slick.TrueTypeFont不能呈现西里尔字母(ЯЯssiaПVodа,Сааd,Уа)。
有人知道如何修复吗?

为了解决这个问题,我采用了以下方法:

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;
}
}