You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyGame中添加纯Python代码实现Xbox One/PS4等控制器直接输入可行吗?

在Pygame中实现Xbox One/PS4控制器输入(纯Python方案)

嘿,我来帮你搞定这个问题!你之前试的win.onkey()、win.use(sys())都是针对Tkinter这类库的键盘输入方法,对Pygame里的游戏控制器完全不适用——其实Pygame本身就内置了对游戏手柄的支持,不需要额外装库,纯Python代码就能实现。

下面是一步步的实现方案:

1. 先初始化Pygame和Joystick模块

Pygame把游戏控制器识别为“Joystick(摇杆)”,所以首先要初始化对应的模块:

import pygame

# 初始化Pygame核心
pygame.init()
# 初始化摇杆/控制器模块
pygame.joystick.init()

2. 检测并连接你的控制器

先检查有没有控制器连接,然后初始化第一个连接的设备:

# 检查控制器数量
controller_count = pygame.joystick.get_count()
if controller_count == 0:
    print("没检测到任何控制器,请先连接你的Xbox/PS4手柄!")
else:
    # 初始化第一个控制器(如果有多个,可以循环处理)
    controller = pygame.joystick.Joystick(0)
    controller.init()
    print(f"已成功连接控制器:{controller.get_name()}")

3. 监听并处理控制器输入事件

Pygame会把控制器的按键按下/松开、摇杆移动、十字键操作都包装成事件,你只需要在主循环里监听这些事件就行。这里给你一个完整的测试示例:

# 创建一个Pygame窗口(Pygame需要窗口才能处理事件,大小随意)
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("控制器测试工具")

running = True
while running:
    # 遍历所有事件
    for event in pygame.event.get():
        # 处理窗口关闭事件
        if event.type == pygame.QUIT:
            running = False
        
        # 处理控制器按键按下
        if event.type == pygame.JOYBUTTONDOWN:
            print(f"按键 {event.button} 被按下")
            # 举个例子:Xbox的A键/PS4的X键对应button 0
            if event.button == 0:
                print("你触发了确认操作!")
            # Xbox的B键/PS4的O键对应button 1,以此类推
            elif event.button == 1:
                print("你触发了取消操作!")
        
        # 处理控制器按键松开
        if event.type == pygame.JOYBUTTONUP:
            print(f"按键 {event.button} 被松开")
        
        # 处理摇杆移动事件(范围:-1到1,正数对应右/上,负数对应左/下)
        if event.type == pygame.JOYAXISMOTION:
            # 摇杆有死区,过滤微小的误触移动
            if abs(event.value) > 0.1:
                print(f"摇杆轴 {event.axis} 移动到:{event.value:.2f}")
                # 左摇杆X轴是axis 0,右是正,左是负
                if event.axis == 0:
                    if event.value > 0.5:
                        print("左摇杆向右推")
                    elif event.value < -0.5:
                        print("左摇杆向左推")
                # 左摇杆Y轴是axis 1,上是负,下是正(注意方向可能和你预期相反)
                elif event.axis == 1:
                    if event.value > 0.5:
                        print("左摇杆向下推")
                    elif event.value < -0.5:
                        print("左摇杆向上推")
        
        # 处理十字键事件(返回值是(x,y),x:-1左/1右;y:-1下/1上)
        if event.type == pygame.JOYHATMOTION:
            hat_x, hat_y = event.value
            if hat_x != 0 or hat_y != 0:
                print(f"十字键状态:x={hat_x}, y={hat_y}")
                if hat_y == 1:
                    print("十字键向上")
                elif hat_y == -1:
                    print("十字键向下")

# 退出时清理资源
pygame.joystick.quit()
pygame.quit()

额外小贴士

  • 不同控制器的按键编号可能略有差异,你可以用controller.get_numbuttons()查看总按键数,然后逐个按键测试来映射自己需要的功能。
  • 摇杆的方向可能和你预期的相反(比如Y轴向上是负数),可以通过取反来调整:adjusted_value = -event.value。
  • 如果你需要更精细的控制(比如自定义死区、按键映射),可以自己封装一个控制器类来处理这些逻辑。

内容的提问来源于stack exchange,提问作者Jacob Riplow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:11:40