计时器和用户事件 (PyGame) [复制]

Timers and user events (PyGame) [duplicate]

提问人:Trevn Jones 提问时间:8/30/2023 更新时间:8/30/2023 访问量:42

问:

我的游戏本质上是飞扬的鸟,但有敌人、弹药(山羊胡子),还有苍蝇而不是襟翼(这部分不是必需的)。我试图弄清楚如何生成管道、山羊胡子(供玩家收集的弹药)以及敌人。我刚刚了解了今天的事情,我用我的管道设置了它,它工作得很好!直到我创建了山羊胡子计时器,然后很快发现它不会设置 2 个单独的计时器。在查看了PyGames文档后,我发现了这一点 -pygame.time.set_timer()

还值得一提的是,特定事件类型只能放在计时器上一次。换言之,同一事件类型不能有两个计时器。为特定事件设置事件计时器会丢弃该事件类型的旧计时器。

我环顾四周,一直找不到解决这个问题的方法。有没有办法创建另一种事件类型?我应该使用计时器的其他方式吗?下面列出的代码显示了我如何创建它们:

创建计时器:

    SPAWNPIPE = pygame.USEREVENT
    pygame.time.set_timer(SPAWNPIPE, 3000)

    SPAWNGOATEE = pygame.USEREVENT
    pygame.time.set_timer(SPAWNGOATEE, 6000)

while 循环中的事件处理:

#All game events
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit()
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE and not time_started:
            is_playing = True
            time_started = True
            start_time = time.time()
    if event.type == SPAWNPIPE:
        spawn_pipe = True
    if event.type == SPAWNGOATEE:
        spawn_goatee = True

尽管管道计时器设置为 3000 毫秒,但它们的生成时间为 6000 毫秒,因为 USEREVENT 只能用于一个计时器,因此创建的第二个计时器将覆盖第一个计时器

python 事件 计时器 pygame

评论

0赞 Luke B 8/30/2023
这回答了你的问题吗?Pygame- 创建更多 USEREVENT 类型事件的方法?
0赞 Rabbid76 8/30/2023
SPAWNGOATEE = pygame.USEREVENT + 1

答:

0赞 not a tshirt 8/30/2023 #1

一些关于创建自定义事件的谷歌搜索让我找到了以下 SO 问题,PyGame 自定义事件,以及以下 pygame 文档、https://pyga.me/docs/ref/event.html#pygame.event.Eventhttps://pyga.me/docs/ref/event.html#pygame.event.custom_type

在编写了一个快速脚本来测试这一点(在下面复制/粘贴)后,它似乎可以完美地工作。不要使用相同的事件类型,而是使用pygame.event.custom_type()

import pygame

RED = (200, 100, 100)
GREEN = (100, 200, 100)
BLUE = (100, 100, 200)

screen = pygame.display.set_mode((600, 400))

screen.fill((255, 255, 255))
pygame.display.flip()

REDEVENT = pygame.event.custom_type()
GREENEVENT = pygame.event.custom_type()
BLUEEVENT = pygame.event.custom_type()

pygame.time.set_timer(REDEVENT, 1000)
pygame.time.set_timer(GREENEVENT, 1100)
pygame.time.set_timer(BLUEEVENT, 1200)

running = True
while running:
    pygame.time.wait(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            break
        if event.type == REDEVENT:
            screen.fill(RED)
            pygame.display.flip()
            continue
        if event.type == GREENEVENT:
            screen.fill(GREEN)
            pygame.display.flip()
            continue
        if event.type == BLUEEVENT:
            screen.fill(BLUE)
            pygame.display.flip()
            continue

这意味着,在创建事件时,您应该使用

    SPAWNPIPE = pygame.event.custom_type()
    pygame.time.set_timer(SPAWNPIPE, 3000)

    SPAWNGOATEE = pygame.event.custom_type()
    pygame.time.set_timer(SPAWNGOATEE, 6000)

从逻辑上讲,问题可以从事件处理中看出,其中 和 最初是相同的,因此当您测试事件类型时,任何一个事件实际上都会触发两个事件类型检查SPAWNPIPESPAWNGOATEE

警告:

正如 @luke-b 所指出的,Pygame- 创建更多 USEREVENT 类型事件的方法? 提到了一些关于创建任意用户事件的注意事项的细节,比文档更详细。

基本上,您只能创建有限数量的事件(根据 SO 答案为 9 个),如果您尝试创建太多事件,则会引发错误pygame.event.custom_type()

评论

0赞 Trevn Jones 8/30/2023
很明显,我真的很不擅长谷歌搜索,但我现在可以随时回来参考这个,谢谢!值得庆幸的是,我只需要为这个游戏创建 3 或 4 个事件,所以应该没问题,再次感谢!