我一直在尝试在屏幕上显示块,每个块都有不同的纹理。我已经设置了精灵表以及代码。但是我无法在 spritesheet 中获取特定坐标,我无法将其他任何内容显示为第一张图像。
我已经设置了这个渲染功能:
public static void render(int texture, int blockID) {
float xPos = (float)blockID;
float yPos = 0;
while(xPos > 9) {
xPos -= 10;
yPos++;
}
glBindTexture(GL_TEXTURE_2D, texture);
glPushMatrix();
glBegin(GL_TRIANGLES);
glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(16, 0);
glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(0, 0);
glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(0, 16);
glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(0, 16);
glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(16, 16);
glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(16, 0);
glEnd();
glPopMatrix();
}
它决定从 blockID 中获取哪个纹理,因此如果 blockID 为 1,则从 spritesheet 中获取第二张图像,如果为 2,则从 spritesheet 中获取第三张图像,依此类推。
但我不知道我必须在哪里将 xPos 和 yPos 变量乘以 glTexCoord2f。我尝试了不同的方法,例如:
glTexCoord2f(xPos / 128f, 0f / 128f); glVertex2i(16, 0);
glTexCoord2f(0f / 128f, yPos / 128f); glVertex2i(0, 16);
或者
glTexCoord2f((0f / 128f) * xPos, 0f / 128f; glVertex2i(16, 0);
glTexCoord2f(0f / 128f, (8f / 128f)) * yPos; glVertex2i(0, 16);
乃至
glTexCoord2f(0f / 128f, 0f / 128f); glVertex2i(16 * xPos, 0);
glTexCoord2f(0f / 128f, 8f / 128f); glVertex2i(0, 16 * yPos);
但没有一个奏效。
=== 编辑 ===
我几乎设法让它工作。但只有奇数的blockID。如果 blockID 为 1,则显示第一个纹理,但如果为 2,则显示褐色(不在我的 spritesheet 上),如果 blockID 为 3,则在工作表上显示第二个纹理,依此类推。