FEATURED · 精选文章

raylib 的 raygui:20 行 C 代码搭出可拖动的游戏 GUI 面板

发布时间 / 2026/9/10 15:08:07
来源 / 创域科博编辑部
栏目 / 资讯中心
raylib 的 raygui:20 行 C 代码搭出可拖动的游戏 GUI 面板 raylib 的 raygui20 行 C 代码搭出可拖动的游戏 GUI 面板【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib你的游戏缺一个能拖能点的设置面板又不想为了几根滑块引入一整套 UI 框架。raygui 是 raylib 游戏库自带的即时模式 GUI 模块一个单文件头就能用。读完这篇你能在 C 项目里跑出滑块、复选框、下拉框并把一整块控制面板钉在窗口边缘。先跑起来#include raylib.h #include stdio.h #define RAYGUI_IMPLEMENTATION // 全项目只在一个 .c 里这样写 #include raygui.h int main(void) { InitWindow(640, 360, raygui minimal); float volume 60.0f; bool soundOn true; while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); char buf[32]; snprintf(buf, 32, vol %d, (int)volume); // 本帧被拖动则返回非 0新值写回 volume GuiSliderBar((Rectangle){ 40, 60, 240, 24 }, 音量, buf, volume, 0.0f, 100.0f); // 返回 1 的那一帧正好是勾选状态改变的那一帧 if (GuiCheckBox((Rectangle){ 40, 100, 22, 22 }, 声音, soundOn)) PlaySoundClick(); char dbg[32]; snprintf(dbg, 32, soundOn %d, soundOn); DrawText(dbg, 40, 150, 20, BLACK); EndDrawing(); } CloseWindow(); return 0; }三句话点评全是坑位RAYGUI_IMPLEMENTATION只在一个.c文件里定义写两处会直接链接报重复符号每个控件第一参数都是Rectangle长什么样不重要在哪儿、多大完全由这个矩形说了算控件返回值是本帧有没有被操作新值通过指针参数回写所以volume传的是指针不是值——想传60.0f编译器会拦你但你心里得清楚这是规矩。原理一句话把它想成餐厅服务员每帧他拿小票过来记下你的变量值交给后厨画出来画完小票撕掉——没有常驻控件也没有状态机。所以你的变量就是唯一真相60 FPS 下所有滑块每帧重建并不浪费声明本身就是渲染这就是即时模式的全部秘密。控件删了重写都不怕乱因为乱不了。按目标选控件让数值连续可调调音量、难度、透明度这类量用滑块要整数步进用 spinner。float master 0.8f; int level 3; GuiSliderBar((Rectangle){ 40, 80, 220, 20 }, 主音量, TextFormat(%d%%, (int)(master * 100)), master, 0.0f, 1.0f); GuiSpinner((Rectangle){ 40, 120, 140, 30 }, 难度, level, 1, 10, true);滑块的两个文本参数只是标签值要自己TextFormat出来再传。GuiSpinner的editMode传true表示这一帧允许直接点输入框手打不想要就传false。让选项二选一或多选一开关闭合用复选框档位切换用下拉框。bool paused false; bool dropOpen false; // 必须自己存下一帧原样传回 int zone 0; GuiCheckBox((Rectangle){ 40, 160, 22, 22 }, 暂停, paused); GuiDropdownBox((Rectangle){ 40, 200, 160, 30 }, 简单;普通;困难, zone, dropOpen);下拉框的editMode必须存进变量回传传常量false的后果是菜单刚展开下一帧就被关掉。复选框返回true的那一帧就是状态改变瞬间适合触发一次性动作之后每帧都是 0别拿它当持久状态读。让长列表滚得动条目超过一屏就把列表装进滚动面板int rows 8; Rectangle row { 40, 40, 200, 30 }; Vector2 scroll { 0 }; Rectangle view { 0 }; GuiScrollPanel((Rectangle){ 40, 40, 200, 180 }, NULL, (Rectangle){ 0, 0, 200, (float)(rows * 35) }, scroll, view); BeginScissorMode((int)view.x, (int)view.y, (int)view.width, (int)view.height); for (int i 0; i rows; i) { row.y view.y scroll.y 5 i * 35; char t[32]; snprintf(t, 32, Item %d, i); GuiButton(row, t); } EndScissorMode();view是库算出来的可见窗口BeginScissorMode/EndScissorMode负责裁掉视口外的行这一步漏了控件会溢出到面板外面。滚动偏移归库管你只管下一帧接着传scroll不用自己写滚轮监听。面板之外的部分照旧是普通游戏绘制可拖拽的控制点、曲线、菜单全在一块画布上混排互不打架。官方示例拆解examples/shapes/shapes_pie_chart.c 是个好标本左边一张饼图右边一整块 270 像素宽的控制面板。面板里的代码很典型GuiSpinner((Rectangle){ panelPos.x 95, (float)panelPos.y 12, 125, 25 }, Slices , sliceCount, 1, MAX_PIE_SLICES, false); GuiCheckBox((Rectangle){ panelPos.x 20, (float)panelPos.y 12 40, 20, 20 }, Show Values, showValues); GuiSliderBar((Rectangle){ panelPos.x 80, (float)panelPos.y 12 130, panelRect.width - 100, 30 }, Inner Radius, NULL, donutInnerRadius, 5.0f, radius - 10.0f);分界线很干脆raygui 负责输入采集、控件外观、滚动视口GuiScrollPanel你负责把values[]画成饼、用atan2f算出鼠标悬停在第几片。所有Gui*()调用在右边所有DrawCircleSector()和角度计算在左边。面板锚在右上角x 坐标由screenWidth - panelMargin - panelWidth反推——窗口怎么拉它都贴边。切片数一变每行滑块就重新生成所以values[]数组必须留在帧外存着不然数据每帧清零。常见问题排查表现象原因解法链接报重复符号GuiSliderBar already definedRAYGUI_IMPLEMENTATION在多个.c里都定义了只在其中一个定义其余文件直接 include下拉框点一下就消失editMode传了常量false用bool变量存开合状态每帧回传中文控件文字显示成方块内置默认字体不含 CJK 字形GuiSetFont(LoadFontEx(fonts/cjk.ttf, 22, 0, 256))换字体文字溢出控件框默认字号与控件高度不匹配调大控件height或用GuiSetStyle(DEFAULT, FONT_SIZE, ...)调小字号点击事件只触发一次GuiCheckBox返回值只在状态改变那一帧为 true想读持久状态就取*checked想做事就在那一帧处理接入清单git clone https://gitcode.com/GitHub_Trending/ra/raylibraygui.h这个单文件头在 examples 的每个模块目录里都有一份拷一份进你项目的src/。挑一个.c文件在#include raygui.h之前写#define RAYGUI_IMPLEMENTATION其余源文件只写 include。编译时链接 raylibLinux 下一行搞定gcc demo.c -lraylib -lGL -lm -lpthread -ldl -o demoWindows 与 Web 平台走 raylib 官方 CMake / Makefile把raygui.h一起带上即可。收尾raygui 的哲学就一句变量即真相——界面随时可以删了重写只要每帧声明一遍控件就永远跟数据同步。接下来值得玩的方向用GuiSetStyle()调字号和配色或GuiLoadStyle()直接加载.rgs样式文件换主题再去 examples 里翻翻GuiTabBar、GuiColorPicker、GuiTextBox看看别人怎么把整块屏幕铺满。【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