用arduino三个按键实现黑神话悟空劈棍的五连招状态机
14 2025-07-16 16:26
下面给出一种 3 个按键就能打出《黑神话:悟空》劈棍 5 段连招的 Arduino 实现思路:
整套逻辑用“状态机”描述,3 个按键分别代表
整套逻辑用“状态机”描述,3 个按键分别代表
-
K1:轻击(左键)
-
K2:重击(右键)
-
K3:识破/取消(Shift)
5 段连招顺序就是官方推荐的 轻-轻-重-重-重
,只要按键节拍正确就逐段推进;任何时刻按 K3 都可立即回到 Ready 状态(相当于取消后摇或识破失败)。
1. 状态机 7 个状态
表格
复制
状态名 | 含义 | 下一跳条件 |
---|---|---|
READY | 待机 | 收到 K1 → L1 |
L1 | 第1段轻击 | 700 ms 内收到 K1 → L2;超时 → READY |
L2 | 第2段轻击 | 700 ms 内收到 K2 → H3;超时 → READY |
H3 | 第3段重击 | 700 ms 内收到 K2 → H4;超时 → READY |
H4 | 第4段重击 | 700 ms 内收到 K2 → H5;超时 → READY |
H5 | 第5段重击(终结) | 自动回到 READY |
CANCEL | 通用取消 | 任意状态按 K3 → 立即 READY |
2. Arduino 代码框架
cpp
复制
#include <Bounce2.h>
const uint8_t PIN_K1 = 2; // 轻击
const uint8_t PIN_K2 = 3; // 重击
const uint8_t PIN_K3 = 4; // 识破/取消
Bounce btn1 = Bounce(), btn2 = Bounce(), btn3 = Bounce();
enum State { READY, L1, L2, H3, H4, H5 };
State state = READY;
uint32_t comboTimer = 0;
const uint32_t COMBO_TIMEOUT = 700; // 连段时间窗口,可调
void setup() {
Serial.begin(115200);
pinMode(PIN_K1, INPUT_PULLUP);
pinMode(PIN_K2, INPUT_PULLUP);
pinMode(PIN_K3, INPUT_PULLUP);
btn1.attach(PIN_K1); btn2.attach(PIN_K2); btn3.attach(PIN_K3);
btn1.interval(5); btn2.interval(5); btn3.interval(5);
}
void sendCombo(uint8_t id) {
Serial.print("Combo "); Serial.println(id); // 可通过串口发到 PC/灯板/舵机
}
void loop() {
btn1.update(); btn2.update(); btn3.update();
if (btn3.fell()) { // 随时取消
state = READY;
Serial.println("Cancel");
return;
}
switch (state) {
case READY:
if (btn1.fell()) {
state = L1;
comboTimer = millis();
sendCombo(1);
}
break;
case L1:
if (millis() - comboTimer > COMBO_TIMEOUT) { state = READY; break; }
if (btn1.fell()) { state = L2; comboTimer = millis(); sendCombo(2); }
break;
case L2:
if (millis() - comboTimer > COMBO_TIMEOUT) { state = READY; break; }
if (btn2.fell()) { state = H3; comboTimer = millis(); sendCombo(3); }
break;
case H3:
if (millis() - comboTimer > COMBO_TIMEOUT) { state = READY; break; }
if (btn2.fell()) { state = H4; comboTimer = millis(); sendCombo(4); }
break;
case H4:
if (millis() - comboTimer > COMBO_TIMEOUT) { state = READY; break; }
if (btn2.fell()) { state = H5; sendCombo(5); } // 终结技
break;
case H5: // 打完 5 段自动复位
state = READY;
break;
}
}
3. 实物扩展建议
-
把
sendCombo(id)
换成点亮不同 LED、驱动继电器击打按键,或直接通过串口/USB HID 输出给 PC/PS5 手柄板。 -
若想加入“识破”判定,可把 K3 的触发时间限制在 H3/H4 状态且正好在敌人攻击帧(需外接光电/声音传感器),实现真正的“破棍式”窗口
-
。
这样,仅用 3 个按键就能完整、流畅地打出黑神话劈棍 5 连招。
全部评论