挂机放置类游戏开发学习 Part.3 UI布局

news/2026/1/17 17:29:43/文章来源:https://www.cnblogs.com/Noivelist/p/19496725

UI 布局阶段核心目标回顾(落地挂机游戏)

  • 搭建双窗口:「挂机游戏主面板」(核心功能,保留原有数值 / 按钮 / 进度条)+「游戏设置面板」(新增,调整挂机参数、UI 样式);

  • 掌握分组布局:用分组、折叠面板分隔不同功能区域,避免 UI 拥挤;

  • 掌握行列布局:用多列排版让数值和组件对齐,提升美观度;

  • 调整 UI 位置与样式:固定 / 调整窗口大小、位置,优化组件间距,适配游戏界面。

步骤 1:先准备布局所需的辅助全局变量

在 main.cpp 的全局变量区域,新增 2 个辅助变量,用于控制设置面板显示和挂机速度(后续设置面板会用到):

点击查看代码
// 原有挂机游戏核心全局变量
float g_gold = 0.0f;
int g_level = 1;
float g_gold_per_second = 1.0f;
float g_afk_progress = 0.0f;
const float g_progress_max = 1.0f;// 新增:UI布局与设置面板辅助变量
bool g_show_settings_window = true; // 控制设置面板是否显示(默认显示)
float g_afk_speed_multiplier = 1.0f; // 挂机速度倍数(1.0f=正常速度,>1=加速,<1=减速)

步骤 2:搭建双窗口 —— 核心主面板 + 新增设置面板

ImGUI 的窗口核心是 ImGui::Begin()ImGui::End(),每个窗口对应一组独立的Begin/End,通过唯一窗口名称区分,还可以控制窗口的可关闭、可拖动、可缩放等属性。

2.1 优化原有「挂机主面板」(保留功能,新增布局优化)

先保留原有核心功能,添加窗口属性配置,让主面板更规整(替换原有主面板代码):

点击查看代码
// 3. 绘制ImGUI UI(核心:双窗口布局 + 布局优化)
// ========== 窗口1:挂机游戏主面板(核心功能) ==========
// ImGui::Begin参数2:窗口关闭回调(这里设为nullptr,不可关闭,仅可拖动/缩放)
// 额外配置:窗口大小限制(最小宽高),避免缩放过小导致UI错乱
ImGui::SetNextWindowSizeConstraints(ImVec2(400, 300), ImVec2(1000, 800)); // 最小400x300,最大1000x800
ImGui::Begin("挂机游戏主面板", nullptr, ImGuiWindowFlags_NoCollapse); // 禁止折叠窗口,更贴合游戏面板// 原有核心功能(Text + Button + ProgressBar)保留,后续步骤再优化排版
ImGui::Text("当前金币:%.2f", g_gold);
ImGui::Text("当前等级:%d", g_level);
ImGui::Text("每秒收益:%.2f 金币/秒(加速x%.1f)", g_gold_per_second, g_afk_speed_multiplier);ImGui::Spacing();
ImGui::Separator();
ImGui::Spacing();if (ImGui::Button("收取金币", ImVec2(120, 40))) { // 自定义按钮大小(宽120,高40)g_gold += 10 * g_gold_per_second;g_afk_progress = 0.0f;
}ImGui::SameLine();
if (ImGui::Button("升级建筑(消耗100金币)", ImVec2(180, 40))) {if (g_gold >= 100.0f) {g_level += 1;g_gold_per_second += 0.5f;g_gold -= 100.0f;}
}ImGui::Spacing();
ImGui::Separator();
ImGui::Spacing();// 升级:挂机进度条速度受倍数控制(乘以g_afk_speed_multiplier)
g_afk_progress += 0.001f * g_afk_speed_multiplier;
if (g_afk_progress > g_progress_max) {g_afk_progress = g_progress_max;g_gold += g_gold_per_second;g_afk_progress = 0.0f;
}ImGui::Text("挂机自动收益进度:");
ImGui::ProgressBar(g_afk_progress / g_progress_max, ImVec2(0.0f, 20.0f)); // 自定义进度条高度(20)
ImGui::SameLine();
ImGui::Text("%.0f%%", g_afk_progress * 100);ImGui::End(); // 结束主面板窗口绘制

