raygui 快速上手:15 行 C 代码调出游戏参数面板
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
给游戏加个调试面板,通常要写状态机、绑定回调、同步控件数据。raylib 的 raygui(即时模式 GUI,每帧重画一遍、不用手动同步状态)走的是另一条路:每帧循环里直接调用GuiSliderBar,把变量指针递进去,拖动的数值就写回你的变量。面板从想法到跑起来,15 行代码。
跑起来
把 raygui.h 拷进你的工程目录,写一个最小工程:
#define RAYGUI_IMPLEMENTATION #include "raygui.h" int main(void) { InitWindow(800, 450, "raygui demo"); float speed = 1.0f; while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); if (GuiSliderBar((Rectangle){50, 50, 300, 30}, "Speed", NULL, &speed, 0.1f, 5.0f)) printf("speed = %.2f\n", speed); EndDrawing(); } CloseWindow(); return 0; }链接 raylib 后编译运行,窗口里就有一条滑块,拖动时speed实时变化,GuiSliderBar在用户松手的那一帧返回 true,方便你打日志或触发计算。编译产物大约多 100KB,运行时内存占用不到 50KB。
底层是怎么做的
想象餐厅点单:服务员每过一分钟来问一次"还要加什么菜吗",你每次口头回答,后厨直接照做。即时模式 GUI 就是这个"每分钟来问一次"——while (!WindowShouldClose())循环里,控件每帧被问一遍"当前值是多少",你的变量本身就是唯一的状态,没有控件树、没有事件订阅。所以状态同步问题天然不存在:变量是 3,界面上就是 3。
拿它解决实际问题
让参数能实时调
调阴影模糊半径这种"改一次、重编译一次"的痛,用一个滑块就能消灭:
float blurRadius = 2.5f; // 每帧调用,bounds 是控件位置,value 传指针,min/max 限范围 GuiSliderBar((Rectangle){570, 90, 180, 20}, "Blur", TextFormat("%.2f", blurRadius), &blurRadius, 0.0f, 10.0f);渲染代码里直接用blurRadius,拖一下立刻见效。仓库里 shapes_pie_chart.c 是完整范例:每个扇区的数值都有独立滑块,改完饼图立刻变形。
把数据画成饼图
展示性图表配上 raygui,就是可调参的交互图表:
int slices = 7; bool donut = false; GuiSpinner((Rectangle){520, 60, 120, 25}, "Slices", &slices, 1, 10, false); GuiCheckBox((Rectangle){520, 100, 20, 20}, "Donut", &donut);GuiSpinner是带加减按钮的数值框,GuiCheckBox管开关。扇区角度按values[i]/total * 360算,绘制用DrawCircleSector循环一遍即可,逻辑 20 行封顶。
换风格只改一行
raygui 的配色和圆角都走GuiSetStyle属性表,不用自己画控件皮肤:
GuiSetStyle(DEFAULT, TEXT_COLOR, RGB(80, 80, 80)); GuiSetStyle(BUTTON, BORDER_COLOR, BLUE);两行代码,全局风格统一改掉。
你大概率会踩的坑
坑 1:窗口里什么控件都不显示现象:编译通过,窗口空白。原因:忘了在raygui.h前定义RAYGUI_IMPLEMENTATION,函数体没被编进来。修复:
#define RAYGUI_IMPLEMENTATION坑 2:滑块值自己乱跳、不受范围约束现象:拖到一半数值越界。原因:minValue/maxValue传错或把float变量误传给GuiValueBox(它只收int*)。修复:
GuiSliderBar((Rectangle){50, 50, 300, 30}, "Vol", NULL, &vol, 0.0f, 1.0f);坑 3:中文或特殊字符显示成方块现象:标签乱码。原因:默认字体只含 ASCII。修复:加载带字符集的字体再挂上去:
GuiSetFont(LoadFontEx("fonts/cjk.ttf", 20, 0, 250));塞进你现有的项目
- 拉取仓库:
git clone https://gitcode.com/GitHub_Trending/ra/raylib - 把 raygui.h 复制到你的源码目录(各 example 目录下都有一份拷贝,任选其一)
- 在你唯一的主 .c 文件顶部加
#define RAYGUI_IMPLEMENTATION,再#include "raygui.h" - 确认工程已链接 raylib,无需额外依赖
- 在
BeginDrawing()后、EndDrawing()前插入控件调用,编译运行
下一步
把面板挪进你正在写的游戏:试试 core 系列示例 里core_custom_frame_control的帧循环改法,再研究滚动面板GuiScrollPanel和风格表GuiLoadStyle的自定义主题。现在打开终端,clone 下来试一遍。
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考