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