对PyGame中的时间和时间测量工作有一个主要的误解。您可以使用pygame.time.Clock(),但采用完全不同的方式。
注意:这里所有的代码示例都是Python 3.4;如果您仍然使用Python 2.x并且使用代码时遇到问题,请随时询问。
的一些基本知识
你的脚本运行尽可能地快,所以基本上与您的操作系统的每一个滴答,你拥有了它处理一次,这是根据计算机的CPU每秒某处大约100倍。
现在出现第二个问题:Clock()是Pygame模块“时间”中的一个类,它本身没有任何价值。如果你让你的程序打印“mainclock”,yield将是:它永远不会等于0,因此你的if语句永远不会产生True,因此永远不会被处理(所以绝不会把1加到“score”)。
你了解这部分?如果没有,请随时提出进一步的问题!这些是你必须理解的一些非常基础的东西,以便基本上使用任何编程语言(至少是面向对象的)。
如何解决您的问题
您需要pygame.time.Clock()为了解决您的问题,但在比你做了什么不同的方式。定义一个变量为您的游戏的时钟,就像你用“mainclock”确实已经:
mainclock = pygame.time.Clock()
时钟()类有一个方法“.tick()”。此方法测量自上次打勾后的时间。试一试:将您的代码更改为此并查看它打印的内容!
while True:
print(mainclock.tick())
或者在Python 2.x的: 而真: 打印mainclock.tick()
您将收到每个脚本已被处理时间的值(这就是所谓的 “嘀”)。在我的电脑这个打印了几个数字:
>>>
0
35
1
2
2
1
1
1
2
等等
这是毫秒,因为脚本已经处理的最后时间。这意味着:当1000毫秒的时间过去了,整整一秒钟过去了。现在将其用于我们的目的,我们只需将它们添加在一起即可!
mainclock = pygame.time.Clock()
tick_count = 0
score = 0
while True:
tick_count += mainclock.tick()
if tick_count >= 1000:
score += 1
tick_count = 0
print(score)
另一种方法是限制帧速率。这可以通过在Clock()的“.tick()”方法中添加数字值来完成。
while True
mainclock.tick(60)
这将导致你的脚本运行从来没有超过60次第二快(建议:使你的脚本打印mainclock.tick(60),看看它产生!)。现在,我们可以做两件事情:要么我们采取这一事实,并除以60一秒或我们仍然测量时间,我们以前那样:
方法之一 - 测量时间为前
mainclock = pygame.time.Clock()
tick_count = 0
score = 0
while True:
tick_count += mainclock.tick(60)
if tick_count >= 1000:
score += 1
tick_count = 0
print(score)
你看,这里没有重大改变。我们只是简单地告诉剧本,每秒不会超过60次,其余的则保持不变。如果您打印“mainclock.tick(60)”,您现在将在每个循环中接收16或17个值,因为它会在两个滴答声之间等待这段时间,以确保它不会每秒运行60次以上。
方法二 - 除以秒...
因为我们告诉程序不运行速度比第二快60倍,这也意味着一个刻度为1/60秒。我们也可以这样做:
mainclock = pygame.time.Clock()
tick_count = 0
score = 0
while True:
tick_count += 1/60 # NOTE: in Python 2.x this has to be: 1.0/60 or 1/60.0!
if tick_count >= 1:
tick_count = 0
score += 1
print(score)
或者:
mainclock = pygame.time.Clock()
tick_count = 1
score = 0
while True:
tick_count -= 1/60.0
if tick_count <= 0:
tick_count = 1
score += 1
print(score)
希望,这有助于!否则,请随时多问。
虽然不是对您的问题的直接回答,但您可能想重新思考如何处理时间。有两种常用方法:1.恒定的帧长度。 2.可变的帧长。在第一种方法中,您将每个帧视为一秒的X分数(通常为60),因此每次只需添加值/ X。在第二种方法中,您将时间增量传递给它并将其乘以每秒的值。 – user3820547 2014-12-03 07:55:26