raylib 即时模式GUI实战指南:用raygui 20行代码搭出游戏界面
2026/8/23 18:04:28 网站建设 项目流程

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:不需要维护控件状态树,在渲染循环里直接调用GuiSliderBarGuiButton这些函数,界面就画出来了。它适合刚接触 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 调用塞进BeginDrawingEndDrawing之间是零额外架构的工作量。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。仓库里还能找到GuiComboBoxGuiInputBoxGuiListView等控件,查raygui.h里的Gui前缀函数即可。

三步接入现有项目

  1. 克隆仓库:git clone https://gitcode.com/GitHub_Trending/ra/raylib,仓库自带CMakeLists.txtsrc/Makefile,按平台选其一构建出 raylib 库。
  2. 引入头文件:raygui.h在各示例目录里都有一份(如examples/shapes/raygui.h),拷进工程源码目录,在你要实现它的那一个.c 文件里先写#define RAYGUI_IMPLEMENTATION#include "raygui.h"
  3. 配置构建:编译命令里把 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询