Pygame中PS4手柄长按输入循环问题求助
解决PS4手柄长按按键持续输出的问题
嗨,我来帮你搞定这个PS4手柄输入的问题~你之前用嵌套while循环导致刷屏,核心问题是阻塞了Pygame的主事件循环——一旦进入那个内部循环,程序就没法响应新的手柄事件(比如按键松开),还会疯狂重复执行输出代码,自然就刷屏了。
正确的思路是跟踪按键的状态,在主循环的每一轮里检查按键是否处于按下状态,而不是在事件触发时直接开循环。下面是结合你的代码修改后的完整示例:
import pygame BLACK = (0, 0, 0) WHITE = (255, 255, 255) class TextPrint: def __init__(self): self.reset() self.font = pygame.font.Font(None, 25) def print(self, screen, textString): textBitmap = self.font.render(textString, True, BLACK) screen.blit(textBitmap, [self.x, self.y]) self.y += self.line_height def reset(self): self.x = 10 self.y = 10 self.line_height = 30 def indent(self): self.x += 10 def unindent(self): self.x -= 10 # 初始化Pygame pygame.init() screen = pygame.display.set_mode((500, 700)) pygame.display.set_caption("PS4手柄测试") clock = pygame.time.Clock() # 初始化手柄 pygame.joystick.init() joystick = pygame.joystick.Joystick(0) joystick.init() text_print = TextPrint() # 用字典跟踪每个按键的按下状态 button_pressed = {i: False for i in range(joystick.get_numbuttons())} running = True while running: screen.fill(WHITE) text_print.reset() # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 处理按键按下事件 elif event.type == pygame.JOYBUTTONDOWN: button_pressed[event.button] = True # 处理按键松开事件 elif event.type == pygame.JOYBUTTONUP: button_pressed[event.button] = False # 主循环中检查按键状态,持续输出 for button_idx in range(joystick.get_numbuttons()): if button_pressed[button_idx]: text_print.print(screen, f"按键 {button_idx} 持续按下中...") pygame.display.flip() clock.tick(60) # 控制帧率,避免输出过快 pygame.quit()
代码关键点说明:
button_pressed字典:专门用来记录每个手柄按键的当前状态(按下/松开)- 事件处理部分:只在
JOYBUTTONDOWN和JOYBUTTONUP事件触发时更新状态,不做任何输出操作 - 主循环的状态检查:每一轮循环都会遍历所有按键,只要按键处于按下状态,就执行输出。这样长按的时候,每帧都会输出一次,既实现了持续响应,又不会阻塞事件循环(还能通过
clock.tick(60)控制输出频率,避免刷屏)
这样修改后,你长按PS4手柄的按键时,就会持续输出对应的内容,松开后立刻停止,完全符合你的需求~
内容的提问来源于stack exchange,提问作者ark.pytm
相关产品推荐
相关产品推荐