2.2 新增「游戏设置面板」(控制挂机速度、UI 样式)

在主面板ImGui::End()之后,添加第二个窗口的Begin/End,实现设置功能:

点击查看代码
// ========== 窗口2:游戏设置面板(新增,可关闭/显示) ==========
// ImGui::Begin参数2:传入bool变量地址,点击窗口关闭按钮时自动设为false
ImGui::SetNextWindowPos(ImVec2(450, 20), ImGuiCond_FirstUseEver); // 首次打开时固定位置(450,20),后续可拖动
ImGui::SetNextWindowSize(ImVec2(300, 250), ImGuiCond_FirstUseEver); // 首次打开时固定大小(300,250)
if (ImGui::Begin("游戏设置面板", &g_show_settings_window)) {// 功能1:调整挂机速度倍数(用ImGui::SliderFloat实现滑动条)ImGui::Text("挂机速度倍数");// 滑动条:最小值0.5,最大值5.0,当前值g_afk_speed_multiplier,保留1位小数ImGui::SliderFloat("##speed", &g_afk_speed_multiplier, 0.5f, 5.0f, "x%.1f");ImGui::Spacing();// 功能2:切换ImGui UI样式(亮色/暗色)ImGui::Separator();ImGui::Text("UI样式选择");if (ImGui::Button("暗色样式(默认)", ImVec2(140, 30))) {ImGui::StyleColorsDark();}ImGui::SameLine();if (ImGui::Button("亮色样式", ImVec2(140, 30))) {ImGui::StyleColorsLight();}ImGui::Spacing();// 功能3:重置设置(恢复默认值)ImGui::Separator();if (ImGui::Button("恢复默认设置", ImVec2(-1, 30))) { // 宽度-1:自动填充窗口宽度g_afk_speed_multiplier = 1.0f;ImGui::StyleColorsDark();}
}
ImGui::End(); // 结束设置面板窗口绘制

双窗口关键说明

  • 窗口唯一性:两个窗口的ImGui::Begin文本("挂机游戏主面板"、"游戏设置面板")必须不同,否则会重叠覆盖;

  • 窗口可关闭:设置面板的Begin第二个参数传入&g_show_settings_window,点击窗口右上角 ×,该变量会变为false,窗口隐藏;若想重新显示,可在主面板添加一个 “打开设置面板” 按钮,点击时将g_show_settings_window设为true

  • 窗口位置 / 大小固定:ImGui::SetNextWindowPos/Size配合ImGuiCond_FirstUseEver,仅在首次打开窗口时生效,后续用户可自由拖动 / 缩放,兼顾灵活性和首次体验;
    组件自定义大小:ImVec2(width, height)用于设置按钮、进度条的尺寸,width=-1时自动填充当前窗口宽度,适配性更好。

步骤 3:掌握分组布局 —— 用分组 / 折叠面板规整 UI

当 UI 组件较多时,用ImGui::BeginGroup()/EndGroup()(普通分组)或ImGui::CollapsingHeader()(可折叠分组)分隔功能区域,避免混乱,这里优化主面板的数值展示区域为折叠分组:

优化主面板数值展示(添加折叠分组)

替换主面板中的 \(3\)ImGui::Text,改为折叠分组:

点击查看代码
// 原有主面板中,替换数值展示的3行Text
// 可折叠分组:默认展开(ImGuiTreeNodeFlags_DefaultOpen)
if (ImGui::CollapsingHeader("游戏核心数值", ImGuiTreeNodeFlags_DefaultOpen)) {ImGui::BeginGroup(); // 普通分组,规整内部组件ImGui::Text("当前金币:%.2f", g_gold);ImGui::Text("当前等级:%d", g_level);ImGui::Text("每秒收益:%.2f 金币/秒(加速x%.1f)", g_gold_per_second, g_afk_speed_multiplier);ImGui::EndGroup(); // 结束普通分组
}

