游戏快捷键系统架构(第一版)

来源:互联网 发布:张亚东高圆圆知乎 编辑:程序博客网 时间:2024/06/05 04:17

目的:基于引擎提供的两个接口“按键按下回调”(参数为按键id,任意按键按下时调用)和“按键抬起回掉”构建快捷键系统,要求能够通过此模块注册(组合)快捷键和注销(组合)快捷键,快捷键有绑定的函数,按下抬起被注册的快捷键时执行绑定的函数

 

流程:



按键按下之后引擎回掉“按键按下回调”函数,客户端记录当前这个按下的按键到一个列表中,当按键抬起回掉”函数响应的时候需要把对应的按键从列表中剔除,用于检测当前有哪些正在按下的按键,进而可以进行组合快捷键的判断。
全局快捷键模块记录着各个状态的快捷键-函数映射,状态代表玩家现在处于哪个场景中,这些场景可能是登陆、选人、设置、战斗等。然后根据快捷键-函数映射获取对应的函数并执行。此模块用来执行一些较为常用,功能变化较小的快捷键,例如ESCenterCtrl+CCtrl+VTab

自定义注册的快捷键需要在程序运行时自行注册,例如当一个主控英雄被创建的时候,就可以在它的创建函数中注册“按下事件”和“抬起事件”并将类中的函数与这两个事件对应起来,当按键被按下的时候会调用相应函数,可以在函数中判断当前被按下的按键是哪个然后执行相应的功能,比如说按下的键是w,就执行向前走动作,然后发送前走协议给服务端。与主控英雄相关的快捷键注册及快捷键对应函数都应在自己的类内完成。

 

缺点:

1.该需求的核心是对外部提供一个可注册,注销快捷键的接口,尽量降低耦合。也就是说,其他项目拿到这个模块之后可以通过有限的几个接口完成快捷键相关任务。而这个系统和其他模块的耦合度过大。

2.全局快捷键响应模块直接把快捷键-函数映射写死了,非常不灵活,如果新加场景,还要不断维护这个模块代码,如果替换快捷键又很麻烦。

3.主控英雄不应该与快捷键长生耦合关系,而应该在一个controller(创建主控英雄的地方)注册。

4.组合快捷键使用的时候需要判断这个按键有没有被记录在“已按下列表”中,太麻烦,应该直接在注册快捷键的函数参数表中通过一个列表设置

5.只有按键按下和抬起两种事件,所有函数都关联到这两个事件上,会导致每按下一个键有过多的无关函数被执行,效率极大的降低了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

流程:

 

 

 

 

 

 

 

0 0
原创粉丝点击