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

Pygame节奏游戏可变生成计时器遇鼠标移动暂停问题求助

节奏游戏可变生成计时器鼠标移动时暂停的问题解决

我在为节奏游戏实现可变间隔的敌人生成计时器,原本功能正常,但现在出现鼠标移动时计时器暂停的问题。

初始化代码

import sys, pygame, pygame.mixer
from pygame.locals import *

pygame.init()

size = width, height = 1280, 720
screen = pygame.display.set_mode(size)

clock = pygame.time.Clock()

bullets = []
enemys  = []
tc      = 0
start   = 0
timer   = [500,100,2000,4000,1000,2000,3000,300,300,300,300,300,300,1000,1000,1000,1000,1000,1000,1000,1000,1000]
where   = [1  ,2  ,3   ,4   ,5   ,1   ,2]
neutral = False
spawn_enemy = pygame.USEREVENT + 0


background = pygame.image.load("png/arenabutbetter.png").convert()


bulletpicture = pygame.image.load("png/arrow144p.png").convert_alpha()
enemypicture  = pygame.image.load("png/enemy.png").convert_alpha()

主循环代码

while True:
    mx, my = pygame.mouse.get_pos()
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        
        # 问题代码段
        pygame.time.set_timer(spawn_enemy,timer[tc])
        if event.type == spawn_enemy:
            spawner.e1()
            tc +=1
        # 问题代码段
        
        elif event.type == MOUSEBUTTONDOWN:
            #shot.play()
            if my > 0 and my < 144 :
                bullets.append([-100, 0])
                
            elif my > 144 and my < 288: 
                bullets.append([-100, 144])
                
            elif my > 288 and my < 432: 
                bullets.append([-100, 288])
                
            elif my > 432 and my < 576: 
                bullets.append([-100, 432])
        #enemy testing
            elif my > 576 and my < 720: 
                bullets.append([-100, 576])

问题分析

问题出在每次事件循环中都调用pygame.time.set_timer(spawn_enemy,timer[tc])。鼠标移动会持续产生MOUSEMOTION事件,每处理一个这类事件,计时器就会被重新设置一次,相当于不断重置倒计时,导致计时器永远无法触发spawn_enemy事件,看起来就像计时器暂停了。

解决方案

只在需要启动或更新计时器的时候调用set_timer,比如程序初始化时,以及每次触发spawn_enemy事件后,再设置下一次的计时器,不要在每个事件处理流程中重复调用。

修改后的主循环代码如下:

# 初始化时先启动第一个计时器
if tc < len(timer):
    pygame.time.set_timer(spawn_enemy, timer[tc])

while True:
    mx, my = pygame.mouse.get_pos()
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        
        if event.type == spawn_enemy:
            spawner.e1()
            tc +=1
            # 生成敌人后,设置下一次的计时器(注意避免数组越界)
            if tc < len(timer):
                pygame.time.set_timer(spawn_enemy, timer[tc])
            else:
                # 所有计时器间隔用完后,关闭计时器
                pygame.time.set_timer(spawn_enemy, 0)
        
        elif event.type == MOUSEBUTTONDOWN:
            if my > 0 and my < 144 :
                bullets.append([-100, 0])
            elif my > 144 and my < 288: 
                bullets.append([-100, 144])
            elif my > 288 and my < 432: 
                bullets.append([-100, 288])
            elif my > 432 and my < 576: 
                bullets.append([-100, 432])
            elif my > 576 and my < 720: 
                bullets.append([-100, 576])
    
    # 控制帧率,保证游戏运行稳定
    clock.tick(60)

说明

这样修改后,计时器只会在初始化和每次生成敌人后被设置,不会被鼠标移动事件打断重置,就能按照timer数组里的间隔正常触发敌人生成了。

内容的提问来源于stack exchange,提问作者pedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:55:18