raylib 即时模式GUI实战指南:用raygui 20行代码搭出游戏界面
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
raylib 是一个轻量级的跨平台 C 语言游戏库,配套的 raygui 单头文件让它支持即时模式GUI:不需要维护控件状态树,在渲染循环里直接调用GuiSliderBar、GuiButton这些函数,界面就画出来了。它适合刚接触 C 语言游戏开发的初学者,也适合想给现有项目加设置菜单、调试面板的开发者。一个能拖、能点的参数面板,20 行代码以内就能跑起来。
效果先摆出来
这是仓库示例shapes_rounded_rectangle_drawing.c的运行截图。左边是一个圆角矩形,右侧是一列 raygui 滑块和复选框:拖动 Width、Height、Roundness 滑块,图形尺寸和圆角实时变化;勾选三个复选框可以切换不同绘制模式。整个界面没有布局管理器,没有事件注册,每一帧按顺序调用控件函数即可完成。
最短可运行示例如下,编译时链接 raylib 即可直接运行:
#include "raylib.h" #define RAYGUI_IMPLEMENTATION #include "raygui.h" int main(void) { InitWindow(480, 240, "raygui first screen"); float width = 200.0f; bool anim = true; while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); GuiSliderBar((Rectangle){20, 40, 200, 20}, "Width", TextFormat("%.0f", width), &width, 50, 400); GuiCheckBox((Rectangle){20, 90, 20, 20}, "Animation", &anim); DrawRectangle((Rectangle){260, 40, width - 40, 80}, RED); EndDrawing(); } CloseWindow(); return 0; }滑块改的是你自己的width变量,变量变了下一帧图形就变了——这就是即时模式的全部。
即时模式为什么更省事
先分清两个术语。保留模式(retained mode)是 Qt、Win32 这类框架的玩法:每个控件是一个持久的对象,存在状态树里,你通过注册回调接收点击事件。即时模式(immediate mode)反过来:控件没有生命周期,每帧你调一次函数就画一次,它顺手把你传进去的变量指针读一遍、改一遍,状态完全归你管。
| 对比项 | 保留模式 | 即时模式(raygui) |
|---|---|---|
| 状态管理 | 框架持有控件状态树,需同步 | 无状态,控件直接读写你的局部变量 |
| 事件处理 | 注册回调 / 消息分发 | 控件函数每帧返回bool,为真即被点击 |
| 集成方式 | 依赖工具链与运行时分发 | 拷贝一个raygui.h,#define RAYGUI_IMPLEMENTATION即可 |
| 出错代价 | 状态失步难排查 | 界面即代码,逻辑全在一个函数里 |
对游戏来说,帧循环本来就存在,把 UI 调用塞进BeginDrawing和EndDrawing之间是零额外架构的工作量。GuiButton返回true那帧触发开始游戏,比找回调对象改状态直观得多。
常用控件速查
仓库里的示例(examples/shapes/shapes_pie_chart.c就是重度用户)基本只用下面这几个,覆盖 90% 场景:
| 控件 | 用途 | 关键参数 |
|---|---|---|
GuiSliderBar | 连续数值调节 | 输出float*指针、最小值、最大值 |
GuiButton | 一次性动作触发 | 返回bool表示本帧是否被点 |
GuiCheckBox | 布尔开关 | 输出bool*指针 |
GuiDropdownBox | 离散选项选择 | 分号分隔的选项串、选项数、输出int*索引 |
GuiToggle | 常亮按钮(开/关切换) | 输出bool*指针 |
GuiGroupBox | 面板分区外框 | 区域Rectangle+ 标题 |
GuiLabel | 纯文本标签 | 文本内容 |
GuiProgressBar | 进度显示 | 进度比例(0~1) |
规律只有一条:区域用Rectangle描述,可写状态传指针,动作返回bool。仓库里还能找到GuiComboBox、GuiInputBox、GuiListView等控件,查raygui.h里的Gui前缀函数即可。
三步接入现有项目
- 克隆仓库:
git clone https://gitcode.com/GitHub_Trending/ra/raylib,仓库自带CMakeLists.txt和src/Makefile,按平台选其一构建出 raylib 库。 - 引入头文件:
raygui.h在各示例目录里都有一份(如examples/shapes/raygui.h),拷进工程源码目录,在你要实现它的那一个.c 文件里先写#define RAYGUI_IMPLEMENTATION再#include "raygui.h"。 - 配置构建:编译命令里把 raygui.h 所在目录加进头文件搜索路径,链接时加上 raylib 库。单头文件设计意味着没有新库要管理,改样式只需要调
GuiLoadStyle的参数。
常见坑与一句话解法
布局偏移:写死Rectangle坐标,换分辨率就出界。现象是面板贴边、控件被裁掉。解法:用GetScreenWidth()反推锚点,比如panelX = GetScreenWidth() - 270,仓库的饼图示例就是按右边缘锚定的。
中文字体乱码:raygui 默认用 raylib 的位图字体,只含 ASCII,中文直接空白或方块。解法:LoadFontEx加载一个含 CJK 字形的 TTF,再GuiSetFont(font),一行切换。
性能疑虑:有人想把 UI 缓存成纹理省重绘。不必。raygui 的即时模式本身很轻,控件调用就放在BeginDrawing/EndDrawing区间里按帧执行即可,状态靠你自己的变量维护,不引入额外缓存层。
继续深入
仓库的examples/目录是最好的教材,shapes/和audio/下有十几个带 raygui 面板的完整示例,从滑块、复选框到滚动面板、颜色选择器都有真实用法。需要查某个控件的完整签名时,tools/rlparser/output/下有一份由解析工具生成的 API 列表(raylib_api.txt),可直接全文检索。从抄一个示例面板开始,比读文档快。
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考