2D相机翻译

时间:2013-12-22 13:25:43

标签: java opengl 2d side-scroller

我正在使用OpenGL。对于我的瓷砖,我正在使用显示列表,我只是立即使用更多我的播放器(现在)。当我移动玩家时,我想让他居中在窗口的中心,但允许他在y轴上跳转而不让相机跟着他。但问题是,我无法弄清楚如何在视口中居中玩家!这是播放器更新方法:

public void update() {
    if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
        World.scrollx -= Constants.scrollSpeed;
        setCurrentSprite(Sprite.PLAYER_RIGHT);
    }
    if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
        World.scrollx += Constants.scrollSpeed;
        setCurrentSprite(Sprite.PLAYER_LEFT);
    }
    move((Constants.WIDTH) / 2  + -World.scrollx, getY());
}

World.scrollx和World.scrolly是我增加/减少以移动切片的变量。 move()只是一种设置玩家位置的方法,没有别的。我将玩家渲染到他当前的坐标:

public void render() {
    glBegin(GL_QUADS);
    Shape.renderSprite(getX(), getY(), getCurrentSprite());
    glEnd();
}

Shape.renderSprite是这样的:

public static void renderSprite(float x, float y, Sprite sprite){
    glTexCoord2f(sprite.x, sprite.y + Spritesheet.tiles.uniformSize());
    glVertex2f(x, y);
    glTexCoord2f(sprite.x + Spritesheet.tiles.uniformSize() , sprite.y + Spritesheet.tiles.uniformSize());
    glVertex2f(x + Constants.PLAYER_WIDTH, y);
    glTexCoord2f(sprite.x + Spritesheet.tiles.uniformSize(), sprite.y);
    glVertex2f(x + Constants.PLAYER_WIDTH, y + Constants.PLAYER_HEIGHT);
    glTexCoord2f(sprite.x, sprite.y);
    glVertex2f(x, y + Constants.PLAYER_HEIGHT);
}

非常简单,我只是将四边形渲染到当前玩家的位置。这就是我实际呈现所有内容的方式:

public void render(float scrollx, float scrolly) {
    Spritesheet.tiles.bind();
    glPushMatrix();
    glTranslatef(scrollx, scrolly, 0);
    glCallList(tileID);
    glPopMatrix();
    player.render();
}

这是我很困惑的部分。我根据scrollx和scrolly变量翻译tile,然后我将玩家渲染到他当前的位置。但是玩家的移动速度比瓷砖滚动的速度快,他可以逃出屏幕的一侧!如何使用移动的瓷砖使播放器居中?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您希望将播放器固定在屏幕的中央,那么World.scrollx和World.scrolly应该从播放器位置派生,而不是独立于播放器位置。您的更新应该类似于(概念上)

void update {
    getPlayerInput()
    updatePlayerPosition();
    updateWorldCoordinatesFromPlayerPosition();
}