【教程】检查按键绑定是否存在冲突



  • 刚解决了这个问题,因此将我的解法思路发出来,以供参考。
    提示:由于本人编程能力一般,这个方法应该还有更优解

    背景:
    使用唤境制作跨平台或PC游戏时,经常会遇到需要使用键盘操作的情况;如果能为玩家提供更改按键绑定的功能,则游戏的可玩性会进一步提高。
    比如说PC游戏经常会用W A S D四个按键代表前进、向左、后退、向右四个方向的移动,但有些玩家可能会希望使用↑ ← ↓ → 四个方向键来代替控制。这时候如果能把对应功能的按键改为玩家想要的键,那么玩家的体验会提高。
    问题:
    我使用辞典来存储每个按键对应的编码,且游戏至少有10个按键,未来可能更多;
    现在,我希望玩家每次更改按键时,游戏都会检查更改后的按键是否与原有按键冲突,如果冲突则将提示框标红、弹出通知等进行提醒;
    核心问题就是,如何检查新输入的按键是否与原有按键冲突。

    以下是我的解决思路:

    1.每次输入新按键时,使用动作组刷新按键提示框颜色和按键文本;
    2.用一个检查动作组来检查按键是否有冲突;
    3.检查用的动作组采用递归方法:

    输入一个参数,指定从第几个按键开始检查,将这个按键的编码写入静态局部变量;
    循环,从指定的下一个按键开始,逐一比对指定的按键;
    若发现冲突,则立即将后者标红,同时改变“对比冲突”的变量值,将信号传递出去;
    收到信号后,将动作组最开始被指定的按键标红;
    重置信号;
    若指定的按键编号不大于总按键数,则将指定的编号+1,然后重新执行这个动作组(递归)。

    事件图如下:
    undefined


    一些想法和问题:
    1.只检查用户按的那个键的可行性?
    由于两方面的影响,我采用了这种看似低效的方法:一是事件内选中的局限性,只检查用户按键的话,要么全部标红,要么自己一定被标红,要么只能标红后面的不能标红自己;二是我的编程习惯,在性能影响不大的情况下,能全部刷新的我都会全部刷新,这样可以尽量避免响应失败的问题。

    2.反向检查的可行性?
    反向检查是我曾经尝试过的方法,即检查时首先标红自己,然后检查后续按键,每次检查时都先标红,若不冲突再取消标红;理论上是可行的,但是中间会有一些无用功,而且并不能节约变量或者动作组的使用数量。


    补充:效果图
    undefined


Log in to reply