Моя оригинальная программа шрифтов Java - перекос при использовании разных букв?

Вывод моей программы шрифтов искажен. Я уверен, что проблема связана с х и у, и как printLetter() использует их. Возможно, это путают с несколькими числами для х и у? Пожалуйста, дайте мне знать, если вам нужен дополнительный код. 'findCoords' вызывается из игрового цикла.

Дополнительная справочная информация:

Он использует LWJGL и его OpenGL. +0.0769 а также +0.25 в printLetter() насколько велика каждая плитка в основном изображении (основное изображение, содержащее каждую из букв - 78*24, а каждая буква - 6*6.), пропорционально 1, а массивы xcoords[] и ycoords[] doubles: xcoords[] содержит 0/13, 1/13, 2/13, 3/13 и т. д., а ycoords[] содержит 0/4, 1/4, 2/4, 3/4 для glTexCoord должно быть пропорционально 1. Вот изображение, из которого он берет координаты текстуры.

public void findCoords(String chars){
    int numChars = chars.length();
    for(int z = 0; z < numChars; z++){

        char ch = chars.charAt(z);
        int x;
        int y;

        switch(ch){
    //LETTERS
        case 'A': x= 0; y= 0; break; case 'N': x= 0; y= 1; break;
        case 'B': x= 1; y= 0; break; case 'O': x= 1; y= 1; break;
        case 'C': x= 2; y= 0; break; case 'P': x= 2; y= 1; break;
        case 'D': x= 3; y= 0; break; case 'Q': x= 3; y= 1; break;
        case 'E': x= 4; y= 0; break; case 'R': x= 4; y= 1; break;
        case 'F': x= 5; y= 0; break; case 'S': x= 5; y= 1; break;
        case 'G': x= 6; y= 0; break; case 'T': x= 6; y= 1; break;
        case 'H': x= 7; y= 0; break; case 'U': x= 7; y= 1; break;
        case 'I': x= 8; y= 0; break; case 'V': x= 8; y= 1; break;
        case 'J': x= 9; y= 0; break; case 'W': x= 9; y= 1; break;
        case 'K': x= 10; y= 0; break; case 'X': x= 10; y= 1; break;
        case 'L': x= 11; y= 0; break; case 'Y': x= 11; y= 1; break;
        case 'M': x= 12; y= 0; break; case 'Z': x= 12; y= 1; break;
    //NUMBERS
        case '0': x= 0; y= 2; break; case '5': x= 5; y= 2; break;
        case '1': x= 1; y= 2; break; case '6': x= 6; y= 2; break;
        case '2': x= 2; y= 2; break; case '7': x= 7; y= 2; break;
        case '3': x= 3; y= 2; break; case '8': x= 8; y= 2; break;
        case '4': x= 4; y= 2; break; case '9': x= 9; y= 2; break;
    //PUNCTUATION
        case '.': x= 10; y= 2; break; case '!': x= 12; y= 2; break;
        case ',': x= 11; y= 2; break;

        case '?': x= 0; y= 3; break; case '"': x= 2; y= 3; break;
        case ':': x= 1; y= 3; break; case ' ': x= 3; y= 3; break;

        default: x= 0; y= 3;
            }

            int offs = scale*z;
            printLetter(x, y, offs);

        }
    }

,

void printLetter(int x, int y, int offs){
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
    GL11.glBegin(GL11.GL_QUADS);

    GL11.glVertex2f(0+offs, scale);
    GL11.glTexCoord2d(xcoords[x]+0.0769, ycoords[y]+0.25);

    GL11.glVertex2f(scale+offs, scale);
    GL11.glTexCoord2d(xcoords[x]+0.0769, ycoords[y]);

    GL11.glVertex2f(scale+offs, 0);
    GL11.glTexCoord2d(xcoords[x], ycoords[y]);

    GL11.glVertex2f(0+offs, 0);
    GL11.glTexCoord2d(xcoords[x], ycoords[y]+0.25);

    GL11.glEnd();
    GL11.glFlush();
}

когда chars повторяется одна буква, как "AAAAA" или же "BBBBBB"Тогда нет проблем с изображением. https://i.imgur.com/MFs5A.png. Тем не менее, когда есть несколько букв в chars лайк "AAABBB" или же "ABABAB" тогда буквы становятся искаженными. На следующем рисунке показано, как выглядит вывод chars является

"AAABBB"


Ранее сами случаи вызывали метод print, например, с помощью

case 'A': printLetter(xcoord[0], ycoord[0], z)

Я изменил это на то, как сейчас, чтобы, возможно, сделать программу не такой запутанной. Надеюсь, даже если это не решило проблему, это немного облегчило ее решение?

Проблема может быть в том, что разные буквы будут иметь разные координаты, и это мешает printLetter() работает? Это не так, потому что я тестировал, чтобы две буквы (A и F) имели одинаковые x и y, и сделал chars "AFAFAF" и проблем не было.

Кажется, что чем дальше буквы, тем больше они запутаны. Сравните этот "AAAZZZ" с вышеупомянутым "AAABBB":

1 ответ

Решение
GL11.glVertex2f(0+offs, scale);
GL11.glTexCoord2d(xcoords[x]+0.0769, ycoords[y]+0.25);

GL11.glVertex2f(scale+offs, scale);
GL11.glTexCoord2d(xcoords[x]+0.0769, ycoords[y]);

GL11.glVertex2f(scale+offs, 0);
GL11.glTexCoord2d(xcoords[x], ycoords[y]);

GL11.glVertex2f(0+offs, 0);
GL11.glTexCoord2d(xcoords[x], ycoords[y]+0.25);

Эти звонки обратные. Вам следует позвонить glTexCoord до glVertexне после. glVertex call завершает обработку вершины и отправляет ее на рисование, поэтому каждая текстовая координата связывается со следующей вершиной, а не с той, которую вы хотите.

Другие вопросы по тегам