libGDX 中的视差效果抖动

Parallax effect jitter in libGDX

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

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

我猜问题可能是:

感谢您的帮助

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

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

中改变

当您在 resize 中的视口上调用 update 时,您需要在要绘制到的 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 的纹理过滤更改为线性,并在绘制时使用放大着色器。