Immediate-Mode-UI/Nuklear

GitHub: Immediate-Mode-UI/Nuklear

一个基于 ANSI C 的即时模式、无依赖跨平台 GUI 库,专注于极简、可嵌入与高可移植性。

Stars: 11064 | Forks: 673

# Nuklear [![](https://github.com/Immediate-Mode-UI/Nuklear/workflows/C%2FC++%20CI/badge.svg )](https://github.com/Immediate-Mode-UI/Nuklear/actions) 这是一个最小状态、即时模式图形用户界面工具包 使用 ANSI C 编写并以公共领域授权 它被设计为一个简单 可嵌入的用户界面用于应用程序,没有任何依赖项、 默认渲染后端或操作系统窗口/输入处理,而是提供一个 高度模块化、基于库的方法,具有简单的输入状态和 描述原始形状的绘制命令作为输出。因此,它不是提供一个 分层库试图抽象多个平台和 渲染后端,它只关注实际的 UI。 ## 功能 - 即时模式图形用户界面工具包 - 单头文件库 - 使用 C89(ANSI C)编写 - 代码库小(约 18kLOC) - 注重可移植性、效率和简洁性 - 无依赖(即使不想要标准库) - 完全可定制 - 内存占用低,并在需要/想要时完全控制内存使用 - 支持 UTF-8 - 无全局或隐藏状态 - 可自定义的库模块(你可以只编译和使用你需要的部分) - 可选的字体烘焙器和顶点缓冲输出 - [文档](https://Immediate-Mode-UI.github.io/Nuklear/) ## 构建 该库是自包含的单头文件,可以 以仅头文件模式或实现模式使用。仅头文件模式是默认的 在包含时启用,并允许将此头文件包含到其他头文件 中而不包含实际实现。 实现模式需要在 *一个* .c/.cpp 文件中定义预处理器宏 `NK_IMPLEMENTATION`,例如: ``` #define NK_IMPLEMENTATION #include "nuklear.h" ``` 重要:每次包含 "nuklear.h" 时都必须定义相同的可选标志。 这非常重要;不这样做会导致编译器错误,甚至更糟的是,堆栈损坏。 ## 图库 ![screenshot](https://cloud.githubusercontent.com/assets/8057201/11761525/ae06f0ca-a0c6-11e5-819d-5610b25f6ef4.gif) ![screen](https://cloud.githubusercontent.com/assets/8057201/13538240/acd96876-e249-11e5-9547-5ac0b19667a0.png) ![screen2](https://cloud.githubusercontent.com/assets/8057201/13538243/b04acd4c-e249-11e5-8fd2-ad7744a5b446.png) ![node](https://cloud.githubusercontent.com/assets/8057201/9976995/e81ac04a-5ef7-11e5-872b-acd54fbeee03.gif) ![skinning](https://cloud.githubusercontent.com/assets/8057201/15991632/76494854-30b8-11e6-9555-a69840d0d50b.png) ![gamepad](https://cloud.githubusercontent.com/assets/8057201/14902576/339926a8-0d9c-11e6-9fee-a8b73af04473.png) ## 示例 ``` /* init gui state */ struct nk_context ctx; nk_init_fixed(&ctx, calloc(1, MAX_MEMORY), MAX_MEMORY, &font); enum {EASY, HARD}; static int op = EASY; static float value = 0.6f; static int i = 20; if (nk_begin(&ctx, "Show", nk_rect(50, 50, 220, 220), NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_CLOSABLE)) { /* fixed widget pixel width */ nk_layout_row_static(&ctx, 30, 80, 1); if (nk_button_label(&ctx, "button")) { /* event handling */ } /* fixed widget window ratio width */ nk_layout_row_dynamic(&ctx, 30, 2); if (nk_option_label(&ctx, "easy", op == EASY)) op = EASY; if (nk_option_label(&ctx, "hard", op == HARD)) op = HARD; /* custom widget pixel width */ nk_layout_row_begin(&ctx, NK_STATIC, 30, 2); { nk_layout_row_push(&ctx, 50); nk_label(&ctx, "Volume:", NK_TEXT_LEFT); nk_layout_row_push(&ctx, 110); nk_slider_float(&ctx, 0, &value, 1.0f, 0.1f); } nk_layout_row_end(&ctx); } nk_end(&ctx); ``` ![example](https://cloud.githubusercontent.com/assets/8057201/10187981/584ecd68-675c-11e5-897c-822ef534a876.png) ## 绑定 有许多由其他作者为不同语言创建的 Nuklear 绑定。 我无法证实它们的质量,因为我并不精通这些 语言。此外也不能保证所有绑定都会保持更新: - [Java](https://github.com/glegris/nuklear4j) 由 Guillaume Legris - [D](https://github.com/Timu5/bindbc-nuklear) 由 Mateusz Muszyński - [Golang](https://github.com/golang-ui/nuklear) 由 golang-ui@github.com - [Rust](https://github.com/snuk182/nuklear-rust) 由 snuk182@github.com - [Chicken](https://github.com/wasamasa/nuklear) 由 wasamasa@github.com - [Nim](https://github.com/zacharycarter/nuklear-nim) 由 zacharycarter@github.com - Lua - [LÖVE-Nuklear](https://github.com/keharriso/love-nuklear) 由 Kevin Harrison - [MoonNuklear](https://github.com/stetre/moonnuklear) 由 Stefano Trettel - Python - [pyNuklear](https://github.com/billsix/pyNuklear) 由 William Emerison Six(基于 ctypes 的封装) - [pynk](https://github.com/nathanrw/nuklear-cffi) 由 nathanrw@github.com(cffi 绑定) - [CSharp/.NET](https://github.com/cartman300/NuklearDotNet) 由 cartman300@github.com - [V](https://github.com/nsauzede/vnk) 由 Nicolas Sauzede ## 许可证 Nuklear 可以在 MIT 许可证或公共领域下使用。 参见 [LICENSE](LICENSE) 获取更多信息。 ## 审查者指南 在审查拉取请求时,审查者应记住 常见事项。 审查 `src/*` 和 `nuklear.h` 的变更: * 确保 C89 兼容性。 * 代码应能在多个后端上以可接受的度运行。 * 检查 `nuklear.h` 的其他部分是否相关,因此没有遗漏。 * 推荐简单的优化。 * 通过值而不是指针传递小结构体。 * 尽可能使用局部缓冲区而不是堆分配。 * 检查编码风格是否与周围代码一致。 * 变量/函数命名大小写。 * 缩进。 * 大括号 `{}` 的放置。 * 确保贡献者已更新 [clib.json](https://github.com/Immediate-Mode-UI/Nuklear/blob/master/clib.json) 中的适当版本。 * 至少让另一个人审查变更后再合并。 审查 `demo/*`、`example/*` 和仓库中的其他文件: * 重点是让可工作的代码合并。 * 我们希望让用户轻松开始使用 Nuklear,任何 `demo` 和 `example` 的改进有助于这一目标。 * 使用更新的 C 特性,甚至其他语言并不被禁止。 * 如果使用了其他语言,确保构建过程易于理解。 * 杂乱或效率较低的代码可以合并,只要这些异常被指出 并且易于发现。 * 不应为这些变更提升版本。 * 改进代码以更符合 `nuklear.h` 的变更当然总是受欢迎的。
标签:ANSI C, C89, Nuklear, UTF-8 支持, ZAP项目解析, 内存控制, 单头文件库, 即时模式 GUI, 可定制 UI, 图形界面工具包, 客户端加密, 嵌入式 UI, 开源 GUI, 无依赖库, 无全局状态, 游戏 UI, 界面库, 跨平台 GUI, 轻量级图形库, 高效率渲染