KHistory: KPlugin 可视化插件模块 / 自定义插件
KPlugin Module - 插件模块 / 自定义插件
背景: 为了增加可玩性 给KHistory开发一个插件模快KPlugin, 让更多的人能根据自己的使用环境和需求定制/开发按键可视化插件
KPlugin 是KHistory的插件模块, 为其提供基础的插件功能和插件的扩展能力
一、功能特性
- 插件基本功能 - 用户可根据场景自由切换插件进行按键可视化(如: 按键/游戏手柄...)
- Mini插件框架PluginBase - 提供标准接口和后台自动完成按键事件处理和布局(按键状态)更新功能
- 插件自动注册功能 - 把插件放置
kplugin/auto-register
目录即可在编译期自动注册 - 基础插件及插件扩展 - 已提供键盘和手柄基础插件及格斗游戏扩展插件, 用户无需了解C++/Imgui也可自己开发插件
- 自定义按键布局
- 重映射按键名
- 按键高亮颜色自定义
- 其他
二、使用说明
在KHistory的控制模块, 用户可以通过
Next
按钮或插件的下拉菜单中选择合适的插件, 如下图
三、插件示例
基础插件
Plugin Base - Keyboard - 基础键盘插件
Plugin Base - Gamepad - 基础手柄插件
扩展插件
Plugin Base - Keyboard Fighting Game - 键盘格斗游戏插件
Plugin Base - Gamepad - Fighting Game - 2468 - 手柄格斗游戏2468插件
四、插件开发/扩展
KPlugin的扩展和开发是极其容易的
通过PluginBase提供的标准&统一的接口和自动注册机制, 极大的简化了插件的开发
不需要 插件开发者 了解C++/imgui等知识, 只需具备程序的编译能力即可轻松开发一个自己的 按键可视化插件
基本流程
-
1.在
kplugin/auto-register
目录创建YourPluginName.kplugin.hpp
插件文件(或者直接复制HelloWorld.kplugin.hpp
并重命名) -
2.继承插件基础接口 -
PluginBase
-
3.实现按键布局 -
keyLayoutImpl
-
4.自定义按键颜色(可选) -
keyColorTableRemap
-
5.自定义按键名(可选) -
keyNameTableRemap
-
6.xmake重新构建项目, 自动完成插件注册
流程/开发过程说明 - 基于插件模板 HelloWorld
1.创建插件文件
在kplugin/auto-register
目录创建以.kplugin.hpp
后缀的插件文件(或者直接复制HelloWorld.kplugin.hpp
并重命名). 文件名的格式如下:
YourPluginName.kplugin.hpp | | 插件的名字 插件标识
所以HelloWorld插件对应的文件名就是 HelloWorld.kplugin.hpp
注意: 这个插件名, 也是后面插件的class名, 他们需要保持一致
2.继承插件基础接口
继承PluginBase并通过_mPluginName对插件进行命名
实现keyLayoutImpl布局接口,这样就完成了一个最小插件的开发, 但它的布局里并不显示任何东西
#include "PluginBase.hpp" namespace khistory { class HelloWorld : public PluginBase { public: HelloWorld() { // 通过_mPluginName对插件进行命名 _mPluginName += " - HelloWorld"; } public: // 接口实现 virtual void keyLayoutImpl(float layoutWidth, float layoutHeight) { } }; } // namespace khistory end
3.实现按键布局
keyLayoutImpl 的layoutWidth, layoutHeight 参数表示可布局区域布局/画布的 宽和高, 示意图如下:
+---------------> layoutWidth / X | | Hello World! | V layoutHeight / Y
我们可以根据这个信息, 去设计按键在可布局区域的位置 如下将显示一个空格键:
- 宽为layoutWidth的一半
- 高为 按键宽的 1/6
- 绘制起始坐标为 (startPosX, startPosY) 即 (layoutWidth / 4, 0)
- 按键中字体大小为系统字体的0.8倍
virtual void keyLayoutImpl(float layoutWidth, float layoutHeight) override { float buttonWidth = layoutWidth / 2; float buttonHeight = buttonWidth / 6; float startPosX = layoutWidth / 4; float startPosY = 0; _drawKey( KeyCode::KEYBOARD_SPACE, // keycode startPosX, startPosY, // cursorPosX, cursorPosY buttonWidth, buttonHeight, // key/button width, height 0.8 // font scale ); }
_drawKey
绘制按键 - 参数说明
- keycode: 统一的按键码 参考
PluginBase::KeyCode
- cursorPosX: 绘制的X坐标, -1表示使用默认值
- cursorPosY: 绘制的Y坐标, -1表示使用默认值
- width: 按键的宽, 0表示使用默认值
- height: 按键的宽, 0表示使用默认值
- fontScale: 字体的缩放倍数, 0表示使用默认值
void _drawKey(int keycode, float cursorPosX = -1, float cursorPosY = -1, float width = 0, float height = 0, float fontScale = 0)
4.自定义按键颜色(可选) - 实现keyColorTableRemap
这是个可选的功能, 如下就是就是给按键颜色表中空格键配置为红色
根据需求可在这个函数中对多个按键的颜色进行 配置/自定义
格式:_mkeyColorTable[KeyCode] = { R, G, B, T };
其中 0.0f <= R/G/B/T <= 1.0f
virtual void keyColorTableRemap() override { // reset keyboard space highlight color R/红 G/绿 B/蓝 T/透明度 _mkeyColorTable[KeyCode::KEYBOARD_SPACE] = { 1.0f, 0.0f, 0.0f, 0.5f }; }
5.自定义按键名(可选) - 实现keyNameTableRemap
同上这也是个可选的功能, 如下是给空格键重新命名为Hello World!
格式:_mkeyNameTable[KeyCode] = "KeyCode::Key's KeyName";
其中 0.0f << R/G/B/T << 1.0f
virtual void keyNameTableRemap() override { _mkeyNameTable[KeyCode::KEYBOARD_SPACE] = "Hello World!"; }
6.xmake重新构建项目, 自动完成插件注册
需要有xmake环境
xmake xmake r
五、贡献与更多有意思的插件
欢迎大家把有意思的插件晒到这个讨论中 - KPlugin - 有意思的插件讨论
六、相关链接
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Flatpak 支持 Wayland 安全上下文协议
Flatpak 合并了支持 Wayland 安全上下文协议 (security context) 的 PR。 Flatpak 是一种沙盒容器式的软件包格式,类似于 Docker,旨在提供一种独立于发行版的打包格式,解决包依赖问题,能在不导致依赖地狱的情况下在同一个系统上安装同一个程序的多个版本。Flatpak 由红帽主导开发,完全开源,支持多个软件仓库。 根据 PR 的描述,Wayland 安全上下文协议扩展能够让一个客户端注册新客户端,并将安全上下文元数据附加到连接。该接口允许沙箱引擎将安全上下文附加到来自沙箱内部的所有连接。反过来,合成器可以限制沙盒连接使用的功能。 点此查看关于 Wayland 协议的详细信息。 新合并的 Flatpak 代码支持利用 Wayland 合成器的支持来获取有关客户端的识别信息,并根据需要应用安全策略。
- 下一篇
Karmada 结合 coreDNS 插件实现跨集群统一域名访问
本文分享自华为云社区《Karmada 结合 coreDNS 插件实现跨集群统一域名访问》,作者:云容器大未来 。 在多云与混合云越来越成为企业标配的今天,服务的部署和访问往往不在一个 K8s集群中。如何做到服务访问与集群无关,成为了各个云服务提供商必须要面对的问题。本文基于Karmada v1.6.1版本,探索使用一致域名跨集群访问服务的方法,来解决该问题。 一、实践官方例子 按照官网例子(配置多集群服务发现)【1】,详细操作如下: 1. 部署业务 以部署 deployment 与service为例。在控制平面创建 deployment 和 service 并通过 PropagationPolicy 发到集群 member1 中。该步骤合并的 yaml 如下: apiVersion: apps/v1 kind: Deployment metadata: name: serve spec: replicas: 2 selector: matchLabels: app: serve template: metadata: labels: app: serve s...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题