You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何带容错检测游戏手柄右摇杆的上/左/右方向输入?

解决DS4手柄右摇杆方向检测的误判问题

我明白你遇到的痛点了——用Inputs库时,因为每次只能拿到单个摇杆事件,导致轻微偏移时水平和垂直方向的判断互相覆盖,没法精准检测“无偏移”的方向。下面给你两个可行的解决方案,一个是改进现有代码,另一个是更换更合适的库。

方案一:改进Inputs库的使用逻辑,跟踪摇杆实时状态

Inputs库的get_gamepad()返回的是单个事件,所以我们不能只在事件触发时判断方向,而是要持续维护摇杆的当前轴值,然后同时检查两个轴的状态,加入死区(容错)来过滤轻微偏移。

示例代码

from inputs import get_gamepad

# 初始化摇杆的当前状态,记录RX(水平)和RY(垂直)的实时值
current_rx = 0
current_ry = 0
inputArray = [0] * 14  # 简化数组初始化

def get_true_game_input():
    global current_rx, current_ry, inputArray
    # 重置当前帧的方向状态(如果需要保持状态直到摇杆松开,可以去掉这行)
    inputArray[4] = inputArray[5] = inputArray[6] = 0
    
    # 处理所有事件,更新摇杆的实时状态
    events = get_gamepad()
    for event in events:
        if event.code == "ABS_RY":
            current_ry = event.state
        elif event.code == "ABS_RX":
            current_rx = event.state
    
    # 设置死区阈值,过滤轻微偏移(可根据你的手柄灵敏度调整)
    deadzone = 8000
    # 向上:水平轴在死区内,且垂直轴达到向上阈值
    if abs(current_rx) < deadzone and current_ry >= deadzone:
        inputArray[5] = 1
        print("top Guard!")
    # 向右:垂直轴在死区内,且水平轴达到向右阈值
    if abs(current_ry) < deadzone and current_rx >= deadzone:
        inputArray[6] = 1
        print("right guard!")
    # 向左:垂直轴在死区内,且水平轴达到向左阈值
    if abs(current_ry) < deadzone and current_rx <= -deadzone:
        inputArray[4] = 1
        print("left guard!")
    
    return inputArray

逻辑说明

  • 我们用current_rxcurrent_ry保存摇杆的实时位置,每次收到事件就更新对应的值
  • 判断方向时,必须确保另一个轴处于死区内(无明显偏移),才判定当前方向有效,这样就避免了轻微偏移导致的误判

方案二:更换更成熟的手柄库——Pygame

Inputs库的文档和功能确实比较有限,如果你想更省心,推荐用Pygame(或社区版pygame-ce),它对游戏手柄的支持更完善,能直接获取所有轴的实时状态,不需要逐个处理事件。

示例代码

import pygame

# 初始化Pygame和手柄
pygame.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()

inputArray = [0] * 14
# Pygame返回的轴值范围是-1到1,这里设置死区为0.5(可根据灵敏度调整)
deadzone = 0.5

def get_true_game_input():
    global inputArray
    inputArray[4] = inputArray[5] = inputArray[6] = 0
    
    # 处理Pygame的事件循环(必须保留,否则无法更新手柄状态)
    for event in pygame.event.get():
        pass
    
    # 获取右摇杆的轴值:DS4的右摇杆X通常是轴2,Y是轴3(如果不对,可打印所有轴值测试)
    rx = joystick.get_axis(2)
    ry = joystick.get_axis(3)
    
    # 向上:水平轴在死区内,垂直轴小于-deadzone(Pygame中向上通常对应负数,需根据实际测试调整)
    if abs(rx) < deadzone and ry <= -deadzone:
        inputArray[5] = 1
        print("top Guard!")
    # 向右:垂直轴在死区内,水平轴大于deadzone
    if abs(ry) < deadzone and rx >= deadzone:
        inputArray[6] = 1
        print("right guard!")
    # 向左:垂直轴在死区内,水平轴小于-deadzone
    if abs(ry) < deadzone and rx <= -deadzone:
        inputArray[4] = 1
        print("left guard!")
    
    return inputArray

# 测试用的循环
while True:
    get_true_game_input()

额外提示

  • 如果轴映射不对,可以通过打印joystick.get_axis(n)(n从0开始)的值来确认每个轴对应的摇杆
  • pygame-ce是Pygame的社区维护版本,修复了更多手柄兼容性问题,对DS4支持更好,你可以优先考虑安装它

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

火山引擎 最新活动