我使用 Swing 创建了一个游戏,它有点不可靠,所以我开始使用 Slick2D 游戏引擎重新制作它,但遇到了问题。
每次调用更新方法时,游戏的背景都会在屏幕上滚动大约 1 个像素。这不断加速和减速,所以背景会移动得非常快,然后非常慢,并不断波动。
我已经尝试 * by delta (我认为它监视刷新率!)在我的值上移动背景,但是因为这不会给我一个确切的值,我可以用它来将背景重置到左侧(2个背景移动从右到左。左手在-800像素处向右)。
是什么原因造成的,我该如何克服?
谢谢
我使用 Swing 创建了一个游戏,它有点不可靠,所以我开始使用 Slick2D 游戏引擎重新制作它,但遇到了问题。
每次调用更新方法时,游戏的背景都会在屏幕上滚动大约 1 个像素。这不断加速和减速,所以背景会移动得非常快,然后非常慢,并不断波动。
我已经尝试 * by delta (我认为它监视刷新率!)在我的值上移动背景,但是因为这不会给我一个确切的值,我可以用它来将背景重置到左侧(2个背景移动从右到左。左手在-800像素处向右)。
是什么原因造成的,我该如何克服?
谢谢
这是给你的一些读物(有一个特定于游戏开发的 StackExchange 站点,顺便说一句):
这些文章中最重要的一点是事物随着时间的推移以一定的速度移动,而不是超过一定数量的帧。由于帧速率可能会发生不可预测的变化,因此基于时间和基于帧的移动最终不会彼此等同。
这里有一些解释......
因此,您的计算机和操作系统是多线程的,因此,您永远无法知道应用程序之外发生了什么,以及机器上的总体负载是多少。因此,即使您处于全屏模式,您也无法独占访问 CPU。所以,这是事情加速和减速的一个因素。
Slick2D 中 delta 的目的是允许您处理这种加速/减速,并允许您的应用程序动态更改其帧速率,以便屏幕上的感知运动不会因机器负载而改变。增量不是显示器的刷新率(它是恒定的);delta 是自上次调用以来经过的毫秒数update
。
那么如何正确使用这个增量呢?假设您的背景应该以 100 像素/秒的速度移动。如果 delta(在给定的调用中update
)是 33 毫秒,那么您应该在此更新中移动背景的量是100*(33/1000.0) = 0.033
- 所以您将背景移动 0.033 像素。这可能看起来很奇怪,您可能想知道移动 <1 像素的意义何在,但请坚持下去。
首先,您必须将其除以 1000.0 而不是 1000 的原因是因为您希望delta 的移动给您一个浮点数。
您会注意到 Slick2D 中的 2D 图形内容使用浮点值来跟踪事物的位置。这是因为如果 delta 告诉您将某物移动 0.033 像素,则您需要将其移动 0.033:不是 0,也不是 1 像素。亚像素运动对于平滑帧速率的增加/减少也很重要,因为几个亚像素运动的累积效应是,当时机合适时,所有这些小运动加起来就是一个完整的像素,并且它非常平滑,从而产生正确的整体运动速率。
您可能会认为,由于您的屏幕将图像解析为给定的像素,而不是子像素元素,因此您是否进行子像素移动并不重要,但是如果您将所有移动跟踪转换为浮点数,您将看到你观察到的效果在很大程度上消失了。