Python的游戏定时器(线程?)(Python Game Timer (Threads?))

2019-10-21 09:17发布

我设计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%肯定。 有人可以帮我解释的妥善解决是什么?

Answer 1:

如果您使用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。



Answer 2:

如果您使用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或其他同步对象来保护它。 等等。



文章来源: Python Game Timer (Threads?)