raylib 即时模式GUI(raygui)控件上手指南
2026/9/17 13:12:56 网站建设 项目流程

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 演示了滚动面板加多个滑块与复选框的组合:

四、组合示例:游戏内调试面板怎么排

组合的思路是"一个区域一个函数":

  1. 用一个Rectangle定义面板容器,先画底与标题(GuiGroupBox或直接DrawRectangle+DrawText)。
  2. 所有控件坐标从容器起点按固定偏移计算,不各自硬编码绝对坐标。
  3. 每行固定行高(例如 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 里的GuiControlGuiStyleProp,照表查即可。

六、常见坑与排查

  • 现象:链接后调用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),仅供参考

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

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

立即咨询