【问题标题】:pygame.time.set_timer confusion?pygame.time.set_timer 混乱?
【发布时间】:2013-02-24 20:43:26
【问题描述】:

所以,我有一个问题,无论如何我并不完全理解需要提供给计时器命令的事件,它没有说在线任何地方,我搜索了几个小时。所以我只是使用了大多数人似乎使用的'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

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

哦,这是我放入循环中的代码,尽管我认为这并不重要:

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

【问题讨论】:

    标签: python timer pygame clock timing


    【解决方案1】:

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

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

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

    pygame.USEREVENTpygame.NUMEVENTS 是常量(2432),因此您传递给 pygame.time.set_timer 的参数 eventid 应该是介于 2432 之间的任何整数。

    pygame.USEREVENT+125,所以可以用。

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

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

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

    没有意义,因为nyansecond 将始终是None,因此将其与整数进行比较

    if nyansecond < 200 ...
    

    毫无意义。


    如果您想使用事件队列每 6.5 秒播放一次声音,只需调用 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
    

    【讨论】:

    • pygame 事件 id 是否绑定到 32?这意味着您一次不能有超过 32 个计时器(比如 100 个对象,每个对象都有自己的计时器和做某事的节奏)?
    • @ateymuri 是的,你不能只使用随机数。否则,您将收到如下异常:ValueError: Event id must be between NOEVENT(0) and NUMEVENTS(32)。如果您有很多游戏对象,最好只查看系统时间或经过的滴答声,而不是创建一堆事件。
    • 为什么pygame会限制自定义事件的数量?我真的很好奇。
    猜你喜欢
    • 2012-02-06
    • 2010-12-04
    • 2011-05-05
    • 2018-05-30
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多