【问题标题】:Slick2D game speed changingSlick2D 游戏速度变化
【发布时间】:2011-10-27 22:51:40
【问题描述】:

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

每次调用 update 方法时,游戏的背景都会在屏幕上滚动大约 1 个像素。这不断加速和减速,所以背景会移动得非常快,然后非常慢,并不断波动。

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

这是什么原因造成的,我该如何克服?

谢谢

【问题讨论】:

  • 基于系统时钟的背景运动怎么样?

标签: java performance game-engine slick2d


【解决方案1】:

这里有一些读物(有一个gamedev-specific StackExchange site,顺便说一句):

这些文章中最重要的一点是,事物会随着时间的推移以一定的速率移动,而不是超过一定数量的帧。由于帧速率可能会发生不可预测的变化,因此基于时间的移动和基于帧的移动最终并不等同。

这里有一些解释......

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

Slick2D 中 delta 的目的是允许您处理这种加速/减速,并允许您的应用动态更改其帧速率,以便屏幕上的感知移动不会由于机器上的负载而发生变化。增量不是显示器的刷新率(它是恒定的);增量是自上次调用 update 以来经过的毫秒数。

那么如何正确使用这个增量呢?假设您的背景应该以 100 像素/秒的速度移动。如果增量(在给定的 update 调用中)为 33 毫秒,那么您应该在此更新中移动背景的量为 100*(33/1000.0) = 0.033 - 所以您将将背景移动 0.033 像素。这可能看起来很奇怪,您可能想知道移动

首先,您必须将其除以 1000.0 而不是 1000,是因为您希望通过 delta 的移动为您提供一个浮点数。

您会注意到 Slick2D 中的 2D 图形内容使用浮点值来跟踪事物的位置。这是因为如果 delta 告诉您将某物移动 0.033 像素,则您需要将其移动 0.033:不是 0,也不是 1 像素。亚像素运动对于平滑帧速率的增加/减少也很关键,因为几个亚像素运动的累积效应是,当时机合适时,所有这些小运动加起来就是一个完整的像素,并且它非常平滑,从而产生正确的整体移动速率。

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

【讨论】:

  • 对不起,原始答案的语法很差。我已经清理了很多。
  • 我非常感谢您提供这些信息!很容易理解。而且我没有注意到任何语法错误,所以不用担心!当我说刷新率时,我的意思是最后一次调用 Update() 时,我只是不知道如何表达它。谢谢百万人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多