首页 > 解决方案 > libGDX 中的视差效果抖动

问题描述

基本上我使用这个 ParallaxCamera 类在我的游戏中创建效果,但是在移动时,图层“摆动”。当相机缓慢移动时,这一点尤其明显。

我已经固定了时间步长并使用了插值平滑。我使用放大的像素艺术。相机以玩家为中心,在移动后更新。禁用该效果可使相机平滑移动。

我猜问题可能是:

谢谢你的帮助

标签: cameralibgdxparallaxsmoothingjitter

解决方案


对于低分辨率像素艺术,这是我使用的策略。我以 1:1 的分辨率绘制到一个小的 FrameBuffer,然后将其绘制到屏幕上。那应该注意抖动。

如果您的 Stage 也具有相同的分辨率,那么您必须使用一些技巧来正确处理输入。我用它来使用 StretchViewport,但我手动计算世界的宽度和高度以不拉伸世界,所以我基本上在做与 ExtendViewport 在幕后所做的相同的计算。您还必须将宽度和高度四舍五入为整数。您应该这样做并使用andresize应用宽度和高度。所以在这种情况下,你给构造函数的世界大小无关紧要,因为它将在.viewport.setWorldWidth()setWorldHeight()update()

当您update在 中调用视口时resize,您需要在要绘制到的 FrameBuffer 的上下文中执行此操作。否则它会弄乱屏幕的帧缓冲区尺寸。

public void resize(int width, int height) {

    int worldWidth = Math.round((float)WORLD_HEIGHT / (float)height * (float)width);
    viewport.setWorldWidth(worldWidth);
    viewport.setWorldHeight(worldHeight);
    frameBuffer.begin();
    viewport.update(width, height, true); // the actual screen dimensions
    frameBuffer.end();

}

您可以在 LibGDX 中查找使用 FrameBuffer 的示例。您应该在frameBuffer.begin()和之间进行所有游戏绘图end(),然后将 frameBuffer 的颜色缓冲区绘制到屏幕上,如下所示:

stage.act();
frameBuffer.begin();
//Draw game
stage.draw();
frameBuffer.end();
spriteBatch.setProjectionMatrix(spriteBatch.getProjectionMatrix().idt());
spriteBatch.begin();
spriteBatch.draw(frameBuffer.getColorBufferTexture(), -1, 1, 2, -2);
spriteBatch.end();

就我而言,我对世界宽度和世界高度进行了更复杂的计算,使它们成为实际屏幕尺寸的整数因子。这可以防止屏幕上的大像素大小不同,这可能看起来很糟糕。或者,您可以将 FrameBuffer 纹理的过滤更改为线性,并在绘制时使用升级着色器。


推荐阅读