我的字体程序的输出是倾斜的。我很确定问题与 x 和 y 以及 printLetter() 如何使用它们有关。它可能会与 x 和 y 的多个数字混淆吗?如果您需要任何其他代码,请告诉我。 “findCoords”是从游戏循环内部调用的。
其他背景信息:
它使用 LWJGL 及其 OpenGL。 printLetter()
中的 +0.0769
和 +0.25
是主图像中每个图 block 的大小(包含每个图 block 的主图像)字母为 78*24,每个字母为 6*6。),与 1 成比例,xcoords[] 和 ycoords[] 为 double 组: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"
,则图像不会出现问题。 /image/oDwdr.png 。但是,当 chars
中有多个字母(如 "AAABBB"
或 "ABABAB"
时,字母就会倾斜。下图是 chars
为
"AAABBB"
之前,案例本身调用 print 方法,例如
case 'A': printLetter(xcoord[0], ycoord[0], z)
我把它改成了现在的样子,也许是为了让程序不那么困惑。希望即使它没有解决问题,它也能让修复变得更容易一些?
问题可能是因为不同的字母会有不同的坐标,这会扰乱 printLetter()
的工作方式?情况并非如此,因为我测试了使两个字母(A 和 F)具有相同的 x 和 y,并将 chars
“AFAFAF”,并且没有问题。
看起来,字母之间的距离越远,它们看起来就越困惑。将此“AAAZZZ”与上面的“AAABBB”进行比较:
最佳答案
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);
这些调用是向后的。您应该在 glVertex
之前调用 glTexCoord
,而不是之后。 glVertex
调用最终确定顶点并将其发送以进行绘制,因此每个 texcoord 都会与下一个顶点相关联,而不是与您想要的顶点相关联。
关于java - 我原来的 Java 字体程序 - 使用不同字母时倾斜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9894841/