分组布局关键说明

  • ImGui::CollapsingHeader():点击分组标题可展开 / 折叠,适合存放非核心、可隐藏的内容,ImGuiTreeNodeFlags_DefaultOpen表示默认展开;

  • ImGui::BeginGroup()/EndGroup():将一组组件视为一个整体,方便后续统一调整位置、添加间距,不影响其他组件;

  • 分组嵌套:折叠分组内部可以嵌套普通分组,普通分组内部也可以嵌套组件,灵活适配复杂 UI。

步骤 4:掌握行列布局 —— 用ImGui::Columns实现多列对齐

ImGui::Columns(n, ...)可以将当前窗口分为 \(n\) 列,让组件按列排版,解决 “文本左对齐、数值右对齐” 的需求,这里优化主面板的折叠分组为两列布局:

优化折叠分组为两列布局

替换折叠分组内部的代码:

点击查看代码
if (ImGui::CollapsingHeader("游戏核心数值", ImGuiTreeNodeFlags_DefaultOpen)) {// 行列布局:分为2列,列宽比例1:1,添加列分隔线ImGui::Columns(2, "gold_info_columns", true);// 第一列:标签文本(右对齐,更美观)ImGui::TextAlign(ImVec2(1.0f, 0.0f)); // 文本右对齐(x=1.0f,y=0.0f)ImGui::Text("当前金币:");ImGui::Text("当前等级:");ImGui::Text("每秒收益:");// 切换到第二列ImGui::NextColumn();// 第二列:数值文本(左对齐)ImGui::TextAlign(ImVec2(0.0f, 0.0f)); // 文本左对齐(默认)ImGui::Text("%.2f", g_gold);ImGui::Text("%d", g_level);ImGui::Text("%.2f 金币/秒(加速x%.1f)", g_gold_per_second, g_afk_speed_multiplier);// 结束行列布局,恢复单列ImGui::Columns(1);
}

行列布局关键说明

  • ImGui::Columns(2, "gold_info_columns", true):参数 1 = 列数,参数 2 = 列唯一标识,参数 3 = 是否显示列分隔线;

  • ImGui::NextColumn():切换到下一列,必须手动调用,否则组件会继续在当前列排列;

  • ImGui::TextAlign(ImVec2(x, y)):设置文本对齐方式,x=1.0f右对齐,x=0.0f左对齐,y=0.5f垂直居中,适配多列排版的视觉需求;

  • 结束行列布局:必须调用ImGui::Columns(1),恢复单列排版,否则后续组件会继续按多列排列。

步骤 5:编译运行验证布局效果

核心验证点

  • 运行程序后,出现两个窗口:「挂机游戏主面板」(不可折叠、可缩放)+「游戏设置面板」(可关闭、首次固定位置);

  • 主面板中,核心数值在折叠分组内,两列对齐,排版整齐,按钮和进度条尺寸规整;

  • 设置面板中,滑动条可调整挂机速度,进度条填充速度随之变化,样式切换按钮生效;

  • 窗口可自由拖动、缩放(主面板有最小尺寸限制),关闭设置面板后,可通过新增按钮重新打开(可选扩展);

  • 所有原有功能(收取金币、升级建筑、自动挂机)正常生效,布局优化不影响核心逻辑。

可选扩展:添加 “打开设置面板” 按钮(主面板中)

若设置面板被关闭,可在主面板添加按钮重新打开,代码如下(添加到主面板的按钮区域):

点击查看代码
// 主面板中,升级建筑按钮下方添加
ImGui::Spacing();
if (ImGui::Button("打开设置面板", ImVec2(120, 30))) {g_show_settings_window = true; // 设为true,显示设置面板
}

UI 布局阶段总结

核心是掌握「窗口(Begin/End)」 「分组(Group/CollapsingHeader)」 「行列(Columns)」三大布局工具;

双窗口实现的关键是唯一窗口名称和窗口属性配置,兼顾灵活性和用户体验;

