在Pygame中如何检测空格键被按下的时长超过2秒
解决方案
原代码前置问题修复
原代码开头初始化后创建了临时窗口又立刻执行pygame.quit(),会直接销毁pygame运行上下文,导致后续事件、渲染逻辑全部失效,首先需要删除这段冗余代码:
# 删掉这两行 screen = pygame.display.set_mode((0,0)) pygame.quit()
空格键2秒长按检测实现
实现逻辑非常简单,通过状态变量记录按压的起始时间和状态,主循环实时计算时长即可:
- 新增变量记录空格按下的起始时间、是否处于按压中、是否已触发长按逻辑(避免重复触发)
- 空格按下时记录起始时间,标记按压状态
- 主循环中每次迭代计算按压时长,达到2秒时触发对应业务逻辑
- 空格抬起时重置所有状态变量
修改后完整可运行代码
import pygame,time pygame.init() canvas = pygame.display.set_mode((1000,780)) caption = pygame.display.set_caption("Ninja Run") # 注意:以下图片路径请替换为你本地的实际路径 iconImage = pygame.image.load("C:/Garv/python/pygame/Ninja Game/Ninja_logo.png") icon = pygame.display.set_icon(iconImage) land = pygame.image.load("C:/Garv/python/pygame/Ninja Game/land.jfif") sky = pygame.image.load("C:/Garv/python/pygame/Ninja Game/sky.jfif") x = 50 y = 594 start = time.time() ninjaRun = [ pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja running 1.jpg"), pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja running 2.jpg") ] ninjaImage = ninjaRun[0] class Ninja: def __init__(self,canvas,start,run,image,x,y): self.canvas = canvas self.start = start self.run = run self.image = image self.x = x self.y = y # 新增长按检测相关变量 self.space_press_start = None self.is_space_pressing = False self.long_press_triggered = False def ninja(self): self.image = ninjaRun[0] self.time = 15 self.sec = int((time.time()-self.start)*self.time) if self.sec % 2 != 0: self.image = ninjaRun[0] else: self.image = ninjaRun[1] self.canvas.blit(self.image, (self.x,self.y)) player = Ninja(canvas,start,ninjaRun,ninjaRun[0],x,y) cnt = 0 startTime = time.time() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() import sys sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: if not player.is_space_pressing: # 记录按压起始时间 player.space_press_start = time.time() player.is_space_pressing = True player.long_press_triggered = False # 原短按跳跃逻辑 player.y -= 200 if player.y < 394: player.y += 200 if event.type == pygame.KEYUP: if event.key == pygame.K_SPACE: # 抬起时重置所有状态 player.is_space_pressing = False player.space_press_start = None player.long_press_triggered = False # 原跳跃回落逻辑 player.y += 200 # 长按检测逻辑 if player.is_space_pressing: press_duration = time.time() - player.space_press_start if press_duration >=2 and not player.long_press_triggered: player.long_press_triggered = True # 这里替换为你需要的长按2秒触发的逻辑,比如高跳、放技能等 print("空格长按超过2秒") # 调整了绘图顺序,避免背景盖住元素 canvas.blit(sky, (0,0)) canvas.blit(land, (0,718)) pygame.draw.rect(canvas,(250,250,250),(500,500,20,20)) player.ninja() pygame.display.update()
代码修改说明
- 调整了绘图顺序,先渲染背景,再渲染前景元素,避免元素被背景覆盖
- 长按2秒触发后默认打印提示,你可以直接替换为你的业务逻辑
- 增加了
long_press_triggered标记,避免长按2秒后每帧重复触发逻辑 - 完全保留了你原有的短按跳跃、角色动画等逻辑,不需要额外调整原有功能
内容的提问来源于stack exchange,提问作者True Alpha
相关产品推荐
相关产品推荐

