Использование LWJGL для отображения текста - PullRequest
3 голосов
/ 01 апреля 2012

Я довольно долго искал способы сделать это и наконец решил просто написать текст, загрузив его из растрового изображения. Это мой первый шаг при загрузке отдельных областей изображения и использовании растрового изображения, поэтому я знаю, что в моем алгоритме есть некоторые ошибки. (Некоторые из них я бы поспорил), но я сделал это так, как мог. Если кто-то скажет мне, что я делаю неправильно, и укажет мне правильное направление, чтобы выяснить это, было бы здорово. Из того, что я могу сказать, когда я отправляю информацию в рендер, она верна, я получаю правильный символ и правильную позицию x, y, чтобы перевести ее, и текстура загружается очень хорошо. Я просто не могу понять, почему я не получаю правильную часть изображения для письма, ничего не появляется.

Вот мой код.

public class StringText {

private ArrayList<TextChar> fontChar;
private final int CHAR_SIZE = 8;
private final int MARGINE = 1;
private Texture fontTexture;
private String lower;
private String upper;
private String symb;
private final int IMAGE_SIZE  = 256;


public StringText(){
    lower = "abcdefghijklmnopqrstuvwxyz";
    upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    symb = ".,?:*!+-() ";
    fontChar = new ArrayList<TextChar>();
    readInFont("font");
    populateCheck();
}

public void drawText(String ts, int x, int y, float red, float green, float blue){
    for(int a = 0; a < ts.length(); a++){
        for(int b = 0; b < fontChar.size(); b++)
        if(fontChar.get(b).getChar == ts.charAt(a))
            render(fontChar.get(b),a, x, y, red, green, blue);
    }
}

private void populateCheck(){
    int charX = 0;
    int charY = 0;
    for(int x = 0;  x < lower.length(); x++){
        TextChar t = new TextChar(lower.charAt(x), charX, -8);
        fontChar.add(t);
        charX += CHAR_SIZE;
    }
    charX = 0;
    for(int x = 0; x < upper.length(); x++){
        TextChar t = new TextChar (upper.charAt(x), charX, -16);
        fontChar.add(t);
        charX += CHAR_SIZE;
    }
    charX = 0;
    for(int x = 0; x < symb.length(); x++){
        TextChar t = new TextChar(symb.charAt(x), charX, -24);
        fontChar.add(t);
        charX += CHAR_SIZE;
    }
}

private void render(TextChar textChar, int current, int x, int y, float red, float green, float blue){
    int inc = current * (CHAR_SIZE + MARGINE);
    glLoadIdentity();
    glTranslatef(x + inc,y,0f);
    glColor3f(red, green, blue);
    glScalef(1.0f, -1.0f, 1.0f);
    fontTexture.bind();
    System.out.println("Letter Position: " + (x+inc) + ", " + y + " Character: " + textChar.getChar);


    float x0 = textChar.x/IMAGE_SIZE;
    float y0 = textChar.y/IMAGE_SIZE;
    float x1 = (textChar.x + CHAR_SIZE)/IMAGE_SIZE;
    float y1 = (textChar.y - CHAR_SIZE)/IMAGE_SIZE;

    glBegin(GL_QUADS);
        glTexCoord2f( x0, -y0); glVertex2f(0,0);
        glTexCoord2f(x1,-y0); glVertex2f(IMAGE_SIZE,0);
        glTexCoord2f(x1,-y1); glVertex2f(IMAGE_SIZE, IMAGE_SIZE);
        glTexCoord2f(x0,-y1); glVertex2f(0,IMAGE_SIZE);
    glEnd();
}

private void readInFont(String s){
    try {
        fontTexture = TextureLoader.getTexture("PNG", new FileInputStream(new File("res/font/"+ s +".png")));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private class TextChar{
    int x,y;
    char getChar;
    public TextChar(char s, int xa, int ya){
        x = xa;
        y = ya;
        getChar = s;
    }
}

}

1 Ответ

1 голос
/ 01 апреля 2012

Я нашел лучший способ сделать это, используя растровое изображение ASCII.

...