2013-02-24 39 views
5

所以,我有一个问题,我没有完全理解需要给定时器命令的事件,它并没有说在任何地方在线,我在哪里搜索了几个小时。所以我只是使用了大多数人似乎在使用'USEREVENT + 1'。我不确定它是否正确,但我的计时器不工作。我是否正确使用它?这里是我的代码:pygame.time.set_timer混淆?

nyansecond=462346 
nyanint=0 
spin=0 
aftin=452345 

def nyanmusic(nyansecond,nyanint,spin): 
    if nyanint == 0: 
     nyansound.play() 
     nyanint= 1 
    elif nyanint == 1: 
     nyansecond = pygame.time.set_timer(USEREVENT+1,7000) 
    if nyansecond < 200 and spin == 1: 
     spin = 0 
     nyansecond = pygame.time.set_timer(USEREVENT+1,7000) 
    elif nyansecond > 6500 and nyansecond < 100000 and spin == 0: 
     spin = 1 
     nyansoundm.play() 

    return nyansecond,nyanint,spin 

然后我将它在我实现的第二页(它工作正常)中定义为我的代码。它运行nyansound,但在6.5秒(6500毫秒)后不运行nyansoundm。我正在制作这个程序来帮助我学习python和pygame的基础知识,然后再转向更复杂的东西。当我想要听尼安猫或其他循环歌曲时,我也可以使用它,而无需在YouTube上播放并浪费宝贵的带宽。不过,不要担心。

哦,这里是我已经把我的循环的代码,但我不认为这都不算什么:

#music 
     nyansecond,nyanint,spin = nyanmusic(nyansecond,nyanint,spin) 

回答

8

让我们回顾一下什么pygame.time.set_timer做:

pygame.time .set_timer(eventid,毫秒):return无

将事件类型设置为在给定的毫秒数内出现在事件队列中。第一个事件直到时间过去才会出现。
每种事件类型都可以有一个单独的计时器连接到它。最好使用pygame.USEREVENT和pygame.NUMEVENTS之间的值。

pygame.USEREVENTpygame.NUMEVENTS是常数(2432),所以传递给pygame.time.set_timer参数eventid2432之间的任何整数。

pygame.USEREVENT+125,所以很好用。

当您拨打pygame.time.set_timer(USEREVENT+1,7000)时,带有事件ID 25的事件将每7000毫秒出现在事件队列中。你没有显示你的事件处理代码,但我想你不检查这个事件,你应该这样做。

正如你所看到的,pygame.time.set_timer回报None,让你的行

nyansecond = pygame.time.set_timer(USEREVENT+1,7000) 

没有意义,因为nyansecond永远是None,因此它比较对一个整数

if nyansecond < 200 ... 

是无意义。


如果你想玩使用事件队列中的每个6.5秒声音,通话的simpy一次pygame.time.set_timer(!):

PLAYSOUNDEVENT = USEREVENT + 1 
... 
pygame.time.set_timer(PLAYSOUNDEVENT, 6500) 

,并检查该事件的事件队列在主循环:

while whatever: # main loop 
    ... 
    # event handling 
    if pygame.event.get(PLAYSOUNDEVENT): # check event queue contains PLAYSOUNDEVENT 
     nyansoundm.play() # play the sound 
+0

谢谢!这完全奏效。我完全误解了计时器:D。对不起,我不使用事件D :.不幸的是,我遇到了一个新问题。我的循环有时候,因为我在一台相当慢的PC上,不会在定时器耗尽的同时运行'pygame.event.get(PLAYSOUNDEVENT)'并导致事件发生。有没有办法解决这个问题,或者这是一个无法解决的问题? – Bluetiger6001 2013-02-24 22:06:21

+0

好的,我把它作为我的答案,我会赞成它,但我刚刚加入该网站,并没有足够的声誉。当我得到足够的时候,我会挑战你的回答。谢谢:) – Bluetiger6001 2013-02-24 22:20:54

+0

Upvoted :)谢谢你的好回答 – Bluetiger6001 2013-02-25 20:46:26