【问题标题】:Pygame set_timer() not working?Pygame set_timer() 不工作?
【发布时间】:2016-02-11 00:59:22
【问题描述】:

我正在 pygame 中创建一个游戏,它需要不断地发送一波又一波的敌人。我的波发送代码在单独使用一次时完美运行,但是当我尝试使用 set_timer() 重复它时,没有任何反应。

必要代码:

def game():

    WAVE_EVENT = USEREVENT + 1

    pygame.time.set_timer(WAVE_EVENT, 1000)

for event in pygame.event.get():
    if pygame.event.get(WAVE_EVENT):
        wave1()
        print 'Wave1 sent'

结果?什么都没有。我的播放器只是坐在屏幕中间,看起来很无聊。

如何让 set_timer 事件真正起作用?

【问题讨论】:

    标签: python python-2.7 timer pygame


    【解决方案1】:

    您的事件循环代码不正确。当您调用pygame.event.get()(不带参数)时,您将获得当前在事件队列中的所有 事件,包括计时器驱动的WAVE_EVENTs。您的第二次调用尝试仅获取 WAVE_EVENTs,但由于它们已被第一次调用收集,因此队列中不会有任何剩余。

    一般来说,处理这个问题的方法是在迭代每个事件时检查它们的类型:

    for event in pygame.event.get(): # gets all events, loops over them
        if event.type == WAVE_EVENT:
            wave1()
            print 'Wave1 sent'
    

    您通常还需要检查其他事件类型(例如当用户尝试关闭您的窗口时生成的QUIT 事件)。对于具有几种不同事件类型的简单代码,您可能只使用elif 语句,但对于复杂的东西,您可能希望使用字典将事件类型映射到处理函数。

    另一种解决方案是分别请求您需要处理的每种类型的事件,而不是请求所有事件类型:

    if pygame.event.get(WAVE_EVENT):
        wave1()
        print 'Wave1 sent'
    
    if pygame.event.get(pygame.event.QUIT):
        # ...
    
    for key_event in pygame.event.get(pygame.event.KEYDOWN):
        # ...
    

    后一种形式很适合分离出使用不同事件的代码的不同部分,但如果您不请求所有正在排队的事件类型,它可能会导致问题。您可能需要使用一些过滤功能(例如pygame.event.set_allowed)来确保您的事件队列不会填满您没有检查的事件。

    【讨论】:

    • 对不起,我在问题中写的代码不正确,我忘记添加事件了。它似乎仍然不起作用。
    • 咦,奇怪的事情发生了。我重新启动了 PyCharm,现在它可以工作了,但是敌人不会出现。除此之外,它就像一个魅力;)谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    相关资源
    最近更新 更多