raylib+raygui:30行C代码搭出会动的游戏设置面板 raylibraygui30行C代码搭出会动的游戏设置面板【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib周五晚上你刚把游戏主循环跑通现在想加个设置菜单——音量、分辨率、暂停按钮。可一想到要引一个几百KB的UI框架、配置状态树和回调就犯怵。其实 raylib 自带的 raygui官方单头文件的即时模式控件库就能解决把 raygui.h 拖进项目30行代码里你就能拖出一个会响应鼠标的面板。这篇带你从零把滑块、按钮、复选框跑起来并附上三个能直接抄的场景。30秒跑通第一个 raygui 窗口先别管控件先把窗口和一行文字画出来。把仓库里examples/shapes/raygui.h拷进你的目录写这么短的 main#include raylib.h #define RAYGUI_IMPLEMENTATION #include raygui.h int main(void) { InitWindow(800, 450, raygui 冒烟测试); while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); GuiLabel((Rectangle){30, 30, 300, 20}, hello raygui); EndDrawing(); } CloseWindow(); return 0; }编译运行窗口里左上角会有一行灰字。就这么几行raygui 已经接管了字体和绘制。它不需要你链接额外库头文件自己带实现这就是单头文件设计的省事之处。即时模式到底在做什么保留模式那套控件画完就存着、你维护一棵状态树、点哪个弹哪个回调一句话带过就行这里不展开了。raygui 反过来每一帧你在主循环里重新调用一遍GuiLabel、GuiSliderBar……它根据当前变量值把控件画出来同时检查鼠标落点值变了就帮你改指针。说白了界面是你每帧重述一遍的结果而不是一个存下来的对象。这个设计的代价是坐标得自己摆没有布局引擎好处是你的 C 变量就是界面状态没有隐藏的对象生命周期。调试时你打印那个float看到的正是用户此刻拖到的值。三个真实场景菜单、面板、原型下面三个场景对应三种项目游戏内的暂停菜单、跑数据的监控面板、验证想法的原型。代码都不长你照着改坐标和变量名就能用。场景一游戏暂停菜单暂停菜单的核心是几个按钮加一个开关。raygui 的GuiButton在点击那一帧返回非零你拿它当触发器就行int menu 0; // 0暂停, 1设置 bool fullscreen false; if (GuiButton((Rectangle){300, 100, 150, 40}, 继续游戏)) menu 0; if (GuiButton((Rectangle){300, 160, 150, 40}, 设置)) menu 1; GuiToggle((Rectangle){300, 220, 150, 40}, 全屏模式, fullscreen);跑起来三个控件竖排在中间点继续游戏或设置会让menu变GuiToggle每点一次翻转fullscreen。你会注意到GuiButton只在按下那一帧为真不是持续为真所以放主循环里不会被重复触发。场景二数据监控面板监控面板要的是一个旋钮调一个量。GuiSpinner适合整数步进比如切片数量GuiSliderBar适合连续浮点右边那串文字就是当前值的实时显示int slices 7; float innerR 0.3f; GuiSpinner((Rectangle){520, 80, 125, 25}, Slices , slices, 2, 8, false); GuiSliderBar((Rectangle){520, 120, 210, 20}, 内环, TextFormat(%.1f, innerR), innerR, 0, 0.8);仓库里的shapes_pie_chart示例就是这套右侧一列控件左半边画饼图你拖滑块切片和内环半径就实时变。你会注意到滑块右侧的TextFormat字符串每帧被重新算一遍所以你看到的数字永远跟变量同步不存在显示没刷新这种 bug。场景三原型快速验证调参数找手感时你要的是随手拉一下就看效果。这正是 raygui 最舒服的地方——把每个Draw*函数旁边挂一根滑块float roundness 0.15f; bool drawRounded true; GuiSliderBar((Rectangle){640, 40, 105, 20}, Width, TextFormat(%.2f, width), width, 0, 500); GuiSliderBar((Rectangle){640, 70, 105, 20}, Height, TextFormat(%.2f, height), height, 0, 400); GuiCheckBox((Rectangle){640, 320, 20, 20}, DrawRounded, drawRounded);shapes_rounded_rectangle_drawing就是这个套路右边一列滑块和复选框左边的矩形宽度、圆角跟着变。你会注意到坐标都是写死的绝对值没有布局系统——原型阶段这反而是好事你想让控件去哪就写到哪不用先学一套排版规则。踩过的坑三行修复滑块数值跳变、不跟手→ 原因GuiSliderBar收的是float *你传了int的地址类型不匹配导致读写错位 → 修复float level 0.0f;再传level。中文显示成方块或乱码→ 原因内置默认字体只覆盖 ASCII → 修复Font f LoadFontEx(fonts/you.ttf, 32, 0, 250); GuiSetFont(f);在InitWindow后调用一次。控件互相吃掉点击→ 原因两个Rectanglebounds 重叠raygui 按绘制顺序命中先画的盖住后画的 → 修复每行 y 递增、不重叠比如{panelX, 80, 180, 20}和{panelX, 120, 180, 20}之间留足间距。它不适合你吗raygui 是轻量级 C 界面方案强项是少量控件、跟图形一起画。它没有布局引擎、没有滚动容器、没有多窗口/多文档管理做复杂表单或多窗格 IDE 会很痛苦。那种需求就去用 Dear ImGui 或平台原生 UI 库别硬扛。你只是给游戏加点菜单、参数面板、调试 HUDraygui 正好。把examples/shapes/raygui.h拷进项目目录顶部#define RAYGUI_IMPLEMENTATION再#include用GuiSliderBar替换你现在那个int输入框值直接绑到变量上给主循环里每个GuiButton套if (...)别在循环外判断中文乱码就LoadFontExGuiSetFont一行搞定控件是每帧重述出来的变量就是界面剩下的交给鼠标。【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

