繁体   English   中英

(Java和LWJGL)在加载纹理时使用glTranslatef?

[英](Java and LWJGL) using glTranslatef when loading textures?

我正在尝试制作2D基本游戏; 有点像Terraria,主要是为了提高我的openGL知识(使用Java和LWJGL)。

目前,我正在四边形上绘制纹理,并且一切工作正常,但是,我似乎无法使该窗口滚动(从我可以收集的内容来看,这应该通过glTranslate完成。

码:

private void init() {
    try {
        Display.setDisplayMode(new DisplayMode(window_width, window_height));
        Display.setTitle(window_title);
        Display.setVSyncEnabled(true);
        Display.create();
    } catch (LWJGLException e) {
        e.printStackTrace();
    }

    translatex = 0f;

    w = new World();
    w.placeBlock(4, 5, Blocks.STONE);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, window_width, window_height, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);

    Font awtFont = new Font("Courier New", Font.BOLD, 12);
    font = new TrueTypeFont(awtFont, antiAlias);
}
private void gameLoop() {
    while (!Display.isCloseRequested()) {
        glClear(GL_COLOR_BUFFER_BIT);

        glLoadIdentity();
        glPushMatrix();

        glTranslatef(translatex, 0.0f, 0.0f);
        if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
            translatex += 2.0f;
        }
        w.draw();

        inputManager();

        glPopMatrix();

        Display.update();
        Display.sync(fps);
    }
}

绘制方法

public void draw() {
    texture.bind();
    glLoadIdentity();
    glTranslatef(x, y, 0);
    glBegin(GL_QUADS); {
        glTexCoord2f(0, 0);
        glVertex2f(0, 0);
        glTexCoord2f(1, 0);
        glVertex2f(BLOCK_SIZE, 0);
        glTexCoord2f(1, 1);
        glVertex2f(BLOCK_SIZE, BLOCK_SIZE);
        glTexCoord2f(0, 1);
        glVertex2f(0, BLOCK_SIZE);
    }
    glEnd();
    glLoadIdentity();
}

它可以在没有纹理的情况下正常运行,但是我无法使其发挥作用来挽救生命。.游戏循环中暂时设置了代码,以尝试按空格键时进行一些基本转换

我需要使用其他方法吗? 我该如何工作?

顺便说一下,使用slick-util和lwjgl库...

............编辑...........

并没有完全解决它,而是找到了另一种解决方法。 我修改了draw方法以获取一些偏移变量,并使用相对的transformx偏移每个纹理的四边形

public void draw(int offset_x, int offset_y) {
    texture.bind();
    glLoadIdentity();
    glTranslatef(x - offset_x, y - offset_y, 0);
    glBegin(GL_QUADS); {
        // Drawing the quads here
    }
    glEnd();
    glLoadIdentity();
}

然后通过此调用:

w.draw(translatex, 0);

这只是一个变通办法,但确实可行。 如果有人有实际的解决方案,我会情不自禁地认为它会更高效。

您正在绘图函数中调用glLoadIdentityglLoadIdentity所有先前的转换状态,尤其是要应用的转换。 您似乎这样做是为了防止积累每个对象的翻译,但是您应该改用矩阵堆栈,例如使用序列

PushMatrix()
TranslateLocalTile()
Draw()
PopMatrix()

在您的draw函数中,这样就可以封装局部转换,并且不会影响下一个对象的转换,而所有外部转换(例如全局转换)仍然有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM