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
相关产品推荐
相关产品推荐

