如何在pygame中使用time.sleep?

6

我想展示一张图片,等待1秒钟,然后再展示另一张图片。我正在做一个匹配游戏,在我的代码中,如果两个图像不匹配,我想将图像更改为预设的通用图像。因此,我的代码如下:

if True:
    self.content = self.image
    time.sleep(1)
    self.content = Tile.cover

self.content是指正在显示的变量,self.image是显示的图像,Tile.cover是覆盖另一个图像的通用图像。但是每当我这样做时,代码都会跳过第一行,只将图像设置为Tile.cover,为什么?


1
也许你需要在 time.sleep(1) 之前重新绘制? - El'endia Starman
1
self的类型是什么?你能给我们更多的细节/代码吗? 如前评论所述,这可能与您必须更新显示有关。您可能有类似于“pygame.display.update()”的东西。您可以使用调试器精确定位Tile.cover打印的时间(哪一行)。 - Rbtnk
sleep() 停止程序中的所有函数,因此不建议使用它。解决方案需要进行更多的修改。 - furas
请看示例 - http://stackoverflow.com/a/33935509/1832058 - furas
1个回答

7

2019年3月18日更新。

在Pygame中,你需要使用pygame.time.wait()代替Python的time.sleep()

它接受以毫秒为单位的时间:

pygame.time.wait(1000)

不使用time.sleep的原因是它会阻塞pygame的事件循环,导致pygame无法处理其他事件。
>>> import time
>>> 
>>> def foo():
        print "before sleep"
        time.sleep(1)
        print "after sleep"
>>> 
>>> # Now call foo()
>>> foo()

你注意到输出过程中发生了什么吗?
>>> # Output on calling foo()
... # Pause for 1 second
... 'before sleep'
... 'after sleep'

你的代码也是这样运行的。首先它会睡眠,然后同时更新self.contentself.imageTime.cover

修复:

要修复上面示例中的代码,可以使用sys.stdout.flush()

>>> def foo():
        print "before sleep"
        sys.stdout.flush()
        time.sleep(1)
        sys.stdout.flush()
        print "after sleep"

>>> foo()
... 'before sleep'
... # pause for 1 second
... 'after sleep'

免责声明:

我没有在Pygame中尝试过sys.stdout.flush(),因此无法确定它是否适用于您,但您可以尝试一下。

这个SO问题似乎有一个可行的解决方案:如何在Pygame中等待一段时间?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接