【问题标题】:(Java and LWJGL) using glTranslatef when loading textures?(Java 和 LWJGL)在加载纹理时使用 glTranslatef?
【发布时间】:2013-07-19 13:13:44
【问题描述】:

我正在尝试制作一个 2D 基础游戏;有点像泰拉瑞亚,主要是为了提高我的 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方法来接受一些偏移变量,并使用相对平移来偏移每个纹理的四边形

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);

这只是一种解决方法,但它确实有效,所以。如果有人有实际的解决方案,我不禁认为它会更有效率......

【问题讨论】:

    标签: java opengl lwjgl


    【解决方案1】:

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

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

    在你的draw函数中,这样局部平移就被封装了,不会影响下一个对象的变换,而所有外部变换(比如你的全局变换)仍然有效。

    【讨论】:

      猜你喜欢
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      相关资源
      最近更新 更多