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

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

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

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

enter image description here

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", то с изображением проблем не возникает. http://i.imgur.com/MFs5A.png. Однако, когда в chars есть несколько букв, таких как "AAABBB" или "ABABAB", буквы становятся искаженными. На следующем рисунке показано, как выглядит результат, когда chars равен

"AAABBB"

enter image description here


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

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

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

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

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

enter image description here

1 Ответ

2 голосов
/ 27 марта 2012
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 завершает обработку вершины и отправляет ее на рисование, поэтому каждая текстовая координата связывается со следующей вершиной, а не той, которую вы хотите.

...