布局优化的核心是 “规整、分层”,让不同功能的 UI 组件分隔清晰,提升游戏界面的美观度;

这个阶段完成后,你的挂机游戏已经具备了完整的 UI 结构,下一阶段就是「逻辑联动」,实现更流畅的实时刷新和复杂逻辑绑定。

恭喜你顺利推进到 UI 布局阶段,运行成功后,就可以为进入「逻辑联动」阶段做准备啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1174276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026年多级泵供应商权威推荐榜单:多级离心泵/污水泵/自吸泵/深井泵/化工泵源头厂家精选 - 品牌推荐官

多级泵作为工业流程、市政供水、建筑消防及暖通空调系统的核心装备,其运行效率、可靠性及使用寿命直接关系到整个系统的稳定性与运营成本。随着国家节能政策的推进与基础设施投入的加大,市场对高效节能、低噪音、高可…

全栈贯通,实效为先:JBoltAI全栈能力集成的落地价值

在AI技术加速渗透各行业的当下&#xff0c;企业智能化转型早已脱离“概念炒作”阶段&#xff0c;进入“实效落地”的深水区。对于Java技术团队而言&#xff0c;AI转型面临的核心难题并非缺乏先进模型&#xff0c;而是如何将分散的AI能力与现有技术体系、业务场景深度融合&#…

sigmoid 函数详解(机器学习基础)

sigmoid 函数详解(机器学习基础)Posted on 2026-01-17 17:23 steve.z 阅读(0) 评论(0) 收藏 举报sigmoid 函数详解(机器学习基础) sigmoid 函数(又称逻辑斯蒂函数)是机器学习与深度学习领域中最基础且核心的…

使用PC浏览器devTool工具调试安卓手机h5页面

背景 开发前端 h5 项目的过程中&#xff0c;经常遇到不同移动端设备的不同浏览器的兼容性问题&#xff0c;尤其是当遇到布局异常问题时&#xff0c;我们往往苦于没有办法去检查移动端设备上的实际元素&#xff0c;从而导致难以定义问题&#xff0c;此时就需要有办法去调试移动…

赋能复杂业务自动化:JBoltAI 链式调用的控制结构设计

在企业级AI应用开发中&#xff0c;复杂业务场景往往需要多步骤、多条件的协同执行&#xff0c;单一的线性调用已无法满足灵活多变的业务需求。JBoltAI作为专注Java生态的企业级AI应用开发框架&#xff0c;其链式调用技术深度融合复杂工作流编排能力&#xff0c;通过条件分支、循…

2025年液体包装机厂家推荐榜:四川西德利自动化科技有限公司,丸剂包装机/粉剂包装机/枕式包装机/粉末包装机/圆角袋包装机/颗粒包装机/包装机/定量包装机/多列包装机厂家精选 - 品牌推荐官

一台包装速度高达70袋/分钟的全自动粉剂包装机,正在医药企业的生产线上飞速运转,精准完成从计量到封口的每一道工序,这正是现代包装工业的一个缩影。 工业包装机械行业正随着全球制造业的升级而快速发展。特别是在中…

学习进度 3

今天的学习目标聚焦解决重复计算的性能问题(RDD 持久化),并摆脱交互式 Shell,完成独立 Spark 应用程序的开发、打包与运行,这也是从 “零散操作” 到 “工程化开发” 的关键一步。 昨天在 Shell 中操作时发现一个…

Flutter OpenHarmony 适配:渐变按钮组件技术详解 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

通化市辉南柳河通化东昌二道江英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

在全球化留学热潮下,雅思考试已成为通化市辉南、柳河、东昌、二道江等区县学子申请海外院校的核心门槛,而优质雅思培训的选择却成为备考路上的首要难题。多数考生普遍面临雅思培训选课迷茫、考试技巧缺失、提分乏力等…

2026线路板灌胶机厂家权威推荐榜单:环氧树脂灌胶机/硅胶灌胶机/手动灌胶机/半自动灌胶机/聚氨酯灌胶机源头厂家精选。 - 品牌推荐官

