我之前问了一个关于多重碰撞检测的问题,但我没有创建代码来解决这个问题的技巧,而是我只是添加了第二个墙并尝试放入计时器。
我的问题是如何在我的代码中加入计时器?
它需要倒计时,当它点击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()
答案 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”时,我收到一个错误,你不能重新开始一个线程。任何人都可以提出如何重启我的时钟的建议吗?
非常感谢!
杰