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



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

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

    以下是我的解决思路:

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

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

    事件图如下:
    undefined


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

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


    补充:效果图
    undefined



  • 你这种方法毫无必要啊,玩家修改按键只可能每次修改一个,而你却全部递归检查。你只需要输入新按键时循环检查是否有同样的设置就行了吧,如果存在相同按键就弹出提示。
    你这样的思路,只适合在载入键位设置存储信息时检查用,但除非玩家自行修改存储信息否则也没必要。还有一种情况就是你允许暂时存在冲突键位设置,但为何不直接就让用户在输入新按键时就提示并更改呢?



  • @ZZommy 前面这个可能是我水平有限,然后导致冲突的情况一旦发生就会产生预期之外的结果,这一点我有在帖子里说明;后面这个的话我只是没有写明,可以在检查结束之后加一条提示,我实际在这个项目里的做法是当用户试图保存设置的时候再进行提醒,如果不修改则不予保存


登录后回复