MatchMaster/docs/cloudRise-prefab.md
2026-09-16 12:44:01 +08:00

148 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 百人赛 Prefab 与登录预加载
更新日期:2026-09-12。产品规则继续使用 PRD V1.1,包括阶段间必须手动点击开始。
## 资源与代码位置
```text
assets/cloud_rise/ 独立活动分包
prefab/CloudRise.prefab 活动页面,布局维护的唯一来源
scripts/CloudRisePanel.ts 页面数据绑定、按钮响应、动态名单
scripts/CloudRiseRuntime.ts 活动状态、持久化队列、关卡结算与恢复
scripts/CloudRiseSurface.ts 可在编辑器预览的圆角底板组件
images/ 原始美术资源
```
主包只保留必须先运行的接入代码:`CloudRiseService.ts` 查询资格、加载分包和转发主线事件;`CloudRiseView.ts` 挂载首页/游戏入口、实例化页面、协调暂停和首页弹窗。主包没有静态导入分包业务类,也没有直接引用活动 Prefab 或图片。
## 在 Cocos Creator 2.4.15 中维护
双击 `assets/cloud_rise/prefab/CloudRise.prefab` 进入 Prefab 编辑模式。固定页面节点不再由脚本生成;在编辑器修改坐标、尺寸、颜色、字体、图片及按钮样式后保存即可。
根节点 `CloudRisePanel` 挂载同名控制组件。`Design` 的尺寸为 1080×2200,运行时按可视区域等比适配。只有半透明黑色遮罩填满屏幕:首页保留在弹窗后方。总览底板按设计稿使用 902×1366 的九宫格图片,其他页面使用独立的圆角弹窗底板。
总览、匹配、进度与胜利结算金额使用 `CloudRiseNumberToImage`,Inspector 中可调整默认金额、数字高度、宽度比例、间距和金币间距。每个 `Digits` 容器固定包含 `Digit0`~`Digit4` 五个 Sprite 节点,根据接口奖池或已保存奖励逐位替换 SpriteFrame,不足五位时隐藏剩余节点;金额变化不创建、销毁节点。配置金额限制在 0~99999,超出五位不会截断后显示错误金额。组件的 `digits` 数组仍绑定 0~9 共十张图片,它是字形资源表,不是节点数量。
奖池数字通过 `reward_mask` 材质在一个 Sprite 内绘制白边、红棕描边和黄色填充,不再用多层节点叠加。材质接收各字形的图集范围与显示尺寸,边缘采样不会串到相邻数字;`reward_digits` 图集应保持不旋转、不参与动态合图。胜利奖励继续使用带描边的原始数字素材。金额变化时自动居中排版,必要时缩小至节点宽度内。图片、图集和材质均在活动分包的 `images/`,不依赖主包字体图集。页面的 Overview Pool 字段绑定这个组件,不能绑定 Label。
总览金额优先采用当前阶段记录的 pool;等待进入下一阶段时采用下一阶段配置值。倒计时统一使用深蓝圆角底、白色时钟和 `HH:mm:ss`,不附加“报名剩余/挑战剩余”文字;报名窗口与个人配置时长截止时间的判断规则保持不变。
| Design 下节点 | 用途 |
| --- | --- |
| Overview | 三阶段总览、阶段奖池、开始/开始下一阶段按钮 |
| Matching | 匹配过程 |
| Progress | 当前阶段进度、人数、奖池和台阶 |
| Result | 共用的成功/失败/超时结算页面 |
| Participants | 带裁剪区域的 100 人名单 |
| Templates/ParticipantRow | 名单行模板,一行 4 人 |
| Close、Error、Retry | 共用关闭、错误提示与重试按钮 |
默认只激活 Overview。编辑其他页时,先关闭 Overview,再激活要维护的页面;保存前可恢复为 Overview,运行时控制器也会按状态切换。Templates 默认关闭,编辑名单模板时可临时激活;保存后关闭,以免把模板本体显示在页面上。
Progress 内三组台阶分别为 5、7、9 关,各组位置均已存入 Prefab。头像队伍站在当前关卡云上表示进度,代码不覆盖云朵坐标。名单通过复制 ParticipantRow 并由 Content 的 `cc.Layout` 排列,调整行高或间距可直接编辑模板和 Layout。
运行时,CloudRisePanel 以 Prefab 坐标为基准,让当前激活的 StageSteps 下各 Step 上下浮动,振幅为 8~12 个设计像素,各云朵周期错开。进度页和逐关淘汰展示期间均播放,隐藏阶段不运动;离开页面或切换阶段时恢复基准位置。停留在云上的头像同步浮动,起跳或掉落时解除跟随,落地后跟随目标云朵。
重要引用通过根组件 Inspector 字段保存:Pages 的顺序为总览、匹配、进度、结算、名单;Buttons 的顺序为关闭、开始阶段、查看名单、返回总览、返回进度、重试。进度页的起点云为装饰节点,不提供继续闯关入口。移动或重命名这些引用节点不影响绑定;删除节点后应重新绑定对应字段。
关闭按钮 `Design/Close` 使用 `images/close.png`,从 newbieGift 所用的 `assets/res/close.png` 原样复制,并在活动分包内分配独立 UUID。新美术到位后替换这个节点的 Sprite Frame 即可,保留 Button 组件及根组件 Buttons 的第一个引用。原有紫色底板和“关闭”文字已移除。
头像模板内部的 `Face/Photo`、`Face/Cat`、`Name`、`Status` 为绑定约定,不要直接改名;若修改,需同步 `CloudRisePanel.avatar()`。圆角底板通过 CloudRiseSurface 的 Radius、Border Width、Border Color 和节点颜色维护。
总览六种状态的说明文案可以修改根组件的 Overview Copy。阶段数、进度、奖励、人数和动作按钮文案由业务状态决定,运行时会更新相应 Label 内容,但保留 Prefab 的布局和字体样式。
## 登录后加载策略
登录接口成功、玩家资料和本地金币恢复完成后,`GameManager` 调用 `CloudRiseService.afterLogin()`。该方法不加入登录完成条件、不阻塞进入首页,也不创建匹配。
1. 先请求服务端 `cloudRise/cloudRise`(action 为 `status`),不能仅凭旧的本地活动存档决定下载。
2. 满足以下任一条件,后台加载 `cloud_rise` 并准备 `prefab/CloudRise` 及其引用资源:当前服务端允许报名,且报名窗口有效;或者玩家轮次处于 playing/waiting,且个人截止时间未到;或者存在已成功但 rewardSaved 尚未完成的阶段,需要补存奖励。
3. 报名已结束但个人挑战仍有效,继续预加载;未开放、未达到资格、已用完机会且无进行中挑战、已超时或资格查询失败,不自动下载分包。
4. 预加载只准备资源,不实例化页面、不自动开始阶段,不提前加载 100 个头像。
5. 多个入口共用同一次分包/Prefab 加载;成功后保留 Prefab 引用以供页面复用,失败后允许重新加载。进入页面时等待同一个加载任务,后台失败不会使登录失败。
6. 在本次会话参与中的失败、完成或超时,仍可以显示结算。登录时仅有已结束历史记录,不为了自动弹历史结果额外下载分包;玩家主动点历史活动入口时才按需加载。
百人赛请求的 uid 与本地存档键 `cloudRise:<onlyId>` 使用登录返回的 `users.onlyId`,客户端对应 `GM_INFO.userId`。Runtime 中的未完成尝试恢复、离线已记录胜利补传、手动开启阶段继续沿用;金币由 Runtime 在前端计算,上报保存成功后更新本地余额。
后台配置删除 `status/enabled`,报名只按 startsAt/endsAt 判断。个人期限取报名时 durationHours(小时,默认 24),已报名期限不受改配置影响。全部完成、失败、超时后隐藏入口,未播放结算仍独立处理。
## 本地检查
```sh
node --test tools/test-cloud-rise.cjs tools/test-cloud-rise-prefab.cjs tools/test-prop-guide.cjs tools/test-battle-pass.cjs
node tools/preview-cloud-rise.cjs
```
预览默认读取 `build/cloud-rise-prefab-verification/web-mobile`,必须先完成一次 web-mobile 构建。可用环境变量 `CLOUD_RISE_BUILD` 指定其他同版本构建目录。预览使用实际构建的 Prefab、脚本、引擎和资源包,只替换活动接口状态,不访问生产 API。重新构建后重启预览进程以刷新带哈希的引擎文件名。
构建目录:`build/cloud-rise-prefab-verification`。验证时需要检查 CloudRisePanel、CloudRiseRuntime、CloudRiseSurface 的模块定义只存在于 cloud_rise 的脚本包,且 Prefab 只存在于活动包;只看源目录不足以证明没有被主包引用。
本次改动不包含云函数部署或活动开放。小游戏真机的下载耗时、低内存情况和后台恢复仍需在发布前验收。
验证结果:前端相关 45 项、后端专项 23 项通过;类型检查与基线相比无新增诊断(原有 17 条保留)。web-mobile 和 wechatgame 构建均退出 0,构建产物确认业务/页面模块未进入主包。实际 Prefab 预览已验证报名、三阶段进度、手动开始下一阶段、成功/失败/超时和名单滚动,无新页面控制台错误。
2026-09-12 身份与关闭按钮调整验证:前端 45 项、后端 23 项通过;Web 构建成功,onlyId 请求与按状态读取活动均由真实前后端联调测试覆盖。
前端发奖方案更新:已移除 CloudRiseWallet 及跨活动累计奖励补差,结果页对未保存的成功奖励显示“奖励待到账”。历史构建记录保留供参考,当前验证见开发记录。
## 2026-09-14 匹配与逐关淘汰动画
- Matching 页新增可编辑的 AnimationGrid、AnimationDetail,Prompt 和 Count 分别绑定 Animation Title、Animation Count。固定布局仍在 Prefab 内;运行时复制 ParticipantRow 的头像模板,生成 10×10 的 100 人名单。
- 点击开始后先等待匹配;拿到服务端实际对手后,头像依次缩放弹出并更新人数,展示匹配成功后进入进度页。等待及动画期间禁止重复操作。
- 主线关卡不显示活动入口。仍保留 CloudRiseView 组件处理同步和通关展示,首页入口规则不变。
- 每次服务端确认连胜进度增加,将前后阶段快照写入本地 journal.eliminations。仅本关新淘汰的头像下落淡出,先前被淘汰的头像保持暗淡;无人淘汰和阶段最终胜利也会展示。
- Map 原有胜利结算前播放待展示的淘汰动画。网络同步和资源加载各最多等待 2.5 秒;未能展示的记录保留,后续首页弹窗队列补播,并先于阶段结算。普通未报名玩家不等待活动同步。
- 播完才移除记录;轮询及重试不重复生成,页面销毁不会误记为已播放。动画不改变奖励计算、胜负上报及手动开始下一阶段的规则。
检查:百人赛状态、页面、Prefab 与动画测试共 45 项通过,道具引导及通行证相关 27 项通过。客户端类型检查仍为原有 17 项诊断,本次相关文件无新增诊断。通过 Cocos 预览引擎加载当前源码和原始 Prefab、复用已有构建纹理,验证了匹配弹出及逐关淘汰画面;完整 web-mobile 构建停在资源库初始化后已停止,尚未验证本次完整发布产物。
## 2026-09-14 按中间态效果图调整匹配页
Matching 页已改为 `百人赛界面中间0909-.jpg` 对应的全屏星空场景,包含标题、月亮、桂花枝、宝箱云朵、动态奖池、提示框和底部头像云朵。背景等比铺满,其他元素保留设计稿比例。匹配页无倒计时或关闭按钮;首页总览仍是弹窗。
新增 `matching_prompt_background`、`matching_prompt`、`matching_frame_left`、`matching_frame_right` 原始素材及独立 UUID。匹配奖池复用 CloudRiseNumberToImage,报名阶段使用接口配置,匹配返回后使用实际 stage.pool。
匹配头像逐个累积,已出现的头像不再隐藏、替换或移动。使用与进度页一致的错排堆叠布局,自己在前排,最多展示 18 个对手代表头像;头像框复用 Prefab 的 BackLeft、BackRight、Front 模板。每个代表头像弹出后按其对应批次更新匹配人数,最终显示完整名单的 100/100,再切换到进度页。只有开始下一次阶段匹配时才清理上一组头像;页面销毁时停止所有头像动画。
Pages 第 2 项绑定新的 Matching。Matching Background/Prompt/Title/Count/Reward/Slots 分别绑定对应节点或组件。曾使用的独立 Elimination 网格页已由下述云梯跳跃演出取代,胜负展示均复用 Progress 页。
验证:48 项百人赛相关测试通过,覆盖 100 个独立头像、固定位置不重叠、旧头像保留、下一阶段清理与逐关淘汰。Cocos 源码与原始 Prefab 预览确认人数递增至 100/100、先出现的头像在后续弹出期间身份和位置不变、最终全部可见,无页面脚本异常。尚未验证完整发布构建。
## 2026-09-14 按游戏内效果图调整进度页
Progress 使用 `百人赛界面游戏内0909.jpg` 对应的全屏星空场景,关闭原有弹窗底板。顶部为本阶段的月桂树、捣药台或广寒宫,统计栏使用原始标题、分界线和紫边底框,倒计时保留玩家本轮固定的个人截止时间。
阶段 1/2/3 分别显示 5/7/9 朵关卡云,使用原始 `登云.png` 和 `小圆点.png` 组成从底部通往宝箱的路线。云朵保持完整显示,当前进度由头像队伍所在位置表示。起点云和宝箱云为装饰,不计入关卡数量。对应位置、大小、连接点都保存在 Prefab;9 关路线的云朵稍小以完整展示。
`Progress Pool` 改为绑定 CloudRiseNumberToImage,显示当前 `stage.pool`(默认 10000/15000/20000,支持后台配置的其他金额),不再使用黄色文字 Label。右上角保留关闭入口;底部起点云只展示头像队伍,不提供“继续闯关”文字或点击操作;点击统计栏的剩余人数可查看参赛名单。
验证:源码及原始 Prefab 预览逐一核对三个阶段的云朵数量、关卡统计、勾选标记和奖池,额外验证自定义金额 23456、参赛名单往返及继续闯关。页面无脚本异常;类型检查仍为此前 17 项诊断。完整发布构建尚未验证。
## 2026-09-14 云梯头像队伍与胜负演出
初始队伍在右下角起点云,玩家自己位于前排并使用较大的蓝色头像框。显示自己和最多 18 个对手头像,允许堆叠遮挡;人数统计始终使用完整服务端名单。正常查看进度时,存活队伍位于当前已通过的关卡云上,替代先前的绿色勾选。Progress Start 为起点头像坐标,Progress Roster 为统一头像绘制层。
头像队伍按 4/5/5/4 个对手错排,扩大横向间距和纵向露出面积。起点队伍使用 1.3 倍布局和头像尺寸,宽约 350 设计像素,自己位于前排中央;跳到关卡云时随落地动画收至对应云朵可承载的大小。匹配页复用同样的错排布局,进一步放大到宽约 400 设计像素,避免原先大量微小头像铺成网格。
每次确认关卡结果都在 Progress 页播放:成功时自己先跳到下一朵云、其他过关者随后跳、淘汰者最后掉落;失败时过关者先跳到下一朵云、自己掉落、其他淘汰者最后掉落。成功后更新个人通关数,失败时个人通关数保持不变;掉落过程更新人数,最终与服务端 survivors 一致。动画样本同时包含幸存与淘汰者,未抽样展示的对手仍计入统计。
胜利和失败均持久化前后快照到 journal.eliminations,失败键增加 `:lost` 后缀,避免与同一通关数的胜利演出冲突。只有服务器确认的状态变化生成记录,完成播放才确认移除。断网、关页或重启会保留未播放记录,联网后补播。复活机会出现时不判负;最终放弃、重开和失败确认等待本次演出后再继续原有流程,重复点击由统一入口拦截。
验证:实际 Cocos 源码与 Prefab 预览检查了初始 100 人队伍、成功和失败两种跳跃/掉落顺序、人数结算及前后云朵落点,无页面脚本异常。专项测试覆盖播放顺序、全员失败、最终胜利、失败断网恢复、去重及播放期间离开场景。完整发布构建尚未验证。
## 2026-09-14 获胜结算与下一阶段衔接
获胜结果使用 `Design/Victory` 遮罩层,背景保留本阶段的 Progress 页,旧 Result 面板用于超时。`VictoryTitle`、`VictoryChest`、`VictoryCoins`、`VictoryPeople` 依次弹出,每组 0.35 秒缩放渐显,间隔 0.5 秒;演出结束后显示关闭按钮。最后一关的云朵演出结束后直接进入此结算,关闭后再显示主线胜利弹窗。
美术新增 `victory_*` 独立资源:提供的获胜标题、说明和结算数字原图,金币堆及光效复用项目素材并复制到分包。金币数字组件启用 `sourceArt` 和关闭 `showCoin`,保留原始白字描边。自己单独展示,其他存活者最多显示 7 个代表头像;不足 7 个时居中,人数文案使用真实存活数减一,独赢时隐藏他人行并更换说明。
新结算奖励计算为 `ceil(ceil(pool / survivors) / 10) * 10`。201 发 210,3334 发 3340,整十金额不增加;已保存的历史回执不重新补发。仍由前端计算、上报和更新余额,服务端负责持久化。
stage1/2 成功后点击主线“下一关”,先同步奖励并调用下一阶段匹配,成功后才切换关卡,失败可重试。返回首页则队列弹出 overview,等待手动点击“开始下一阶段”;状态轮询和引导自动跳转不会开启新阶段。stage3 完成后正常继续主线。
验证:百人赛、道具引导及通行证相关累计 89 项测试通过,包含展示顺序、关闭前等待、奖励边界与重试、下一关点击去重、首页手动开始。当前源码和 Prefab 已通过实际 Cocos 引擎预览,49 人获胜及独赢页面无脚本异常。类型检查仍保留原有 17 条诊断,无新增;本次完整发布构建尚未验证。
失败演出衔接更新:淘汰动画结束后直接在当前 Progress 页显示 `FailureMessage`(原始素材 `shibaiwenzi.png`,分包内命名为 `progress_failure.png`),隐藏 `progressStatsContents` 和头像队伍,保留该阶段主题、云梯、奖池和个人截止倒计时。关闭后确认结果已展示,再继续原有重开/返回流程;首页不重复自动弹出。离线尚未确认的失败仍保留原有同步补播机制。相关页面、演出与 Prefab 共 44 项测试通过,源码 Cocos 预览无异常,类型检查无新增诊断。
2026-09-16:Overview/DescriptionImage 绑定原始说明文字.png(558×98);未参加、挑战中和等待下一阶段均展示,Description 标签仅作为缺失图片时的回退。终态隐藏说明图和标签。Victory 统一使用分享奖励图片,独赢时 Others 显示 0,Solo 不展示。第三阶段奖励手动关闭后直接退出,不再进入总览。