Pygame双人PONG游戏使用keyboard模块控制球拍移动的问题咨询
问题根源
你遇到的两个问题完全是当前代码的输入处理逻辑错误导致的:
- 你使用了第三方
keyboard库的热键机制,本身受系统按键重复延迟设置影响,会出现按下后先卡一下再连续移动的问题;同时你把keyboard.add_hotkey放在了pygame事件循环内部,每轮循环都会重复注册热键,不仅额外占用资源,还会触发逻辑冲突导致多键同时按下无响应。 - 你之前使用
pygame.key.get_pressed()无法实现连续移动,是因为你没有把按键检测和坐标更新逻辑放在主循环的每帧执行路径上,大概率是写在了事件遍历的内部、仅在按键按下事件触发时执行一次。
修复方案
完全抛弃第三方keyboard库,使用pygame原生的按键状态检测机制,原生支持多键同时识别,无系统按键延迟问题,修复后代码如下:
import pygame import os chx = 0.051 chy = 0.051 # 两个球拍初始y坐标,可根据你的实际需求修改 y = 150 y1 = 150 pygame.init() # 窗口尺寸对应你设定的y轴边界327,可自行调整 screen = pygame.display.set_mode((400, 360)) while True: # 处理基础事件 for event in pygame.event.get(): if event.type == pygame.QUIT: os.system("cls") pygame.quit() exit() # 每帧统一检测所有按键的实时状态,是连续移动的核心 keys = pygame.key.get_pressed() # 左侧球拍W/S控制,同步做边界判断 if keys[pygame.K_w] and y > 4: y -= chy if keys[pygame.K_s] and y < 327: y += chy # 右侧球拍上下方向键控制,同步做边界判断 if keys[pygame.K_UP] and y1 > 4: y1 -= chy if keys[pygame.K_DOWN] and y1 < 327: y1 += chy # 以下为你的游戏绘制逻辑,可替换为你原有实现 screen.fill((0,0,0)) pygame.draw.rect(screen, (255,255,255), (10, y, 10, 50)) # 左侧球拍 pygame.draw.rect(screen, (255,255,255), (380, y1, 10, 50)) # 右侧球拍 pygame.display.flip()
修复逻辑说明
- 每帧统一调用一次
pygame.key.get_pressed()获取所有按键的实时状态,只要按键处于按下状态,每轮主循环都会更新对应球拍的坐标,实现平滑无延迟的连续移动。 - 所有按键判断相互独立,同时按下W和向上箭头时两个球拍的移动逻辑都会触发,不存在多键冲突问题。
- 边界判断直接和坐标更新写在一起,不需要额外定义多个操作全局变量的函数,逻辑更简洁清晰。
内容的提问来源于stack exchange,提问作者Amirhossein
相关产品推荐
相关产品推荐

