pygame.time.set_timer混乱?

Blu*_*001 6 python pygame timer timing clock

所以,我有一个问题,我不完全理解需要给定时器命令的事件,它不会说在网上任何地方,我搜索了几个小时.所以我只是使用了大多数人似乎使用的'USEREVENT + 1'.我不确定它是否正确,但我的计时器无法正常工作.我正确使用它吗?这是我的代码:

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
Run Code Online (Sandbox Code Playgroud)

然后我在我实现的第二页上将其定义为我的代码(工作正常).它运行nyansound,但在6.5秒(6500毫秒)后不运行nyansoundm.我正在制作这个程序,以帮助我学习python和pygame的基础知识,然后继续学习更复杂的东西.当我想听nyan cat或其他环状歌曲而不必去youtube并浪费宝贵的带宽时,我也可以使用它.不过不要担心.

哦,这是我放入循环的代码,虽然我不认为这太重要了:

#music
        nyansecond,nyanint,spin = nyanmusic(nyansecond,nyanint,spin)
Run Code Online (Sandbox Code Playgroud)

slo*_*oth 13

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

pygame.time.set_timer(eventid,milliseconds):返回None

将事件类型设置为每隔给定的毫秒数显示在事件队列中.第一个事件将在经过一段时间后才会出现.
每种事件类型都可以附加一个单独的计时器.最好使用pygame.USEREVENT和pygame.NUMEVENTS之间的值.

pygame.USEREVENT并且pygame.NUMEVENTS是常量(2432),因此eventid传递给的参数pygame.time.set_timer应该是24和之间的任何整数32.

pygame.USEREVENT+1是的25,所以使用起来很好.

当您调用时pygame.time.set_timer(USEREVENT+1,7000),带有eventid的事件25将每7000毫秒出现在事件队列中.您没有显示您的事件处理代码,但我猜您不会检查此事件,您应该这样做.

如你所见,pygame.time.set_timer返回None,所以你的线

nyansecond = pygame.time.set_timer(USEREVENT+1,7000)
Run Code Online (Sandbox Code Playgroud)

没有意义,因为nyansecond永远都是None,因此将它与整数进行比较

if nyansecond < 200 ...
Run Code Online (Sandbox Code Playgroud)

毫无意义.


如果您想使用事件队列每6.5秒播放一次声音,请简单地调用pygame.time.set_timer一次(!):

PLAYSOUNDEVENT = USEREVENT + 1
...
pygame.time.set_timer(PLAYSOUNDEVENT, 6500)
Run Code Online (Sandbox Code Playgroud)

并在主循环中检查此事件的事件队列:

while whatever: # main loop
    ...
    # event handling
    if pygame.event.get(PLAYSOUNDEVENT): # check event queue contains PLAYSOUNDEVENT 
        nyansoundm.play() # play the sound
Run Code Online (Sandbox Code Playgroud)

  • @ateymuri 是的,你不能只使用随机数。否则,您将收到类似以下的异常:“ValueError:事件 id 必须介于 NOEVENT(0) 和 NUMEVENTS(32) 之间”。如果您有很多游戏对象,最好只查看系统时间或经过的时间间隔,而不是创建一堆事件。 (2认同)
  • 为什么pygame限制自定义事件的数量?我对此很好奇。 (2认同)