当前位置: 首页 > news >正文

HarmonyOS 小游戏《对战五子棋》开发第31篇 - TwoPlayerPage双人对战(三):结果弹窗与游戏结束处理

游戏结束时的仪式感——结果弹窗的层叠设计

游戏截图:

Stack层叠布局

build(){Stack({alignContent:Alignment.TopStart}){// 第一层:游戏界面Column(){// 导航栏、状态栏、棋盘、按钮...}.width('100%').height('100%').backgroundColor('#F5F0E8')// 第二层:结果弹窗(条件渲染)if(this.showResultDialog){Column(){// 弹窗内容...}.width('70%').padding(32).backgroundColor('#FFFFFF').borderRadius(16)}}.width('100%').height('100%')}

Stack的层叠原理

Stack ├── Column (游戏界面) ← 底层 └── Column (结果弹窗) ← 上层,覆盖游戏界面

Stack中的子组件按声明顺序层叠——后声明的在上层。弹窗声明在后面,所以覆盖游戏界面。

条件渲染

if(this.showResultDialog){Column(){/* 弹窗内容 */}}

showResultDialogtrue时弹窗渲染,为false时不渲染。ArkUI的条件渲染会完全创建/销毁组件。

弹窗触发时机

privateonCellClick(row:number,col:number):void{if(this.result!==GameResult.PLAYING)return;constsuccess=this.engine.placePiece(row,col,this.currentPlayer);if(success){this.refreshBoardData();if(this.result!==GameResult.PLAYING){this.showResultDialog=true;// 游戏结束时显示弹窗}}}

落子后如果result不再是PLAYING(有人获胜或平局),设置showResultDialog = true

弹窗内容设计

Column(){Text(this.result===GameResult.DRAW?'平局!':'游戏结束').fontSize(24).fontWeight(FontWeight.Bold).fontColor('#333333').margin({bottom:8})Text(this.getStatusText()).fontSize(18).fontColor('#E63946').margin({bottom:4})Text(`${this.moveCount}`).fontSize(14).fontColor('#888888').margin({bottom:24})Row({space:16}){Button('返回首页').fontSize(16).fontColor('#555555').backgroundColor('#E8E0D5').borderRadius(24).height(44).onClick(()=>{router.back();})Button('再来一局').fontSize(16).fontColor('#FFFFFF').backgroundColor('#4A90D9').borderRadius(24).height(44).onClick(()=>{this.restart();})}}.width('70%').padding(32).backgroundColor('#FFFFFF').borderRadius(16).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)

弹窗信息层级

┌─────────────────────────┐ │ │ │ 游戏结束 │ ← 24px Bold 主标题 │ 黑方获胜! │ ← 18px 红色 结果 │ 共 47 手 │ ← 14px 灰色 统计 │ │ │ [返回首页] [再来一局] │ ← 44px 按钮 │ │ └─────────────────────────┘

弹窗按钮逻辑

返回首页

Button('返回首页').onClick(()=>{router.back();})

调用router.back()返回Index首页。当前页面的组件和引擎实例会被销毁。

再来一局

Button('再来一局').onClick(()=>{this.restart();})
privaterestart():void{this.engine.reset();// 重置引擎this.showResultDialog=false;// 关闭弹窗this.refreshBoardData();// 刷新UI}

restart关闭弹窗并重置游戏——弹窗通过showResultDialog = false消失,棋盘清空。

弹窗样式

.width('70%')// 宽度70%,两侧留边.padding(32)// 内边距32.backgroundColor('#FFFFFF')// 白色背景.borderRadius(16)// 圆角.justifyContent(FlexAlign.Center)// 垂直居中.alignItems(HorizontalAlign.Center)// 水平居中

Stack的alignContent

Stack({alignContent:Alignment.TopStart})

Alignment.TopStart让未指定对齐方式的子组件(弹窗)从左上角开始排列。但弹窗设置了justifyContent(Center)alignItems(Center),所以内容在弹窗内部居中。

注意:Stack默认居中对齐子组件。如果想让弹窗覆盖全屏并居中,可以:

Stack({alignContent:Alignment.Center}){Column(){/* 游戏界面 */}if(this.showResultDialog){Column(){/* 弹窗 */}// 自动居中}}

本项目TwoPlayerPage使用TopStart让游戏界面从顶部开始,弹窗通过Stack默认行为居中显示。

对比AIBattlePage的弹窗

AIBattlePage的弹窗更复杂——有半透明遮罩层:

@BuilderresultDialog(){Stack({alignContent:Alignment.Center}){// 半透明遮罩Column().width('100%').height('100%').backgroundColor('#00000066')// 40%透明黑// 弹窗内容Column(){...}}}

TwoPlayerPage没有遮罩层,AIBattlePage有——设计上的差异。

总结

结果弹窗的设计要点:

  1. Stack层叠:弹窗覆盖在游戏界面上方
  2. 条件渲染if (showResultDialog)控制显示
  3. 信息层级:主标题→结果→统计→按钮
  4. 弹窗样式:70%宽度、32内边距、16圆角
  5. 按钮逻辑:返回首页或再来一局

弹窗是游戏结束的"仪式感"——它让用户感受到对局的完整闭环。

http://www.cnnetsun.cn/news/3297603.html

相关文章:

  • Pr 剪辑非线性思维实战:3大视觉技巧+2种叙事模板提升混剪质量
  • AssetStudio深度解析:Unity资源提取原理与实战指南
  • DeepSeek数学推理能力天花板在哪?基于12类形式化证明任务的量化评估与4个未公开缺陷预警
  • LV3296与STM32F745ZG信号捕获与跟踪系统设计
  • Python游戏开发入门:Pyglet库核心概念与实战指南
  • RocketMQ 消费模式实战:从广播模式切换到集群模式的3步迁移方案
  • Encounter Test:AI如何通过DD遭遇战测试复杂规则推理能力
  • etipc性能调优:提升Linux内核模块通信效率的完整指南
  • 英雄联盟自动化工具箱:3分钟解决你的游戏烦恼终极指南
  • GEO运营:归因难题与方法论边界
  • Unity实时纹理绘制:InkPainter核心架构与实战应用解析
  • 告别出差:AR远程运维如何让专家“瞬移”到设备现场
  • STM32与PAM8904构建智能警报系统设计指南
  • 养殖场环境智能控制系统:全时值守,24小时守护养殖生产
  • GCC for ARM Cortex-M3 函数调用栈帧分析:从 AAPCS 到 HardFault 回溯实战
  • mba毕业论文开题报告怎么写
  • 彩色烘焙杯颜色怎么搭配甜品?按常规款、主推款和节日款分开测试
  • Windows下CPLEX 20.1.0安装与Python调用全指南
  • 解决VRM4U插件在UE5.3.2打包失败:兼容性、依赖与Shader处理全攻略
  • Android 13+ 后台定位权限适配:从 ACCESS_BACKGROUND_LOCATION 到前台服务 3 步实现
  • 双编码器方案实战:3种扭矩感知方案对比与机器人关节选型指南
  • RocketMQ 消费模式实战:从 PushConsumer 到 SimpleConsumer 的 2 种实现与演进
  • 开源 AI 智能体 OpenClaw 实操指南,Windows/Mac 双系统完整部署流程
  • 小米运动自动刷步数终极指南:5分钟实现全天候步数自动化管理
  • 为什么选择oeGitExt?openEuler社区开发者效率提升工具评测
  • 纽扣电池供电系统优化方案与NBM5100A应用解析
  • Materials Studio 2024安装全链路技术指南:系统兼容、许可配置与驱动适配
  • 微信API:AI工作流的最佳触达方案
  • G6D-ASI继电器与PIC32MX微控制器的直流负载管理方案
  • 专业指南:Citra 3DS模拟器在PC上完美运行任天堂独占游戏的完整方案