我遇到的问题是我的128 x 128纹理被绘制为164 x 128.或100x100绘制128x100。一直试图调试好几天:非常感谢任何帮助,以节省我拉出更多的头发:)
我一直在使用Kevin Glass的Space Invaders 104 LWJGL代码作为参考(阅读:复制/粘贴/更改/学习!),除了我不需要多种渲染方法:我正在构建一个垂直滚动射击游戏LWJGL用于GL图形和键盘控制。
问题似乎发生在我的所有“精灵”上,但我正在集中/调试我的玩家船精灵,所以我将把它作为我的例子。通过屏幕截图验证,它绘制的精灵比使用的原始PNG图像的像素更宽。起初我想也许代码需要图像为2 ^ n值,所以我将源更新为128 x 128像素图像:这是以164 x 128绘制的。我将图像重新创建为100 x 100,然后绘制它为128 x 100 ...所以至少有一个比例正在发生!这个比例,以及它每次抽出Y的事实让我觉得这是一个简单的错误或错字......
所以我的第一个重点是这段代码:
public void draw(int x, int y) {
// store the current model matrix
GL11.glPushMatrix();
// bind to the appropriate texture for this sprite
texture.bind();
// translate to the right location and prepare to draw
GL11.glTranslatef(x, y, 0);
GL11.glColor3f(1,1,1);
// draw a quad textured to match the sprite
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(0, texture.getHeight()); // texture.getHeight() returns 1.0, confirmed while debugging
GL11.glVertex2f(0, height); // height = 128px, confirmed while debugging
GL11.glTexCoord2f(texture.getWidth(), texture.getHeight());
GL11.glVertex2f(width,height); // width = 128px, confirmed while debugging
GL11.glTexCoord2f(texture.getWidth(), 0);
GL11.glVertex2f(width,0);
}
GL11.glEnd();
// restore the model view matrix to prevent contamination
GL11.glPopMatrix();
}
我调试了这个代码最多,认为这是“神奇发生的地方”,以确保我在适当的时候明确地为glVertex2f传递128px,并且glTexCoord2f在适当的情况下获得比率1.0。所以我现在的逻辑是,鉴于GL适用于3D,并且坐标和实际像素之间可能存在一些抽象(ST与XY?也许是说垃圾......)也许它是“画布”或“显示”本身还没有设置属性?所以游戏世界/ GL世界认为世界是1000像素高(例如)当真实世界被绘制800像素高,所以事情被垂直挤压?所以我的GL初始代码是(包括Glass的评论!):
public void startRendering() {
try {
setDisplayMode();
Display.create();
// grab the mouse, dont want that hideous cursor when we're playing!
Mouse.setGrabbed(true);
// enable textures since we're going to use these for our sprites
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
// disable the OpenGL depth test since we're rendering 2D graphics
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, GAMESIZE_X, GAMESIZE_Y, 0, -1, 1);
} catch (LWJGLException le) {
System.exit(0);
}
initialise();
GameLoop();
}
private boolean setDisplayMode() {
try {
// get modes
DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(
GAMESIZE_X, GAMESIZE_Y, -1, -1, -1, -1, 60, 60);
org.lwjgl.util.Display.setDisplayMode(dm, new String[] {
"width=" + GAMESIZE_X,
"height=" + GAMESIZE_Y,
"freq=" + 60,
"bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel() });
return true;
} catch (Exception e) {
e.printStackTrace();
System.out.println("Unable to enter fullscreen, continuing in windowed mode");
}
return false;
}
所以那里有很多我不完全理解的代码,但我不能直观地看到任何似乎会影响我的问题的东西?正确的游戏规模正在看似每一个相关点。