python - 如何实现 Pygame 定时游戏循环?
问题描述
我希望使用 Python 编写一个更好的游戏循环pygame.time.Clock()
,并且我理解保持时间和从主游戏循环中解耦渲染以更好地利用滴答声的概念。我也了解将时间延迟传递给渲染,以便渲染正确的运动量,但我发现的唯一示例是用 C# 编写的,虽然我最初认为转换为 Python 相当简单,但它并没有表现出来。
我发现 Pygame 已经计算出Clock()
最后 2 次调用 .tick 之间的毫秒数,并且我尝试调整我找到的示例代码,但我真的需要查看一个用 Python 编写的工作示例。到目前为止,这是我想出的:
FPS = 60
MS_PER_UPDATE = 1000 / FPS
lag = 0.0
clock = pygame.time.Clock()
running = True
# Do an initial tick so the loop has 2 previous ticks.
clock.tick(FPS)
while running:
clock.tick(FPS)
lag += clock.get_time()
user_input()
while lag >= MS_PER_UPDATE:
update()
lag -= MS_PER_UPDATE
render(lag / MS_PER_UPDATE)
我不确定这在 Pygame 中是否值得,或者它是否已经在它的某些time
功能中得到了照顾?我的游戏在笔记本电脑上运行速度较慢(预期),但我认为这样做可能会通过解耦渲染来平衡我的主 PC 和笔记本电脑之间的 FPS。有没有人有在 Pygame 中做这些高级游戏循环的经验?我只是希望它尽可能好......
解决方案
只需花时间渲染最后一帧(称为增量时间)并将其传递给您的游戏对象,以便他们决定要做什么(例如移动更多或更少)。
这是一个超级简单的例子:
import pygame
class Actor(pygame.sprite.Sprite):
def __init__(self, *args):
super().__init__(*args)
self.image = pygame.Surface((32, 32))
self.rect = pygame.display.get_surface().get_rect()
self.image.fill(pygame.Color('dodgerblue'))
def update(self, events, dt):
self.rect.move_ip((1 * dt / 5, 2 * dt / 5))
if self.rect.x > 500: self.rect.x = 0
if self.rect.y > 500: self.rect.y = 0
def main():
pygame.init()
screen = pygame.display.set_mode((500, 500))
sprites = pygame.sprite.Group()
Actor(sprites)
clock = pygame.time.Clock()
dt = 0
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
sprites.update(events, dt)
screen.fill((30, 30, 30))
sprites.draw(screen)
pygame.display.update()
dt = clock.tick(60)
if __name__ == '__main__':
main()
如果您的游戏速度低于 60(或其他)FPS,dt
变得更大,并且Actor
移动更多以弥补失去的时间。
推荐阅读
- android-layout - Android Studio 中的设计和输出完全不同
- python - 使用 curl 分批下载大文件的 Python 脚本
- php - PHP日期函数错误地转换给定日期
- maven - 当我运行 springboot 应用程序时,它总是从错误的路径加载属性
- swift - 将元素添加到 Firestore 数组时获取“类型‘FieldValue’没有成员‘arrayUnion’”
- javafx - JavaFX TableView 列排序有三种状态,为什么?
- c - 如何用c中的复数参数进行计算?
- java - 使用 positionList 压缩连续数字
- android - 如何使用切换摄像头在分区中录制视频并在android中录制后合并
- javascript - 活动类重置回原始状态