0

好的,我是一个自学成才的程序员,我正在尝试使用 lwjgl 和 slik-utils 来制作一个库来提供制作游戏的工具。我一直在尝试制作一个精灵表,并且我正在使用 glTexCoord() 来尝试仅获取图像的一部分。但尽我最大的努力,我没有工作。这是绘制代码。

public SpriteSheet draw(int x, int y, Point2D p)
    {
    GL11.glPushMatrix();
    float x1 = p.posX * size + (size / 2F);
    float y1 = p.posY * size + (size / 2F);
    float d = 1F / texture.getImageHeight();
    int i = size / 2;
    //Texture centers for coords
    float x2 = x1 * d;
    float y2 = y1 * d;
    float d1 = i * d;

    GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getTextureID());
    GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(x2 - d1, y2 - d1);
    //GL11.glTexCoord2f(0, 0);
    GL2D.vertex(x - i, y - i);
    GL11.glTexCoord2f(x2 - d1, y2 + d1);
    //GL11.glTexCoord2f(0, 1);
    GL2D.vertex(x - i, y + i);
    GL11.glTexCoord2f(x2 + d1, y2 + d1);
    //GL11.glTexCoord2f(1, 1);
    GL2D.vertex(x + i, x + i);
    GL11.glTexCoord2f(x2 + d1, y2 - d1);
    //GL11.glTexCoord2f(1, 0);
    GL2D.vertex(x - i, y + i);
    GL11.glEnd();
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
    GL11.glPopMatrix();
    //TexturedQuad2D t = new TexturedQuad2D(32, 32, Color.black, texture);
    //t.draw(x, y);
    return this;
}
4

1 回答 1

1

是的,你做错了:)
你的 x 和 y 是你的世界空间坐标而不是你的纹理坐标空间,想象你的 x 和 y 在坐标 700、800 上,你的纹理大小是 512。700 / 512 = 1.4,纹理坐标从 0 到 1。
所以第一步尝试使用 0 和 1 设置纹理坐标。

 GL11.glTexCoord2f(0, 0);
 GL11.glTexCoord2f(0, 1);
 GL11.glTexCoord2f(1, 1);
 GL11.glTexCoord2f(1, 0);

现在作为第二步开始弄清楚如何计算你的纹理坐标的一部分,
所以如果我们有一个有 2 帧的精灵,我们将第一帧从 0 到 0.5,第二帧从 0.5 到 1

//first frame would be
 GL11.glTexCoord2f(0, 0);
 GL11.glTexCoord2f(0, 1);
 GL11.glTexCoord2f(0.5, 1);
 GL11.glTexCoord2f(0.5, 0);
//second frame would be
 GL11.glTexCoord2f(0.5, 0);
 GL11.glTexCoord2f(0.5, 1);
 GL11.glTexCoord2f(1, 1);
 GL11.glTexCoord2f(1, 0);

现在作为第三步,编写一个精灵类来为你计算这个坐标!

附言。第二次通知您是否在任何地方为 OpenGL 启用纹理GL11.glEnable(GL11.GL_TEXTURE_2D); 得到任何纹理?

于 2012-07-14T13:00:29.467 回答