camera - libGDX 中的视差效果抖动
问题描述
基本上我使用这个 ParallaxCamera 类在我的游戏中创建效果,但是在移动时,图层“摆动”。当相机缓慢移动时,这一点尤其明显。
我已经固定了时间步长并使用了插值平滑。我使用放大的像素艺术。相机以玩家为中心,在移动后更新。禁用该效果可使相机平滑移动。
我猜问题可能是:
这些层以不同的速度移动,这意味着它们在不同的时间移动
四舍五入显示使图层在移动相机时每帧的位置略有不同
谢谢你的帮助
解决方案
对于低分辨率像素艺术,这是我使用的策略。我以 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 纹理的过滤更改为线性,并在绘制时使用升级着色器。
推荐阅读
- go - 为什么通过 go 插件调用函数比直接调用函数更快
- amazon-web-services - 监控在 NewRelic 中执行的 lambda
- javascript - 带有包含方法的 Javascript switch 语句
- javascript - KotlinJs:如何在 kotlin 中编写 HandleBarJS
- opendds - DDS Java 示例引发大量警告“在未检查异常的情况下进行 JNI 调用”
- python - Pandas:一列键和值字典的堆积条形图
- c# - 有没有办法在 blazor inputtext 中动态进行双向绑定
- java - VScode 中的 Java 输出
- r - 过滤不适用于 seq() data.table 上的索引
- c# - ASP.Net - 无法从委托事件更改标签文本