我的字体程序输出有偏差。我很确定问题与x和y有关,以及printLetter()
如何使用它们。它可能与x和y的多个数字混淆了?如果您需要任何其他代码,请与我们联系。 '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”进行比较:
答案 0 :(得分:2)
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
调用最终确定顶点并发送它以进行绘制,因此每个texcoord都与下一个顶点而不是您想要的顶点相关联。