我设计Python中的游戏,想知道如何使可沿一侧我的游戏运行高效的计时器。
注:我使用pygame的。
我现在有像这样一个计时器:
import time
seconds = 60
def start_timer():
global seconds
while seconds > 0:
print seconds
seconds -= 1
time.sleep(1)
然而,在我的主要游戏功能运行时,我的游戏挂起,因为的timer.sleep
。
def main(self):
Timer.start_timer()
我敢肯定我的问题有事情做与不使用线程,虽然我不是100%肯定。 有人可以帮我解释的妥善解决是什么?
如果您使用pygame的,它有自己的时间的功能 ,你应该使用。
如果您使用的是事件循环或混合设计,在这里你遍历pygame.event.get()
或类似的,并呼吁“事件处理程序”对不同的事件,如鼠标点击或键下,你可以使用set_timer
创建将触发每一秒的事件。 例如:
TIMER1_EVENT = pygame.USEREVENT + 1
def start_timer1():
global seconds
seconds = 60
pygame.time.set_timer(TIMER1_EVENT, 1000)
def on_timer1():
global seconds
print seconds
seconds -= 1
if seconds < 0:
pygame.time.set_timer(TIMER1_EVENT, 0)
# elsewhere, inside your main event loop
elif event.type == TIMER1_EVENT:
on_timer1()
有在文档中的每个功能链接很简单的例子程序; 如果你看的例子set_timer
你会看到它是多么容易使用。
如果您使用的是纯帧循环相反,你大概已经呼吁Clock.tick
或相似的,你将不得不使用从返回值自上次倒计时毫秒,并决定是否你” VE过去了秒另一整数,当你传入0。
如果您使用pygame的,或者一些其他的图形库,并建立围绕一个事件循环或帧速率的循环游戏,你要使用随该库中的函数。 如果你有一个事件循环,你可以问它来安排一个事件在60秒内射击。 如果你有一个帧速率循环,你可能能够做同样的事情,还是需要检查一次剩余时间/帧。
但是,如果你不这样做,那么是的,线程是答案。
对于简单的定时器,最简单的解决方案是Timer
类。 然而,这并不会自动做重复计时器,所以你必须手动添加。 例如,你可以开始一个1秒钟的定时器,并有到期时就开始另一个1秒计时器:
def start_timer():
global seconds
if seconds > 0:
print seconds
seconds -= 1
threading.Timer(1, start_timer).start()
seconds = 60
threading.Timer(1, start_timer).start()
然而,它通常是一个更容易使用,它知道如何为你做重复的计时器。 你可以建立一个自己的(注意, threading
文档包含一个链接到源 ,它不是很难搞清楚如何添加逻辑,使得它每开火interval
为秒count
的时间,而不是只一次)。 或者你可以去搜索的PyPI找到数十人谁已经实施了你。
也请记住,一旦你使用线程,你必须处理线程的问题。 如果您使用的是GUI库,他们往往不会让你调用从后台线程GUI的方法。 如果你即可存取两个线程之间共享的变量,你通常需要一个Lock
或其他同步对象来保护它。 等等。