在电子制造行业持续向精密化、高可靠性与高效率方向发展的今天,线路板的防护性灌封已成为保障产品长期稳定运行的关键工艺。线路板灌胶机作为实现环氧树脂、硅胶、聚氨酯等胶水精确涂覆的核心装备,其技术水平直接决定…

2025年南京回收精密仪器公司权威推荐榜单:废金属收购/ 废金属回收 /高价废金属回收/ 废金属的回收 /废不锈钢废金属回收服务商精选 - 品牌推荐官

随着高端制造业升级和科研机构设备更新换代,南京地区积压的二手及淘汰精密仪器正形成一片“隐形富矿”。据统计,南京及周边地区的高校、科研院所、制造企业每年淘汰的各类精密仪器数量可达数千台,其中电子测量、光学…

白山市浑江江源临江英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

在留学热潮持续升温的白山市,浑江、江源、临江地区越来越多的学子将雅思考试作为开启国际教育之门的关键钥匙。然而,在雅思培训选课过程中,当地考生普遍面临优质资源匮乏、课程适配性差、提分效果不确定、性价比难把…

乐平市雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

基于雅思官方评分标准及全国雅思考生备考大数据,结合乐平市考生对雅思培训的核心需求,我们开展了为期一个月的全面深度测评,覆盖本地及全国主流机构,从师资资质、提分效果、教学模式、性价比等维度构建评估体系,最…

2026年热门流量计选购指南:插入式涡街流量计怎么选?食用油流量计/喷嘴/柴油流量计/氧气流量计,流量计源头厂家哪家强 - 品牌推荐师

随着工业自动化与智能制造的快速发展,流量计作为过程控制的核心仪表,其选型精度直接影响生产效率与成本控制。尤其在高温高压、腐蚀性介质或大口径管道场景中,插入式涡街流量计凭借“非满管安装、维护便捷、耐温耐压…

web入门51-60

web51 分析代码分析tac被禁用了,使用nl代替 ?c=nl<fl\ag.php||lsweb52 分析代码发现<被过滤了,使用${IFS}代替 ?c=nl${IFS}fl\ag.php||ls 注意这关的flag不在flag.php里面,就在flag里面,所以要查看/flag,…

一下午讲了 9 道题?!

省选模拟 CQXYM的线性规划 考虑到 \(x \in \{0,1\}\),显然并不能套用线性规划的做法。 观察到 \(a_i \leq b_i\),那么原限制相当于是对于所有 \(x_i=1\) 的物品,在 \([a_i,b_i]\) 区间内选一个数进行贡献,要求最后…

单锥真空螺带干燥机怎么挑?2026年优质厂家解析,沸腾干燥机/喷雾干燥机/污泥干化,单锥真空螺带干燥机定制厂家找哪家 - 品牌推荐师

在化工、制药、食品等工业领域,单锥真空螺带干燥机作为核心设备,直接影响产品品质与生产效率。其真空环境下的高效干燥能力,可精准解决传统设备能耗高、污染大、热敏性物料易失效等痛点。然而,市场设备性能参差不齐…

监控Source端Pg对Flink CDC的影响

1.pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 htt…

永磁同步电机参数辨识模型,在线辨识,离线辨识,电参数机械参数均可辨识,基于最小二乘法,滑模观测...

永磁同步电机参数辨识模型&#xff0c;在线辨识&#xff0c;离线辨识&#xff0c;电参数机械参数均可辨识&#xff0c;基于最小二乘法&#xff0c;滑模观测&#xff0c;电压注入&#xff0c;模型参考自适应等 机械参数在线 离线 &#xff0c;电气参数在线 &#xff08;三种方法…

Redis技巧:处理大量Key同时过期的5个关键点!

文章目录如果有大量的key需要设置同一时间过期&#xff0c;一般需要注意什么&#xff1f;为什么会有大量Key同时过期&#xff1f;为什么大量Key同时过期会有问题&#xff1f;1. 内存回收压力大2. 阻塞操作3. 磁盘压力如何避免或缓解这些问题&#xff1f;1. 分散过期时间2. 使用…