0

我遇到了一个问题,我的 128 x 128 纹理被绘制为 164 x 128。或者 100x100 绘制为 128x100。几天来一直在尝试调试:非常感谢任何帮助我节省更多头发的帮助:)

我一直在使用 Kevin Glass 的 Space Invaders 104 LWJGL 代码作为参考(阅读:复制/粘贴/更改/学习!),但我不需要多种渲染方法:我正在构建一个仅使用 LWJGL for 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;
}

所以那里有很多我不完全理解的代码,但我无法直观地看到任何似乎会影响我的问题的东西?我的正确游戏大小似乎在每个相关点都通过了。

4

0 回答 0