Slick2D游戏速度在变化

我使用Swing创建了一个游戏,它有点不可靠,所以我开始使用Slick2D游戏引擎重新制作它,我遇到了问题。

每次调用更新方法时,游戏的背景在屏幕上以一定的像素滚动。 这样可以保持加速和减速,因此背景会非常快速地移动,然后非常慢,并且会保持波动。

我已尝试*由delta(它监视刷新率,我认为!)在我的值上移动背景,但由于这不会给我一个确切的值我可以用来将背景重置到左侧(2背景移动)从右到左。左手一个向右移动-800像素)。

造成这种情况的原因是什么?如何克服它?

谢谢

这里有一些阅读(有一个特定于gamedev的StackExchange网站 ,BTW):

这些文章中最重要的一点是事物以超过一定的速度移动,而不是超过一定数量的帧。 由于帧速率可能无法预测地改变,因此基于时间和基于帧的移动不会彼此等同。

这里有一些解释……

因此,您的计算机和操作系统是multithreading的,因此,您永远不会知道应用程序外部发生了什么,以及机器上的总体负载是什么。 因此,即使您处于全屏模式,也无法独占访问CPU。 所以,这是为什么事情加速和减速的一个因素。

Delta在Slick2D中的用途是允许您处理此加速/减速,并允许您的应用程序动态更改其帧速率,以便屏幕上的感知移动不会因您的计算机负载而发生变化。 delta 不是监视器的刷新率(不变); delta是自上次调用update以来经过的毫秒数。

那你如何正确使用这个三角洲呢? 假设你的背景应该以100px / sec的速度移动。 如果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像素。 子像素移动对于平滑帧速率的增加/减少也是至关重要的,因为对几个子像素移动的累积效应是,当时刻正确时,所有这些小移动加起来整个像素,并且它非常流畅,导致整体运动速度正确。

您可能会认为,由于您的屏幕将图像解析为给定像素而非子像素元素,因此如果您进行子像素移动并不重要,但如果将所有移动跟踪转换为浮点数,您将会看到你观察到的效果很大程度上消失了。