跳到主要内容

修改游戏控制器状态

在任何希望修改游戏控制器状态的函数中,都需要使用指向游戏控制器的指针。这是更改游戏控制器状态任何方面的绝对必要条件。

Gamepad *gamepad = Storage::getInstance().GetGamepad();

可以在 headers/gamepad/GamepadState.h 中找到合适的游戏控制器宏和按钮掩码。

方向键

要修改游戏控制器的方向键(DPad)状态,使用按位或赋值和相应的 GAMEPAD_MASK 枚举来激活输入。

Gamepad *gamepad = Storage::getInstance().GetGamepad();
gamepad->state.dpad |= GAMEPAD_MASK_UP;
gamepad->state.dpad |= GAMEPAD_MASK_DOWN;
gamepad->state.dpad |= GAMEPAD_MASK_LEFT;
gamepad->state.dpad |= GAMEPAD_MASK_RIGHT;
插件的 SOCD 覆盖

所有插件都需要在插件中处理相对的同时方向,因为它们在标准 GPIO 输入已经被 SOCD 覆盖之后才出现。

请考虑在 src/gamepad/GamepadState.cpp 中使用 runSOCDCleaner(SOCDMode mode, uint8_t dpad) 来接收方向键输入,然后在插件的 process() 函数中一次性解决它们。

按钮

要修改游戏控制器的按钮状态,使用按位或赋值和相应的 GAMEPAD_MASK 枚举来激活输入。

Gamepad *gamepad = Storage::getInstance().GetGamepad();
gamepad->state.buttons |= GAMEPAD_MASK_B1;
gamepad->state.buttons |= GAMEPAD_MASK_B2;
gamepad->state.buttons |= GAMEPAD_MASK_B3;
gamepad->state.buttons |= GAMEPAD_MASK_B4;
gamepad->state.buttons |= GAMEPAD_MASK_L1;
gamepad->state.buttons |= GAMEPAD_MASK_R1;
gamepad->state.buttons |= GAMEPAD_MASK_L2;
gamepad->state.buttons |= GAMEPAD_MASK_R2;
gamepad->state.buttons |= GAMEPAD_MASK_S1;
gamepad->state.buttons |= GAMEPAD_MASK_S2;
gamepad->state.buttons |= GAMEPAD_MASK_L3;
gamepad->state.buttons |= GAMEPAD_MASK_R3;
gamepad->state.buttons |= GAMEPAD_MASK_A1;
gamepad->state.buttons |= GAMEPAD_MASK_A2;
gamepad->state.buttons |= AUX_MASK_FUNCTION;

摇杆

要修改游戏控制器的模拟摇杆状态,每个摇杆的 X 轴和 Y 轴必须设置为 0 到 65535 之间的无符号整数。

GAMEPAD_JOYSTICK_MIN = 0
GAMEPAD_JOYSTICK_MID = 0x7FFF
GAMEPAD_JOYSTICK_MAX = 0xFFFF
值范围摇杆位置
X轴0 - 32767方向左 100% - 0%
X轴32767居中
X轴32767 - 65535方向右 0% - 100%
Y轴0 - 32767方向上 100% - 0%
Y轴32767居中
Y轴32767 - 65535方向下 0% - 100%
Gamepad *gamepad = Storage::getInstance().GetGamepad();
gamepad->state.ly = value;
gamepad->state.lx = value;
gamepad->state.ry = value;
gamepad->state.rx = value;
模拟输入的 SOCD 覆盖

所有插件需要处理模拟摇杆上的相对同时方向,因为固件中没有现有机制来解决此类问题。

扳机

对于 L2 和 R2 扳机,有两种不同的方法来设置扳机的值。可以使用数字方式或模拟值设置它们。

数字扳机

与其他数字输入类似,使用按位或赋值和相应的 GAMEPAD_MASK 枚举来激活输入。

Gamepad *gamepad = Storage::getInstance().GetGamepad();
gamepad->state.buttons |= GAMEPAD_MASK_L2;
gamepad->state.buttons |= GAMEPAD_MASK_R2;

模拟扳机

要将 L2 和 R2 扳机设置为模拟值,首先必须将游戏控制器的 hasAnalogTriggers 标志设置为 true,以指示游戏控制器是否具有模拟扳机。默认情况下,此标志设置为 false,建议在操作模拟扳机值时设置此标志。

然后,应为每个模拟扳机设置适当的轴。模拟扳机的值范围为 0 到 255,其中 0 是完全释放,255 是完全按下。

GAMEPAD_TRIGGER_MIN = 0;
GAMEPAD_TRIGGER_MID = 0x7F;
GAMEPAD_TRIGGER_MAX = 0xFF;
Gamepad *gamepad = Storage::getInstance().GetGamepad();
gamepad->hasAnalogTriggers = true;
gamepad->state.lt = value;
gamepad->state.rt = value;