Вывод моей программы шрифтов искажен. Я почти уверен, что проблема связана с 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. Вот изображение, из которого берутся координаты текстуры.
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"
Раньше сами случаи вызывали метод печати, например,
case 'A': printLetter(xcoord[0], ycoord[0], z)
Я изменил это на то, как сейчас, чтобы, возможно, сделать программу не такой запутанной. Надеюсь, даже если это не помогло решить проблему, это немного облегчило ее решение?
Проблема может быть в том, что разные буквы будут иметь разные координаты, и это мешает работе printLetter()
? Это не так, потому что я проверял, чтобы две буквы (A и F) имели одинаковые x и y, и сделали chars
«AFAFAF», и проблем не было.
Также кажется, что чем дальше буквы, тем больше они запутаны. Сравните этот "AAAZZZ" с вышеупомянутым "AAABBB":