pygame的倒数计时器

时间:2013-08-02 08:41:58

标签: python pygame pacman

我之前问了一个关于多重碰撞检测的问题,但我没有创建代码来解决这个问题的技巧,而是我只是添加了第二个墙并尝试放入计时器。

我的问题是如何在我的代码中加入计时器?

它需要倒计时,当它点击00:00时显示文字:GAME OVER并结束游戏。如果有帮助的话,我会把我的代码放在主线上。如果您需要更多代码,如课程等,我很乐意发布。

while done == False:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

            #This makes the player move
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.changespeed(-6,0)
            if event.key == pygame.K_RIGHT:
                player.changespeed(6,0)
            if event.key == pygame.K_UP:
                player.changespeed(0,-6)
            if event.key == pygame.K_DOWN:
                player.changespeed(0,6)

        #This stops the player from moving
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                player.changespeed(6,0)
            if event.key == pygame.K_RIGHT:
                player.changespeed(-6,0)
            if event.key == pygame.K_UP:
                player.changespeed(0,6)
            if event.key == pygame.K_DOWN:
                player.changespeed(0,-6)

    player.updateWall(wall_list)

    window.fill(black)

    movingsprt.draw(window)
    wall_list.draw(window)

    pygame.display.flip()

    clock.tick(40)

pygame.quit()            

4 个答案:

答案 0 :(得分:2)

就像汉斯那样说,你可以使用pygame.time.set_timer()方法在经过一段特定的时间后调用一个函数。但是,就显示已经过了多少时间而言,使用其他方法可能会更好。

使用pygame.time.Clock.tick_busy_loop方法,您可以控制游戏运行的FPS数量并跟踪已经过去的时间,因为它返回自上次调用以来已经过了多少毫秒:

clock = pygame.time.Clock()
minutes = 0
seconds = 0
milliseconds = 0

while True: #game loop
    #do stuff here
    if milliseconds > 1000:
        seconds += 1
        milliseconds -= 1000
    if seconds > 60:
        minutes += 1
        seconds -= 60

    print ("{}:{}".format(minutes, seconds))

    milliseconds += clock.tick_busy_loop(60) #returns the time since the last time we called the function, and limits the frame rate to 60FPS

答案 1 :(得分:1)

您可以在一段时间后生成一个事件。请参阅:http://www.pygame.org/docs/ref/time.html#pygame.time.set_timer

使用类似于您现有代码的代码,您可以查看该事件是否为计时器事件并采取相应措施。

答案 2 :(得分:1)

你可以这样做

time = 100 #time in seconds
pygame.time.set_timer(USEREVENT+1, 1000)#1 second is 1000 milliseconds 

#everything below this line should be in your main loop
for event in pygame.event.get():
    if event.type = USEREVENT+1:
        time -= 1

if time == 0:
    print "GAME OVER"

答案 3 :(得分:0)

我不确定你是否找到了你的答案,或者就此而言,这是否有用......我也在努力为游戏添加计时器,但我也有一些问题...对于初学者,我使用以下代码取得了成功。 (我从另一个留言板上得到了这个,但我似乎无法再找到它,所以我为此时没有给予信任而道歉 - 我会在找到该网站时编辑这篇文章。)

我拿了这个代码,用来在控制台窗口中显示计数并将其修改为在屏幕上显示。

我在计时器和滴答声方面没有什么成功(出于某种原因,似乎我的程序运行无限循环......无论如何:

这就是我正在使用的:

import time
import threading
import pygame, sys
#among others....

#timer clock
global timerrun #I added this to show / hide the clock from my main screen
timerrun = 0 #just a default 

class Timer (threading.Thread):
    def __init__(self,seconds):
        self.runTime = seconds
        threading.Thread.__init__(self)
    def run(self):
        time.sleep(self.runTime)

class CountDownTimer(Timer):
    def run(self):
            counter = self.runTime
            for sec in range(self.runTime):
                global timerrun
                timerrun = 1 #set timer is running global variable - tells main loop to display clock
                global timedisp #set timedisplay as global var so it can be shared between threads
                timedisp = clockfont.render(str(counter),1,(255,255,255))
                #print str(counter)
                time.sleep(1.0)
                counter -= 1

class CountDownExec(CountDownTimer):
        def __init__(self, seconds, action):
            self.action = action
            CountDownTimer.__init__(self, seconds)
        def run (self):
            CountDownTimer.run(self)
            self.action()

def myAction():
    #print "Perform an action here... say GAME OVER!"
    global timedisp
    timedisp = clockfont.render("GAME OVER",1,(255,255,255))

c = CountDownExec(timeonclock,myAction)

一些警告: 首先,我不是100%确定所有这一切......基本上,第一部分设置了一个计时器功能。第二部分设置计时器的变量(计数和延迟......现在,为简单起见,我使用1秒增量。)

下一部分(我认为)告诉这个函数在一个新线程内部运行 - 所以它以自己的速度独立于我的主循环运行(即,它不会暂停我的游戏1秒钟)< / p>

最后一部分是当时钟达到零时我想要发生的事情......我重新设置全局timedisp变量来说“GAME OVER”

另外,我不知道这种方法对系统的影响。我不知道这是否“有效” - 我喜欢别人的意见。

在这些功能之前,我将字体定义为:

clockfont = pygame.font.SysFont("#FONT_NAME",SIZE) #font to use for timer clock

在我的主循环中,我显示结果:

if timerrun == 1:
        clockpos = (screenwidth - timedisp.get_width()) /2 #center my clock
        screen.blit(timedisp,(clockpos,100)) #put it on screen

同样,我正在使用timerrun变量,因为我希望时钟(在我的游戏中)是可选的......为了进行测试,直到你按下键盘上的“t”键才会显示时钟。 它在新线程中执行计时器:

    if event.key==K_t:
        c.start();

然后显示时钟,倒计时,完成后显示“GAME OVER”。

如果有人可以提供帮助,以下是我的问题......

我不确定是否通过全局变量传递更改文本是“正确”的方式来执行此操作..任何人都可以告诉我是否/如何使用这2个线程更新屏幕上的显示更好的方法。< / p>

我希望时间到了时发生的动作(显示“游戏结束”的部分 - 在主线程中执行某些功能(我说这是对的吗?)

例如:当时间用完时,它会运行一个比较2个玩家得分并宣布获胜者的功能。 - 如何让“线程2”(计时器)在“线程1”(游戏的其余部分)中调用函数???

最后,我正在寻找一种“重置”时钟而不重置整个程序的方法。当我再次按“t”时,我收到一个错误,你不能重新开始一个线程。任何人都可以提出如何重启我的时钟的建议吗?

非常感谢!