java - 2D 相机翻译

标签 java opengl 2d side-scroller

我正在使用 OpenGL。对于我的图 block ,我正在使用显示列表,并且我只是为我的播放器使用即时更多(目前)。当我移动玩家时,我想将他置于窗口的中心,但允许他在 y 轴上跳跃而不让相机跟随他。但问题是,我不知道如何使玩家在视口(viewport)中居中!以下是播放器更新方法:

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.scrollly 是我增加/减少以移动图 block 的变量。 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变量翻译图 block ,然后将玩家渲染在他当前的位置。但玩家的移动速度比方 block 滚动的速度还要快,而且他可以从屏幕的一侧逃脱!如何使玩家与移动的图 block 居中?

感谢您的帮助!

最佳答案

如果您希望玩家固定在屏幕中心,那么 World.scrollx 和 World.scrollly 应该从玩家位置派生,而不是独立于它进行更改。您的更新应该类似于(概念上)

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

关于java - 2D 相机翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20729932/

相关文章:

java - Spring Schedule 方法被调用两次

java - Hibernate查询语言: selecting some properties requires alias name

c++ - OpenGL - 在相机空间中绘制后将模型放置在世界空间中?

c++ - 如何为 Windows C++ 安装当前版本的 OpenGL?

C# 2D Array - 如何打印每行中最大的元素

c# - 以整数精度合并( bool 联合)矩形区域

java - 是否可以过滤掉空的Options并用Java流在一行中映射当前的Options?

java - 如何在应用程序内使用用户的电子邮件 ID 发送电子邮件(无 Intent )

opengl - 如何有效地将texture1复制到texture2?

c# - 在 Unity 中设置 transform.up 时会发生什么