当前位置: 首页 > 知识库问答 >
问题:

在Pygame中,跨不同fps值标准化游戏速度

欧阳安晏
2023-03-14

我在玩Pygame,做一些简单的游戏只是为了学习它。然而,我很难按照我想要的方式实现fps。

据我所知,fps通常设置为:

import pygame
...
clock = pygame.time.Clock()
while True:
    clock.tick(60)

然后在整个程序中,我确保每个循环/帧的写入时间为1/60秒,因此我可以,例如,使对象以我想要的速度移动。将滴答声增加到120 fps将使游戏运行过快,而降低滴答声将使游戏运行过慢。

然而,这不是我所熟悉的fps在其他游戏中的工作方式。在大多数游戏中,fps可以随您的需要而变化(通常取决于系统运行应用程序的情况),但游戏将始终以相同的速度运行(例如,在屏幕上移动100个像素将花费1秒,无论该秒中发生了多少帧)。

我能想到的让它以我想要的方式工作的唯一方法是获取每个帧的当前fps,并将其考虑到每个运动或基于时间的事件的计算中。但这似乎是不必要的复杂,我想知道我是否完全错过了pygame功能的一部分,这让我明白了。

共有3个答案

马渊
2023-03-14

虽然@monkey的答案是完整的数据转储,但您可能应该在时间查看一下pygame文档。再次计时。时钟的可选帧率参数。勾选()设置FPS的上限,而不是固定FPS;换句话说,如果你的游戏循环需要更长的时间才能完成,那么如果你假设通过该值可以确保固定的游戏速度,游戏就会延迟。它看起来像时钟。获取时间()时钟。get_raw_time()是用来获取上一个游戏循环的执行时间的工具,然后您可以根据它计算游戏元素的行为。

葛阳华
2023-03-14

您可以定义对象的速度(以像素/秒为单位),然后使用tick返回的值来了解每个对象应该移动多少。

示例

import pygame
...
player_speed = (20, 0)   # (x,y) pixels/second
...
pygame.time.Clock() = clock
elapsed = 0.
while True:
    seconds = elapsed/1000.0
    update_player(seconds)
    ...
    elapsed = clock.tick(60)

def update_player(seconds):
    player.position = (player.position[0] + int(player_speed[0]*seconds), 
                       player.position[1] + int(player_speed[1]*seconds))
杜嘉木
2023-03-14

游戏使用固定的物理时间步长,同时允许视频时间步长(fps)变化。这意味着您的update(delta)函数将被一个常量delta值调用。这保持了稳定。

这意味着在实践中,date最终可能会被调用多次,平均每次调用Draw(),这取决于时间的流逝。

有关详细信息,请参阅:Gaffer的“修复您的时间步长”

在cookbook上有一个更大的(python)示例:ConstantGataMetime

 类似资料:
  • 问题内容: 在该代码中,我使用鼠标滚轮来放大/缩小HTML5 Canvas。我找到了一些可以标准化Chrome和Firefox之间速度差异的代码。但是,Safari中的缩放处理比任何一个都快得多。 这是我目前拥有的代码: 我可以使用什么代码在Chrome v10 / 11,Firefox v4,Safari v5,Opera v11和IE9上以相同数量的鼠标滚轮滚动获得相同的“增量”值? 编辑 :

  • 我正在开发一个单人2d游戏。我用的发动机是我自己的。我很困惑如何适应不同的FPS游戏。我希望看到相同的游戏速度,而不管计算机可以处理的帧数。我的意思是,如果你的电脑足够强大,每秒可以画1000次,或者只有20帧,你的游戏速度应该是一样的。 我试图根据FPS自动更改移动参数,但似乎无法连接。 事实上,我有一些决定,但它们并不理想: 第一个是将FPS限制为30(例如),因此,即使性能不佳的计算机也可以

  • 我已经成功创建了一个系统,允许游戏对象根据时间的变化(而不是帧数的变化)移动。为了练习起见,我现在正在尝试设置FPS限制。 我遇到的问题是,游戏循环的数量是我预期的两倍。例如,如果我尝试将帧数限制为1fps,则在一秒钟内会有2帧通过-一个非常长的帧(~1秒)和一个非常短的帧(~ 15毫秒)。这可以通过输出每个游戏循环之间的时间差(毫秒)来显示-示例输出可能是993、17993、16。。。 我尝试过

  • 所以我对Python、PyGame和任何编程都是全新的。我遵循了在PyGame中制作蛇游戏的教程。现在一切都结束了,但为了给自己一个挑战,我正试图改变一下比赛。首先我想添加边界,但我真的迷路了。我试过看其他教程,但它们的图像似乎有所不同。这是我的代码(因为我不知道什么可以帮助你帮助我,所以我把它全部发送了): 基本上,我希望当我的蛇撞到边界时发生的事情和它撞到自己时发生的事情是一样的。如果你能帮助

  • 我想在我的游戏中添加秒表。我计划修改此代码并添加到我的pygame中: 我是否应该在def init部分中添加一个计时器框,并为计时器代码创建一个新的def?我想让计时器不使用代码,因为我的游戏正在运行时钟。勾选(60),使其不会影响勾选 更新后,我的游戏代码如下:

  • 卡洛斯·巴罗斯 编辑:也许我应该这么说,但这个游戏是一个类似反击或英雄联盟的游戏,我没有做这个游戏。