You need to enable JavaScript to run this app. 在Pygame中如何检测空格键被按下的时长超过2秒
优惠活动
大模型
产品
解决方案
定价
更多

在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() 

代码修改说明

  1. 调整了绘图顺序,先渲染背景,再渲染前景元素,避免元素被背景覆盖
  2. 长按2秒触发后默认打印提示,你可以直接替换为你的业务逻辑
  3. 增加了long_press_triggered标记,避免长按2秒后每帧重复触发逻辑
  4. 完全保留了你原有的短按跳跃、角色动画等逻辑,不需要额外调整原有功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 16:45:07