嵌入式状态机与事件驱动设计:从超级大循环到表驱动架构

嵌入式状态机与事件驱动设计:从超级大循环到表驱动架构

在嵌入式开发中,业务一复杂,代码就开始失控。这个场景你一定见过:一个while(1)超级大循环,里面堆满if (flag)判断;一个按键要应对不同运行状态;一个通信协议要处理各种帧类型。代码越加越长,越改…

2026/9/2 23:09:31
10分钟装好yuzu:一篇能照着跑通的Switch模拟器上手手册

10分钟装好yuzu:一篇能照着跑通的Switch模拟器上手手册

10分钟装好yuzu:一篇能照着跑通的Switch模拟器上手手册 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu模拟器是一款开源的任天堂Switch模拟器,用C编写,同时维护Windows、Li…

2026/9/2 23:09:31
WSL2 网络配置实操指南:NAT、桥接、镜像 3 种模式怎么配,5 分钟改对

WSL2 网络配置实操指南:NAT、桥接、镜像 3 种模式怎么配,5 分钟改对

WSL2 网络配置实操指南:NAT、桥接、镜像 3 种模式怎么配,5 分钟改对 【免费下载链接】WSL Windows Subsystem for Linux 项目地址: https://gitcode.com/GitHub_Trending/ws/WSL 你在 WSL 里起了个服务,Windows 浏览器却打不开对应端口…

2026/9/2 23:09:31
3步跑通tinygrad深度学习框架:从0到可用的完整指南

3步跑通tinygrad深度学习框架:从0到可用的完整指南

3步跑通tinygrad深度学习框架:从0到可用的完整指南 【免费下载链接】tinygrad You like pytorch? You like micrograd? You love tinygrad! ❤️ 项目地址: https://gitcode.com/GitHub_Trending/tiny/tinygrad tinygrad 是一个自包含的深度学习框架&…

2026/9/2 23:09:31
横滨赛止步16强:别急着说落后,先学会复盘比赛

横滨赛止步16强:别急着说落后,先学会复盘比赛

横滨赛中国男乒止步16强,这个标题在热搜上挂住后,很多人的反应是“离谱”,然后是“我们是不是真的落后一个版本了”。我的第一反应不太一样:先不看结论,先看这个结果是在什么条件下出现的。单场淘汰制里,一…

2026/9/2 23:09:31
技术博客选题指南:聚焦软件开发与人工智能,避开非技术内容

技术博客选题指南:聚焦软件开发与人工智能,避开非技术内容

该标题涉及竞技体育新闻,不属于 CSDN 技术博客的内容范畴。CSDN 平台的核心受众是软件开发、人工智能、架构设计、运维、数据库等技术开发者,发布非技术类赛事报道会破坏平台定位,也无法满足技术文章的规范要求。如果要写技术文章&#xff0c…

2026/9/2 23:04:30