提问人:Trevn Jones 提问时间:8/30/2023 更新时间:8/30/2023 访问量:42
计时器和用户事件 (PyGame) [复制]
Timers and user events (PyGame) [duplicate]
问:
我的游戏本质上是飞扬的鸟,但有敌人、弹药(山羊胡子),还有苍蝇而不是襟翼(这部分不是必需的)。我试图弄清楚如何生成管道、山羊胡子(供玩家收集的弹药)以及敌人。我刚刚了解了今天的事情,我用我的管道设置了它,它工作得很好!直到我创建了山羊胡子计时器,然后很快发现它不会设置 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 只能用于一个计时器,因此创建的第二个计时器将覆盖第一个计时器
答:
一些关于创建自定义事件的谷歌搜索让我找到了以下 SO 问题,PyGame 自定义事件,以及以下 pygame 文档、https://pyga.me/docs/ref/event.html#pygame.event.Event 和 https://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)
从逻辑上讲,问题可以从事件处理中看出,其中 和 最初是相同的,因此当您测试事件类型时,任何一个事件实际上都会触发两个事件类型检查SPAWNPIPE
SPAWNGOATEE
警告:
正如 @luke-b 所指出的,Pygame- 创建更多 USEREVENT 类型事件的方法? 提到了一些关于创建任意用户事件的注意事项的细节,比文档更详细。
基本上,您只能创建有限数量的事件(根据 SO 答案为 9 个),如果您尝试创建太多事件,则会引发错误pygame.event.custom_type()
评论
SPAWNGOATEE = pygame.USEREVENT + 1