我的原始Java字体程序 - 使用不同的字母时偏斜?

时间:2012-03-27 17:48:51

标签: java opengl textures lwjgl

我的字体程序输出有偏差。我很确定问题与x和y有关,以及printLetter()如何使用它们。它可能与x和y的多个数字混淆了?如果您需要任何其他代码,请与我们联系。 'findCoords'是从游戏圈内调用的。

其他背景资料:

它使用LWJGL及其OpenGL。 +0.0769中的+0.25printLetter()是主图像中每个图块的大小(每个字母的主图像为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 个答案:

答案 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都与下一个顶点而不是您想要的顶点相关联。