我正在使用SDL进行2D游戏。一直困扰着我的是,当相机移动缓慢时,所有物体相互抖动。
这是因为SDL不支持子像素定位,我必须使用整数来在屏幕上定位。
这是问题的一个简单示例,如果它还不明显的话。假设我有一个侧滚动游戏,其中每个实体只有一个x位置:
实体职位:
friend.x = 0.1
foe.x = 0.3
呈现的内容:
friend.x = 0
foe.x = 0
现在让我们说相机由0.2
向左移动:
实体职位:
friend.x = 0.1 + 0.2 = 0.3
foe.x = 0.3 + 0.2 = 0.5
呈现的内容:
friend.x = 0
foe.x = 1
在那里,它摇摇欲坠。两者都应该移动到最低限度,但所呈现的是friend
根本没有移动,foe
向右跳跃整个像素。当相机向左移动另一个0.2
时,friend
将执行跳转,foe
将保持不动。不幸的是,它在低速练习中实际上非常明显。
缓解这种情况的最简单方法似乎是在内部处理整数位置,但我无法真正理解为我的游戏工作,只是不能很好地运用物理学。我在绝望中尝试了各种舍入方法,但这似乎并没有在实践中改变任何东西。四舍五入时仍然总是这个跳跃点。
那么,有什么办法可以减少摇晃吗?假设我在两个浮点位置都停留在渲染时必须使用整数?
答案 0 :(得分:2)
SDL不应该受到指责 - 监控不支持子像素位置,因为,嘿,像素定义。在极少数情况下,您可以单独使用像素组件(点),但这需要了解实际显示器(不同显示器的不同颜色顺序,如RGB,BGR,垂直RGB等);这是亚像素字体抗锯齿的工作原理。但是字体只是一种颜色,在实际图像上它会产生疯狂的结果。
我看到的只有适当的解决方案是提高分辨率。无论是显示器的分辨率,还是将图像渲染到更高分辨率的渲染目标,然后通过一些过滤将其下采样回到监视器分辨率。