You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:53:26