Pygame多定时器冲突:如何创建独立用户事件类型?
问题描述
我开发了一款类似Flappy Bird的游戏,新增了敌人、可收集弹药(山羊胡)等元素。在实现管道、山羊胡的生成逻辑时,使用pygame.time.set_timer()遇到了问题——单独设置管道生成定时器时一切正常,但加上山羊胡的定时器后,两个定时器无法同时工作。查Pygame文档看到:
需要注意,特定事件类型只能设置一个定时器,即同一事件类型不能存在两个定时器,为某事件类型设置新定时器会覆盖旧的。
我的代码里把两个定时器都绑定到了pygame.USEREVENT,导致管道的3000毫秒定时器被山羊胡的6000毫秒定时器覆盖,实际要等6000毫秒才会生成管道。想知道能不能创建其他事件类型,或者有没有别的使用定时器的方式?
相关代码
创建定时器的代码:
SPAWNPIPE = pygame.USEREVENT pygame.time.set_timer(SPAWNPIPE, 3000) SPAWNGOATEE = pygame.USEREVENT pygame.time.set_timer(SPAWNGOATEE, 6000)
游戏循环内的事件处理:
#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
解决方案
方法1:创建独立的自定义用户事件
Pygame允许通过pygame.USEREVENT + n的方式创建多个独立的用户事件类型,每个事件类型对应一个定时器,这样就不会出现覆盖问题。修改定时器创建的代码即可:
# 给每个定时器分配唯一的事件类型 SPAWNPIPE = pygame.USEREVENT + 1 pygame.time.set_timer(SPAWNPIPE, 3000) SPAWNGOATEE = pygame.USEREVENT + 2 pygame.time.set_timer(SPAWNGOATEE, 6000)
事件处理部分不需要改动,现在两个事件类型是完全独立的,定时器会各自按照设定的间隔触发。
方法2:手动计时(不依赖pygame事件)
如果不想使用多个用户事件,也可以在游戏循环里手动记录时间差,当达到设定的间隔时执行生成逻辑:
# 初始化计时变量,记录上次生成的时间 last_pipe_spawn = pygame.time.get_ticks() last_goatee_spawn = pygame.time.get_ticks() # 游戏循环内部 current_time = pygame.time.get_ticks() # 检查是否到了生成管道的时间 if current_time - last_pipe_spawn >= 3000: spawn_pipe = True last_pipe_spawn = current_time # 检查是否到了生成山羊胡的时间 if current_time - last_goatee_spawn >= 6000: spawn_goatee = True last_goatee_spawn = current_time
这种方式不需要依赖pygame的事件系统,直接通过时间差判断,适合简单的定时逻辑。
内容的提问来源于stack exchange,提问作者Trevn Jones
相关产品推荐
相关产品推荐

