raylib 即时模式GUI(raygui)控件上手指南
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
raygui 是 raylib 仓库自带的即时模式 GUI(Immediate Mode GUI)实现,位于 examples/core/raygui.h。它把控件绘制、输入判定、状态回写合并成单个函数调用,适合做游戏内调试面板、参数调台和设置菜单。面向刚接触 raylib 的 C 语言开发者,无需事件循环与控件树,几行代码即可上手。
一、raygui 在 raylib 中的角色:raylib GUI 是什么
raylib 本体是图形与输入库,负责窗口、绘制、事件;raygui 是叠在它之上的一层控件库,单头文件约 6400 行,同时包含声明与实现。"即时模式"的含义是:每帧都重新调用控件函数完成绘制,raygui 不替你保存控件,控件值(滑块数值、勾选状态)全部由你自己的变量持有,函数通过指针参数直接回写。
保留模式的界面库(Qt、GTK 一类)会维护控件树、布局与信号槽;raygui 不存控件、不算布局,"代码即界面",代价是布局要自己排。因此它适合游戏内 UI 开发中的轻量场景——调参面板、模式开关、快速原型,不适合做大型编辑器或复杂表单。
| 维度 | 即时模式(raygui) | 保留模式(Qt/GTK) |
|---|---|---|
| 控件状态 | 开发者自己持有 | 库内部维护 |
| 布局系统 | 无,坐标自己算 | 有 |
| 适合场景 | 游戏内面板、调试工具 | 桌面应用、复杂表单 |
二、最小可运行示例:raygui C语言 接入只需两行
编译环境用 raylib 5.x,把 examples/core/ 加入头文件搜索路径并链接 raylib 库。C 源码只需在已有代码里加两行:
#include "raylib.h" #define RAYGUI_IMPLEMENTATION // 只在一个 .c 文件里定义 #include "raygui.h" // 相对路径 examples/core/raygui.h int main(void) { InitWindow(800, 450, "raygui panel"); SetWindowMinSize(480, 320); float barWidth = 200.0f; // 控件直接读写这个变量 bool showRect = true; GuiStyleDefault(); while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); // 拖动滑块时 raygui 回写 barWidth GuiSliderBar((Rectangle){20, 40, 220, 20}, "Width", TextFormat("%.0f", barWidth), &barWidth, 50, 500); GuiCheckBox((Rectangle){20, 80, 20, 20}, "Show rect", &showRect); if (showRect) DrawRectangle(60, 140, barWidth, 120, SKYBLUE); EndDrawing(); } CloseWindow(); return 0; }这段代码在做什么:初始化是 raylib 的标准写法;#define RAYGUI_IMPLEMENTATION与#include "raygui.h"让 raygui 的函数体在当前编译单元生成,全项目只放一份。滑块每帧调用一次,鼠标命中、拖动判定、数值回写都由 raygui 完成,业务代码不写任何回调;滑块右侧文字用TextFormat实时显示当前值。GuiCheckBox同理,通过bool*回写勾选状态。最后两行把控件结果画到窗口上,形成"调参—即时反馈"的闭环。
官方示例 examples/shapes/shapes_rounded_rectangle_drawing.c 就是"滑块改圆角"的完整实现,可对照阅读。
三、按任务选控件:raygui 控件怎么选
raygui 的控件按"任务"选,不按外观选:调数值、切开关、选一项、调颜色,四类任务覆盖了游戏内 UI 开发的大部分需求。
🎛️调连续数值
GuiSliderBar((Rectangle){20, 200, 200, 20}, "Volume", TextFormat("%d%%", (int)(volume*100)), &volume, 0, 1);GuiSliderBar接收float*与最小、最大值,适合音量、灵敏度、尺寸这类连续量。需要整数且范围离散时用GuiValueBox,它支持键盘直接输入并做范围钳制。
🔘切开关
GuiCheckBox((Rectangle){20, 240, 20, 20}, "Show FPS", &showFps);GuiCheckBox通过bool*回写,适合显示网格、开启雾效、调试模式这类独立开关。
📋在固定集合里选一项
int selected = 1; // editMode 传 true:打开状态下点选;false:点击循环切换 GuiDropdownBox((Rectangle){250, 10, 120, 30}, "Easy;Normal;Hard", &selected, true);选项写成分号分隔的字符串,不用维护数组,适合难度、渲染模式等固定选项。
🎨调颜色
GuiColorPicker((Rectangle){400, 100, 300, 300}, "Team Color", &teamColor);GuiColorPicker内置色条加 RGB 滑块,返回的Color可直接传给任何 raylib 绘制函数。
📜内容超出屏幕
GuiScrollPanel(panelRect, "Options", contentRect, &scroll, &view);选项多到一屏放不下时用GuiScrollPanel承载子控件,examples/shapes/shapes_pie_chart.c 演示了滚动面板加多个滑块与复选框的组合:
四、组合示例:游戏内调试面板怎么排
组合的思路是"一个区域一个函数":
- 用一个
Rectangle定义面板容器,先画底与标题(GuiGroupBox或直接DrawRectangle+DrawText)。 - 所有控件坐标从容器起点按固定偏移计算,不各自硬编码绝对坐标。
- 每行固定行高(例如 40 像素),行内左标签、右输入控件。
一行控件的写法是固定的三段式:
DrawText("X Position", panelX + 10, y, 10, LIGHTGRAY); GuiValueBox((Rectangle){panelX + 120, y - 4, 100, 24}, NULL, &camX, -100, 100, true); y += rowHeight;把y用循环步进,加控件就是加行;重置按钮放最后一行,点击时把面板绑定的几个变量整体赋回默认值。examples/core/core_3d_camera_free.c 里的相机控制区可以按这个思路对照阅读:
五、样式与换肤:用 GuiSetStyle 改控件配色
raygui 的样式是一张按"控件 + 属性"索引的全局表。GuiSetStyle改单个属性,GuiLoadStyle读取.rgs样式文件整体覆盖。改按钮配色只需要两个属性,按下、悬停等状态会沿用默认值:
GuiSetStyle(BUTTON, BASE_COLOR_NORMAL, COLOR(GREEN)); GuiSetStyle(BUTTON, TEXT_COLOR_NORMAL, COLOR(WHITE));所有可用的控件枚举与属性枚举定义在 examples/core/raygui.h 里的GuiControl与GuiStyleProp,照表查即可。
六、常见坑与排查
- 现象:链接后调用
GuiButton报未定义引用。原因:raygui.h 是头文件实现,函数体只在定义了RAYGUI_IMPLEMENTATION的编译单元生成。处理:包含 raygui.h 前加#define RAYGUI_IMPLEMENTATION,且整个项目只放一份。 - 现象:滑块拖动无效或数值跳变。原因:把临时变量地址传了进去,或范围写反。处理:传稳定的
float变量地址,确认minValue < maxValue。 - 现象:控件只在第一次出现后就不动了。原因:控件调用被放在初始化阶段,没有留在帧循环里。处理:即时模式下控件函数必须每帧调用,移动进
while循环。 - 现象:控件超出屏幕或互相重叠。原因:raygui 没有布局系统,坐标是绝对窗口坐标。处理:以面板矩形为锚点统一计算子控件位置;窗口尺寸变化时用窗口宽高动态计算锚点。
- 现象:中文或 emoji 显示成方块、问号。原因:默认字体只覆盖 ASCII。处理:加载覆盖目标字符集的字体文件,再调用
GuiSetFont应用。 - 现象:复选框、下拉框点击无反应。原因:同一帧内另一个编辑型控件处于激活态,raygui 用全局独占模式暂停其余控件的交互。处理:检查文本框、数值框的编辑状态参数,编辑结束后关闭编辑态。
七、延伸资源
- 头文件与实现:examples/core/raygui.h
- 示例集合(含各
*.c对应的运行截图):examples/ - CMake 构建模板:projects/CMake/
- 示例清单:examples/examples_list.txt
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考