一个游戏动作可能同时绑定键盘键和手柄键。若直接把每次抬起都当成动作结束,两种输入同时按住时就会出现错误的提前释放。
物理按钮A和B都映射跳跃,C和D都映射交互。先维护实际按住的物理按钮集合,再由集合推导动作是否至少有一个来源;动作只在来源数从零变为正时产生开始,从正变为零时产生结束。
本例输入与约定
事件顺序完整列在表中,down表示物理按下,up表示抬起。两个动作的来源分组保持不变。
完整计算记录
次 | 事件 | 按住物理键 | 活动动作 | 开始 | 结束 1 | ['down', 'A'] | ['A'] | ['跳跃'] | ['跳跃'] | [] 2 | ['down', 'B'] | ['A', 'B'] | ['跳跃'] | [] | [] 3 | ['up', 'A'] | ['B'] | ['跳跃'] | [] | [] 4 | ['up', 'B'] | [] | [] | [] | ['跳跃'] 5 | ['up', 'C'] | [] | [] | [] | [] 6 | ['down', 'A'] | ['A'] | ['跳跃'] | ['跳跃'] | [] 7 | ['up', 'A'] | [] | [] | [] | ['跳跃'] 8 | ['up', 'A'] | [] | [] | [] | [] 9 | ['down', 'D'] | ['D'] | ['交互'] | ['交互'] | [] 10 | ['down', 'D'] | ['D'] | ['交互'] | [] | [] 11 | ['down', 'D'] | ['D'] | ['交互'] | [] | [] 12 | ['down', 'C'] | ['C', 'D'] | ['交互'] | [] | [] 13 | ['up', 'C'] | ['D'] | ['交互'] | [] | [] 14 | ['down', 'C'] | ['C', 'D'] | ['交互'] | [] | [] 15 | ['up', 'C'] | ['D'] | ['交互'] | [] | [] 16 | ['up', 'C'] | ['D'] | ['交互'] | [] | [] 17 | ['down', 'A'] | ['A', 'D'] | ['交互', '跳跃'] | ['跳跃'] | [] 18 | ['up', 'B'] | ['A', 'D'] | ['交互', '跳跃'] | [] | [] 19 | ['down', 'C'] | ['A', 'C', 'D'] | ['交互', '跳跃'] | [] | [] 20 | ['down', 'D'] | ['A', 'C', 'D'] | ['交互', '跳跃'] | [] | [] 21 | ['up', 'B'] | ['A', 'C', 'D'] | ['交互', '跳跃'] | [] | [] 22 | ['down', 'A'] | ['A', 'C', 'D'] | ['交互', '跳跃'] | [] | []
表中编号仅用于识别本例的元素。读取一个结果时,应先核对它对应的输入、处理顺序和边界约定;布尔值表示条件是否成立,空集合表示没有符合要求的对象,不应把这些字段混成同一种数值。
复核方法与适用范围
重复按下已按住的按钮不能重复产生动作开始,抬起原本未按住的按钮也不能制造结束。每一步都比较更新前后的动作集合,动作持续与输入事件本身要分开记录。
本例只使用数字按钮的逻辑或组合,不包含模拟轴数值合成、设备失焦或临时重绑定。那些变化也需要同步处理来源集合,否则再正确的动作边沿逻辑也可能读到过期输入。
练习时可以先独立计算最前面的一步,再检查最后的整体不变量。若结论不同,应保留各步记录,定位第一处差异;只调整最终数字会掩盖规则理解上的问题。改变输入后也要重新演算,而不是照抄这一例的输出。