ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

raygui 即时模式 GUI:如何 5 步给 C 游戏装上可拖动的设置面板

2026/9/10 12:59:59 拓冰建站 浏览量
raygui 即时模式 GUI:如何 5 步给 C 游戏装上可拖动的设置面板 raygui 即时模式 GUI如何 5 步给 C 游戏装上可拖动的设置面板【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib你在写 C 游戏想在屏幕上加一块能让玩家点击、拖动的设置面板。raylib一个轻量跨平台的 C 游戏库为此配套了 raygui——一个单文件即时模式 GUI 库所谓即时指屏幕上所有控件每帧都重新画一遍状态只存放在你的变量里。零构建接入raygui 单文件怎么放进项目raygui 全部代码就是raygui.h一个头文件没有构建系统唯一依赖是 raylib 本身。raylib 仓库在examples/各模块目录下都放了一份副本例如 examples/shapes/raygui.h把它拷进你自己项目的源码目录即可。规矩只有一条整个工程里只有一个源文件承载实现。// ui.c实现放在这里全工程只允许定义一次 #define RAYGUI_IMPLEMENTATION #include raygui.h这个宏让编译器把完整实现展开进这一个编译单元其余文件只写#include raygui.h拿到的是函数声明。若定义两次链接时会撞出重复符号。raylib 已在编译命令行上raygui 随之一并可用。raygui 控件为什么没有状态那控件的状态存哪儿哪儿也不存——这正是即时模式的核心设计。想象一个现做档口厨师每隔一秒把盘子端走重做一遍旧盘子从不保留。菜谱你代码里的变量是唯一真相做菜渲染只是把菜谱翻译成一盘眼见的东西。所以每帧创建一遍控件听着浪费实际不浪费控件没有实例、没有记忆声明即渲染。每帧你把变量的当前值交给控件控件把自己画出来用户若拖动或点了它它就把新值写回你传入的那个变量。写代码时只需记住一句每帧把控件声明出来以变量为准。跑起来20 行最小 raygui 演示把上面说的拼起来得到一个能直接编译运行的最小 demo一个窗口、一个滑块、一个复选框外加一行回显文字。#include raylib.h #define RAYGUI_IMPLEMENTATION // 整个工程只在这一个文件里定义 #include raygui.h int main(void) { InitWindow(480, 260, raygui 练习); float musicVol 35.0f; // 绑给滑块的量 bool gridOn true; // 绑给复选框的开关 while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(BLACK); // 第一参数给位置尺寸指针参数由控件回写新值 GuiSliderBar((Rectangle){ 30, 50, 200, 20 }, 音乐, TextFormat(%.0f, musicVol), musicVol, 0.0f, 100.0f); // 勾选发生的那一帧返回非 0拿它当触发信号 if (GuiCheckBox((Rectangle){ 30, 90, 20, 20 }, 网格, gridOn)) TraceLog(gridOn %d, gridOn); DrawText(TextFormat(vol%.0f grid%d, musicVol, gridOn), 30, 130, 10, WHITE); EndDrawing(); } CloseWindow(); return 0; }两处值得留意所有控件第一参数都是Rectanglex、y、宽、高位置和大小全靠它返回值在本帧刚被操作过时非 0可当触发一次动作的信号。️ raygui 控件选型速查表什么场景用哪个控件适用场景返回值易错点GuiSliderBar连续量音量、透明度、半径非 0 本帧被拖动左右两段文本要自己格式化忘了传最小/最大范围滑块会卡住GuiCheckBox二态开关非 0 本帧被勾选或取消标签画在框右侧控件高度给小了会被裁GuiToggle状态指示 点击切换按钮非 0 本帧被翻转和复选框易混它是整颗按钮的形态GuiDropdownBox多选项里挑一个非 0 本帧选了新选项开合状态要用自存的 bool 回传GuiSpinner步进整数数量、索引、等级非 0 本帧点过加减或改过输入末尾的 editMode 决定能否键入下拉框第 4 个参数editMode是开没开的开关要自己存一个 bool 每帧回传不存的话列表点一下就塌。它的第 2 个参数是分号连起来的选项文本串选中项下标经第 3 个参数写回。下面这张饼图示例里右侧整块就是 raygui 面板spinner 调切片数、复选框切显示模式、滑块管内环半径源码在 examples/shapes/shapes_pie_chart.c。窗口缩放不失乱raygui 锚点布局做法窗口一拉大坐标还硬写吗实用做法是每帧用GetScreenWidth()/GetScreenHeight()反推锚点控件只相对锚点排布。int w GetScreenWidth(), h GetScreenHeight(); float ax (float)(w - 240 - 24); // 240 面板宽24 右边距 float ay (float)(h - 90 - 24); // 从底缘反推面板跟着窗口走 GuiSliderBar((Rectangle){ ax 16, ay, 208, 20 }, 等级, TextFormat(%d, level), level, 1.0f, 9.0f);注意取的是逻辑分辨率开了高分屏缩放时返回值已是缩放后的逻辑像素别自己再乘 DPI 系数。仓库 examples 里的样条编辑器是另一路玩法右侧是 raygui 下拉框与滑块画布上的控制点可自由拖动——命中检测每帧拿鼠标坐标减去控件bounds就行。 raygui 排障清单4 个高频坑文字溢出控件框现象文字顶出控件上下边缘原因默认字号偏大而控件高度给小了改法控件高度加到 24~30或用GuiSetStyle(DEFAULT, TEXT_SIZE, 10)整体缩字号中文显示成方块现象中文标签变成一排方框原因内置字形表不含 CJK 字符改法GuiSetFont(LoadFontEx(cjk.ttf, 20, 0, 256));换成含对应字形的字体文件同帧操作两个控件只生效一个现象输入被吃掉只有其中一个控件有反应原因带焦点的控件ValueBox、TextBox 等同时 editMode 为 1输入被后声明者抢走改法同一时刻只留一个控件 editMode 为 1其余给 0每帧 TextFormat 带来分配抖动现象profiler 里小分配成串帧时间抖动原因每次 TextFormat 都新分配字符串堆反复切割改法结果缓存进char buf[32]只在值真正变化时重算控件跑通之后raygui 三个进阶方向接下来值得试三件事用GuiSetStyle换一套贴合游戏的配色与字号让控件与自绘内容比如示例里那块饼图拼出半托管界面再去examples/目录里翻更多用例看别人怎么把屏幕撑满。raygui 的哲学自始至终只有一句控件不存状态。记住每帧声明、变量为准界面就可以放心删了重写。【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考