这三处都是「精灵或按钮已在清单里定案,但配置层缺东西」,不补的话 C/D/E 阶段
写渲染代码时会发现没有布局节点,极易就地硬编码坐标(违反零裸值红线)。
1) 底栏「扣底」按钮没有精灵(清单 §2.6 列了 5 个功能按钮,只登记了 4 个)
- 新增 BTN_BURY_CARDS(1056) / BTN_BURY_CARDS_TEXT(1057),群组 205 号段内空闲号,
资源沿用 BTN_BOTTOM_FUNC,与其余四个按钮同构。
- FOOTER_FUNC_BUTTONS 的 items 由 4 项扩到 5 项,扣底紧邻底牌(照 §2.6 表序)。
扣底宽 78 是【估值】:清单未给,取同为两字按钮的「底牌」实测值,已在配置与清单里注明。
- 扣底看【埋牌底牌】(burycards)、底牌看【底牌】(bottomcards),两批不同的牌,
JSDoc 里补了防写反的提示(对应验收清单第 13 条)。
2) 出牌阶段「提示」按钮有精灵、无布局槽位
- PLAY_OPERATION_BAR.items 补上 PLAY_BTN_TIP,顺序照清单 §1.7 行文:倒计时 / 出牌 / 提示。
- 宽 180 是【估值】:清单 §6.8 自身漏了该项;与埋牌条的提示按钮同资源 BTN_TIP
(§3.3 实测 180×63),埋牌条 items 首项亦取 180,故沿用。
- 顺带记下一处待裁定项:本条 itemHeight 为 55(对齐 BTN_PLAY 157×55),
而 BTN_TIP 原生高 63,高度差待设计稿定。
3) AccountView / HistoryView / MingPaiView 一个布局节点都没有
- AccountView(§6.9a 新增):外壳 6 个节点 + 玩家栏「容器 ACC_ROW_CONTAINER +
行节点 ACC_ROW(itemHeight 即行高,行数由 ctx.count 给出)+ 行内模板贴附到行矩形」
+ 面板外 4 按钮,共 14 个节点。行内节点求出的是相对容器的坐标,可直接喂
SpriteCopyUtils.create(与 §5.6a 冲关牌同一用法)。
- HistoryView / MingPaiView(§6.9c 新增):遮罩 + 容器 + 每家一排牌(fan) + 座位标签,
各 4 个节点。照 CHONGGUAN_FAN 同构、锚点沿用 §6.7 冲关牌的三家落点;
差别只在张数上限——出牌历史摊平后可达 28 张以上,故 maxWidth 放宽到 500、
spacingMin 收到 -96【估值】。MING_* 只有 LEFT/RIGHT 两个 bySeat 变体(明牌不看自己)。
- 坐标来源:大局结算.png / 冲关牌型显示.png 目视实测,w/h 取资源尺寸;
配置与清单里均已注明「目视实测估值,待设计稿复核」。
- 运行时才确定的字段(动态文字宽高、随行浮动的 anchorY、数字精灵宽)一律
runtime 显式声明。
钉死断言按实际重新数并更新:精灵总数 378 → 380,布局节点总数 61 → 83。
另把 ACC_TPL_SCORE_NUM 加进 NUM_STYLE 同源校验表(与 RESULT_SCORE_NUM 同一套资源)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
509 lines
37 KiB
JavaScript
509 lines
37 KiB
JavaScript
///////////////////////////////////////////////////////////////
|
||
////////// EQW_Sprites: 精灵结构(清单 §5.6/§5.6a/§5.7a/§5.7b 结算)
|
||
///////////////////////////////////////////////////////////////
|
||
// 子游戏精灵段 1001–2999。结构与 Sprites_Table.js 一致:
|
||
// View 下 Layer 为图层声明(一个 View 恰好一个图层),其余键是 group 容器;
|
||
// 容器内 id 为群组 ID、其余键才是精灵 id。
|
||
// 连号精灵逐条写全,不用循环生成。
|
||
var EQW_Sprites = EQW_Sprites || {};
|
||
|
||
// ============================================================================
|
||
// 小局结算面板 - Layer 302 (POPUP_ASET_RESULT), Group 240 (ASET_RESULT)
|
||
// ============================================================================
|
||
|
||
/**
|
||
* 小局结算面板 - AsetResultView
|
||
*
|
||
* 用途: 一小局打完后盖在牌桌之上,展示【埋牌底牌 + 扣底算式】与【三家得分】,
|
||
* 并给出「冲关牌型」「下一局」两个出口。本面板没有整块面板底图——
|
||
* 各元素直接摆在半透牌桌上(见参考图,牌桌仍隐约可见)。
|
||
*
|
||
* 布局说明(参考图 docs_dev/uiref/小局结算.png):
|
||
*
|
||
* ┌ 175,150 ─────────┐ ┌ 430,140 ────────────────┐ ┌ 865,150 ─────────┐
|
||
* │ │ │ ┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐ │ │ │
|
||
* │ +20 │ │ └┘└┘└┘└┘└┘└┘└┘└┘ ×8 │ │ -10 │
|
||
* │ │ │ 叫分2子 底牌 20x0 │ │ │
|
||
* └──────────────────┘ └─────────────────────────┘ └──────────────────┘
|
||
* 牌局分 10 冲关分 10 牌局分 -5 冲关分 -5
|
||
* ↑ ↑ ↑ ↑
|
||
* RESULT_JF_LEFT RESULT_AW_LEFT RESULT_JF_RIGHT RESULT_AW_RIGHT
|
||
* (1808) (1811) (1809) (1812)
|
||
*
|
||
* ┌ 490,340 ─────────┐
|
||
* │ -10 │ ← RESULT_GLOW_SELF(1804) 光晕 225×100
|
||
* └──────────────────┘ RESULT_SCORE_SELF(1807) 总分大字
|
||
* 牌局分 -5 冲关分 -5 RESULT_JF_SELF(1810) / RESULT_AW_SELF(1813)
|
||
*
|
||
* ┌ 535,515 ────┐ ┌ 835,518 ───┐
|
||
* │ 冲关牌型 │ │ 下一局 │
|
||
* └─────────────┘ └────────────┘
|
||
* ↑ RESULT_BTN_CG(1815) ↑ RESULT_BTN_NEXT(1817)
|
||
* +_TEXT(1816) 183×63 +_TEXT(1818) 180×65
|
||
*
|
||
* 三家的位置与牌桌上各自的座位方位一致:左上家在左、右上家在右、自己在中央偏下。
|
||
* 底牌区面板 RESULT_BOTTOM_PANEL(1800) = point(430,140,420×148),
|
||
* 内含群组 215 的 8 张埋牌底牌(BuryCardsView,见 Sprites_Cards.js)与
|
||
* RESULT_BOTTOM_TEXT(1801)(attach 面板 center/bottom, offsetY=-14)。
|
||
*
|
||
* 每家一组三个数字(EQW_Layout.RESULT_GLOW / RESULT_SCORE_NUM / RESULT_JF_TEXT /
|
||
* RESULT_AW_TEXT,都用 bySeat 三变体):
|
||
* ┌───── 光晕 225×100 ─────┐
|
||
* │ +20 │ ← 总分大字:attach 光晕 center/middle
|
||
* └────────────────────────┘
|
||
* 牌局分 10 冲关分 10
|
||
* ↑ attach 光晕 left/bottom ↑ attach 光晕 right/bottom
|
||
* offset(-15,+24) offset(+15,+24)
|
||
*
|
||
* 元素说明:
|
||
* - 光晕帧: GLOW_RESULT 帧1=赢(橙) / 帧2=输(蓝),按该家 grade 的正负取帧。
|
||
* - 总分大字: 取 aset.seatlist[i].grade,正分橙带「+」、负分蓝带「-」;
|
||
* 按符号在 NUM_RESULT_WIN / NUM_RESULT_LOSE 两套资源里二选一绑定,
|
||
* 显示用 SpriteManager.setNumberImage(spriteId, '+20', charWidth)。
|
||
* 与大局结算的 ACC_TPL_SCORE_NUM(1914) 同一套资源与用法,两处得分显示保持一致。
|
||
* - 扣底文案: 格式「叫分{aset.multiple}子 底牌 {bottom.grade1}x{bottom.multiple}」——
|
||
* x 后面是【扣底倍数】(单张 ×1、主对 ×2、N 连对 ×2N)。闲家未扣底时 bottom 只有 cards,
|
||
* multiple/grade1/grade2 都不下发 → 倍数位显示 0(参考图的「底牌 20x0」即此情形)。
|
||
* - 【标签文案与字段】参考图两个小字标签已定案为「牌局分」/「冲关分」(清单 §1.8):
|
||
* 牌局分取 grade_jf(捡分子数得分)、冲关分取 grade_cg(算奖里的冲关分量,S-6 新增,
|
||
* 开傍王时不含傍王那部分)。精灵键名沿用早期的 _JF / _AW,与文案不完全同名,勿混。
|
||
* - 【判定结果不在本面板显示,D-8】大光/小光/过庄/升N级/投降由【动画】呈现,
|
||
* 故 1814 RESULT_JUDGE_TEXT 被判定不需要(见下方空号说明)。动画在两个时机播:
|
||
* 对局过程中 —— 依 curmultiple(随 chupai1/2/3 下发,带符号,S-8)档位跳变时提示
|
||
* 结算前 —— 依 aset.upgrade(带符号:3大光 2小光 1过庄 -N升N级 -99投降 0解散)
|
||
* 末轮打完、本面板出现【之前】播一次最终判定
|
||
* 【待设计稿】动画资源 EQW_Images.ANI_JUDGE(634) 帧数/尺寸待定,
|
||
* 播放参数在 EQW_Anim 里留白(AnimConstants.js 末尾「D-8 待补」)——本 View 无对应精灵。
|
||
* - 【容错】投降结算只有 aset、无 chupai 无 bottom → 面板必须容忍底牌区缺失,
|
||
* 不能因读不到 bottom.cards 就崩或显示空框。
|
||
* - 【时序】先 setXxx 把结算数据写进 this.data、再播动画;动画的开始/结束/出错回调里
|
||
* 只刷界面、不写核心数据。动画缺失或卡住时,面板与数据仍须正确。
|
||
*
|
||
* 资源说明:
|
||
* - 底牌区面板底: EQW_Images.PANEL_BOTTOM_CARDS (606), 1 帧, 420×148
|
||
* - 分数光晕: EQW_Images.GLOW_RESULT (607), 2 帧, 225×100, 帧1=赢(橙) 帧2=输(蓝)
|
||
* - 得分数字: EQW_Images.NUM_RESULT_WIN (632) / NUM_RESULT_LOSE (633),
|
||
* 各 16 帧固定帧序, 单字符 46×62, 整图 736×62;帧12=「+」帧13=「-」必出;
|
||
* charWidth 取 EQW_Layout.NUM_STYLE.RESULT_WIN / RESULT_LOSE.charWidth
|
||
* - 冲关牌型按钮: EQW_Images.BTN_CG_CARDS (542), 1 帧, 183×63, 蓝色渐变
|
||
* - 下一局按钮: EQW_Images.BTN_NEXT_ASET (541), 1 帧, 180×65, 金黄渐变
|
||
*
|
||
* 精灵ID分配: 1800–1813 / 1815–1818(群组 240);埋牌底牌 8 张复用群组 215(1258–1265)
|
||
*
|
||
* @see docs_dev/二七王-UI资源与精灵清单.md §1.8 末轮扣底 + 小局结算 / §5.6 / §6.9
|
||
* @see docs_dev/uiref/小局结算.png
|
||
*/
|
||
//小局结算面板(清单 §5.6,Layer 302 群组 240)
|
||
//
|
||
//以下键号在源清单中被显式判定「不需要」,本文件不占用,留空号以便追溯:
|
||
// 1814 RESULT_JUDGE_TEXT —— 结算面板不显示判定文字,改由动画呈现(§1.8,D-8)
|
||
EQW_Sprites.AsetResultView = {
|
||
Layer: EQW_Layers.POPUP_ASET_RESULT, //302
|
||
|
||
AsetResult: {
|
||
id: EQW_Groups.ASET_RESULT, //240
|
||
|
||
RESULT_BOTTOM_PANEL: 1800, //图片:底牌区面板底,资源 EQW_Images.PANEL_BOTTOM_CARDS
|
||
RESULT_BOTTOM_TEXT: 1801, //文字:「叫分{multiple}子 底牌 {grade1}x{bottom.multiple}」
|
||
|
||
//—— 三家分数光晕,资源 EQW_Images.GLOW_RESULT,帧1=赢(橙) 帧2=输(蓝) ——
|
||
RESULT_GLOW_LEFT: 1802,
|
||
RESULT_GLOW_RIGHT: 1803,
|
||
RESULT_GLOW_SELF: 1804,
|
||
|
||
//—— 三家总分(aset.seatlist[i].grade),多帧图数字精灵,正分橙带 `+`、负分蓝带 `-`,
|
||
// 资源 EQW_Images.NUM_RESULT_WIN(赢)/ NUM_RESULT_LOSE(输),按符号二选一绑资源,
|
||
// 显示用 SpriteManager.setNumberImage(spriteId, '+20', charWidth),charWidth 见
|
||
// EQW_Layout.NUM_STYLE.RESULT_WIN/RESULT_LOSE——与 ACC_TPL_SCORE_NUM(1914,大局结算总分)
|
||
// 同一套资源与用法,两处结算得分显示保持一致(2026-08-27 由文字精灵改为数字图精灵)——
|
||
RESULT_SCORE_LEFT: 1805,
|
||
RESULT_SCORE_RIGHT: 1806,
|
||
RESULT_SCORE_SELF: 1807,
|
||
|
||
//—— 三家捡分子数得分文字 grade_jf【T-13】——
|
||
RESULT_JF_LEFT: 1808,
|
||
RESULT_JF_RIGHT: 1809,
|
||
RESULT_JF_SELF: 1810,
|
||
|
||
//—— 三家算奖得分文字 grade_aw【T-13】——
|
||
RESULT_AW_LEFT: 1811,
|
||
RESULT_AW_RIGHT: 1812,
|
||
RESULT_AW_SELF: 1813,
|
||
|
||
RESULT_BTN_CG: 1815, //图片:「冲关牌型」按钮,资源 EQW_Images.BTN_CG_CARDS
|
||
RESULT_BTN_CG_TEXT: 1816, //文字:按钮文案「冲关牌型」
|
||
RESULT_BTN_NEXT: 1817, //图片:「下一局」按钮,资源 EQW_Images.BTN_NEXT_ASET
|
||
RESULT_BTN_NEXT_TEXT: 1818 //文字:按钮文案「下一局」
|
||
}
|
||
};
|
||
//> 底牌 8 张精灵复用 Sprites_Cards.js 群组 215(BuryCardsView.BuryCards,1258–1265),不在此重复。
|
||
|
||
// ============================================================================
|
||
// 冲关牌型叠加层 - Layer 302 (POPUP_ASET_RESULT), Group 244 (CHONGGUAN)
|
||
// ============================================================================
|
||
|
||
/**
|
||
* 冲关牌型叠加层 - ChongGuanOverlayView
|
||
*
|
||
* 用途: 在小局结算面板【之上】再盖一层半透黑遮罩,三家各摊开自己参与冲关的牌
|
||
* (aset.seatlist[i].cards),并在旁边标出奖数。点「冲关牌型」按钮打开。
|
||
*
|
||
* 布局说明(参考图 docs_dev/uiref/冲关牌型显示.png;牌的排布见
|
||
* EQW_Layout.CHONGGUAN_FAN: fan/horizontal, anchor center,
|
||
* 牌尺寸 CARD_SIZE.L 110×190, maxWidth=420, spacingMax=-40 spacingMin=-88):
|
||
*
|
||
* ┌──────────────────────────────────────────────────────────────┐ y=0
|
||
* │ ┌──┬──┬──┬────┐ ┌──┬──┬──┬────┐ │
|
||
* │ │K │K │K │ K │ │K │K │K │ K │ │ 260,120 / 1035,120
|
||
* │ └──┴──┴──┴────┘ └──┴──┴──┴────┘ │
|
||
* │ CG_BOX_LEFT(1821) CG_BOX_RIGHT(1822) │
|
||
* │ CG_COUNT_LEFT(1825) CG_COUNT_RIGHT(1826)│
|
||
* │ │
|
||
* │ (半透黑遮罩 CG_MASK(1820) 铺满全屏) │
|
||
* │ │
|
||
* │ ┌──┬──┬──┬────┐ │
|
||
* │ │K │K │K │ K │ ← CG_BOX_SELF(1823) 640,400│
|
||
* │ └──┴──┴──┴────┘ CG_COUNT_SELF(1827) │
|
||
* │ │
|
||
* │ ┌────────────┐ │
|
||
* │ │ 下一局 │ ← 遮罩之上│ 835,518
|
||
* │ └────────────┘ 仍可见可点│
|
||
* └──────────────────────────────────────────────────────────────┘ y=720
|
||
*
|
||
* 三家牌位与结算面板同方位:左上家、右上家在各自头像内侧,自己在中央偏下。
|
||
* 遮罩 EQW_Layout.CG_MASK = point(0,0,1280×720, opacity 0.72)。
|
||
*
|
||
* 元素说明:
|
||
* - 【牌用精灵复制,不预置固定张数】cards 长度不定——四王 + 一条长连对链 + 八个 7 +
|
||
* 八个 2 叠加时可达 20 余张,预置既可能不够、又在多数局里白占 ID。
|
||
* 编辑器里只需建 5 个精灵:3 个容器 + 1 个牌模板 + 1 个遮罩;奖数文字 3 个照常预置。
|
||
* 生成方式见下方原注释与清单 §5.6a 的代码片段(SpriteCopyUtils.create + setFrame)。
|
||
* - 【清理是硬要求】关闭叠加层 / 组件 onDestroy 时必须
|
||
* SpriteCopyUtils.removeRange(boxId, 0, cards.length),否则复制精灵残留。
|
||
* - 【关闭方式】遮罩本身就是关闭热区,点遮罩即关闭,不另设关闭按钮 →
|
||
* CG_MASK 必须注册点击事件;同时 RESULT_BTN_NEXT(1817/1818) 的层内层级须【高于】遮罩,
|
||
* 点它不被遮罩吃掉(「冲关牌型」按钮本身被遮住则无妨)。
|
||
* ⚠ 三个遮罩面板的关闭方式各不相同,别写混:
|
||
* 冲关牌型(本 View)→ 点遮罩关闭 遮罩可点
|
||
* 明牌 / 出牌历史 → 点遮罩关闭,明牌另可再点按钮切换 遮罩可点
|
||
* 亮牌 → 仅自动时长,到点自动收起 遮罩【不】注册点击
|
||
* - 奖数取 aset.seatlist[i].naward(该家总奖数,支付基数);chongguan / wang 可作明细选展。
|
||
* 前端【不重算冲关】,一律直接取服务端下发值。
|
||
*
|
||
* 资源说明:
|
||
* - 遮罩: EQW_Images.MASK_DIM (609), 1 帧, 纯色可拉伸(出 1 张小图即可,拉伸满 1280×720)
|
||
* - 牌模板: EQW_Images.CARD_FACE_L (501), 60 帧, 单帧 110×190
|
||
*
|
||
* 精灵ID分配: 1820–1827(群组 244)
|
||
*
|
||
* @see docs_dev/二七王-UI资源与精灵清单.md §1.8「冲关」是什么 / §5.6a / §6.7
|
||
* @see docs_dev/uiref/冲关牌型显示.png
|
||
*/
|
||
//冲关牌型叠加层(清单 §5.6a,Layer 302 群组 244,精灵复制)——
|
||
//本层的牌用 SpriteCopyUtils 运行时复制,不预置固定张数(cards 长度不定,最多可达 20 余张)。
|
||
//编辑器里只需建 5 个精灵(3 容器 + 1 牌模板 + 1 遮罩);奖数文字 3 个照常预置。
|
||
//RESULT_BTN_NEXT(1817/1818)在遮罩之上仍需可见可点,其图层内层级须高于 CG_MASK。
|
||
//清理是硬要求:关闭叠加层/组件 onDestroy 时必须 SpriteCopyUtils.removeRange(boxId, 0, cards.length),否则复制精灵残留。
|
||
EQW_Sprites.ChongGuanOverlayView = {
|
||
Layer: EQW_Layers.POPUP_ASET_RESULT, //302
|
||
|
||
ChongGuan: {
|
||
id: EQW_Groups.CHONGGUAN, //244
|
||
|
||
CG_MASK: 1820, //图片:半透黑遮罩(拉伸满屏,兼作点击关闭热区),资源 EQW_Images.MASK_DIM
|
||
CG_BOX_LEFT: 1821, //容器:左上家冲关牌容器(SpriteCopyUtils 复制的父精灵)
|
||
CG_BOX_RIGHT: 1822, //容器:右上家冲关牌容器
|
||
CG_BOX_SELF: 1823, //容器:自己冲关牌容器
|
||
CG_CARD_TPL: 1824, //模板:冲关牌模板(编辑器里放好、默认隐藏,只作样式来源),资源 EQW_Images.CARD_FACE_L
|
||
|
||
//—— 三家奖数文字,与该家的冲关牌并列显示,取 aset.seatlist[i].naward ——
|
||
CG_COUNT_LEFT: 1825,
|
||
CG_COUNT_RIGHT: 1826,
|
||
CG_COUNT_SELF: 1827
|
||
}
|
||
};
|
||
|
||
// ============================================================================
|
||
// 大局总结算 / 解散结算 - Layer 303 (POPUP_ACCOUNT), Group 241 (ACCOUNT)
|
||
// ============================================================================
|
||
|
||
/**
|
||
* 大局总结算 / 解散结算 - AccountView
|
||
*
|
||
* 用途: 打完最后一局(或房间解散)时弹出的总账面板:标题栏 + 三条玩家栏 + 规则栏,
|
||
* 面板【外】底部另有 4 个功能按钮。解散结算复用同一面板,只是 aset 各项为 0。
|
||
*
|
||
* 布局说明(参考图 docs_dev/uiref/大局结算.png;面板居中于 1280×720,
|
||
* 实测约 x≈80–1180, y≈88–620,按钮条 y≈640–700):
|
||
*
|
||
* ┌──────────────────────────────────────────────────────────┐ ← ACC_TITLE_BAR(1901)
|
||
* │ 二七王-3人 房号654216 共24局 2025-12-14 11:45 [×] │ 1100×56,青绿底
|
||
* ├──────────────────────────────────────────────────────────┤ ↑ACC_TITLE_TEXT(1902)
|
||
* │ │ ↑ACC_BTN_CLOSE(1903)
|
||
* │ ⑴ [头像] 玩家1 基础分30 算奖分12 傍王分15 +135 │ ← 玩家栏(复制生成)
|
||
* │ ID:100001 总得分30 │
|
||
* │ ──────────────────────────────────────────────────────── │ ← ACC_TPL_DIVIDER(1915)
|
||
* │ ⑵ [头像] 玩家2 基础分-30 算奖分-12 傍王分-15 -45 │
|
||
* │ ID:100002 总得分-30 │
|
||
* │ ──────────────────────────────────────────────────────── │
|
||
* │ ⑶ [头像] 玩家3 …… -45 │
|
||
* │ │
|
||
* ├──────────────────────────────────────────────────────────┤ ← ACC_RULE_BAR(1904)
|
||
* │ 规则:可查牌、傍王、爬坡算子 │ 1100×62,浅绿底
|
||
* └──────────────────────────────────────────────────────────┘ ↑ACC_RULE_TEXT(1905)
|
||
* ↑ ACC_PANEL_BG(1900) 圆角浅灰绿 1100×540(标题栏与规则栏是它的上下封边)
|
||
*
|
||
* ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ← 面板【外】底部
|
||
* │ 再来一局 │ │ 分享好友 │ │ 复制战绩 │ │ 退出房间 │ 各 190×60
|
||
* └──────────┘ └──────────┘ └──────────┘ └──────────┘
|
||
* (1920/21) (1922/23) (1924/25) (1926/27)
|
||
* 黄 蓝 蓝 红
|
||
*
|
||
* 单条玩家栏的列序(左→右):
|
||
* 名次徽章 → 头像 → 昵称 /「ID:{playerid}」(两行) → 「基础分{n}」/「总得分{n}」(两行)
|
||
* → 「冲关分{n}」→「傍王分{n}」→ 右侧总分大字
|
||
* ⚠ 参考图第三列小字写的是「算奖分」,清单 §1.9 定案的字段是 grade_cg_total(冲关分);
|
||
* 四项 grade_jf_total / grade_cg_total / grade_bw_total 之和恒等于 score(S-6)。
|
||
*
|
||
* 元素说明:
|
||
* - 【玩家栏用精灵复制】三条结构完全相同、仅数据不同,用 SpriteCopyUtils 从 5 个模板
|
||
* (ACC_TPL_RANK / AVATAR / TEXT / SCORE_NUM / DIVIDER)复制生成;面板外壳与按钮预置。
|
||
* tag 分段见下方原注释;关闭面板时按各段 removeRange 清理。
|
||
* - 名次徽章按总分排名取帧(1金 / 2橙 / 3蓝,花瓣形)。
|
||
* - 总分大字与小局结算的 RESULT_SCORE_* 同一套资源与用法:正分橙带「+」、负分蓝带「-」,
|
||
* setNumberImage 走 TEXT/WIDTH 属性,_validateSpriteId 也接受复制精灵的字符串 ID,
|
||
* 故复制出来的玩家栏总分同样【一个精灵显示整串】。
|
||
* - 规则栏文案据 roomtype 位串拼出已启用项,不硬编码。
|
||
* - 【解散结算】投递方式与小局结算完全不同(协议 §14.1):rpc 是平台的 free_room、
|
||
* route 是 room,真实取值路径是 data.deskfree.data.aset / .account(多一层 data 包装),
|
||
* 且 data.deskfree 可能缺失(开战后、首局发牌前解散)→ 前端必须容忍。
|
||
* 解散的申请/投票/同意拒绝界面【由平台全包】(Layer 420),子游戏不做投票界面。
|
||
* - 【布局节点已补齐 · 2026-08-27】见 Layout_Result.js「大局总结算」一节:
|
||
* 外壳 —— ACC_PANEL_BG / ACC_TITLE_BAR / ACC_TITLE_TEXT / ACC_BTN_CLOSE /
|
||
* ACC_RULE_BAR / ACC_RULE_TEXT
|
||
* 玩家栏(精灵复制)—— ACC_ROW_CONTAINER(容器)+ ACC_ROW(行模板,itemHeight 即行高,
|
||
* 行数由 ctx.count 给出)+ ACC_TPL_RANK / ACC_TPL_AVATAR / ACC_ROW_TEXT_GRID /
|
||
* ACC_TPL_SCORE_NUM / ACC_TPL_DIVIDER(都 attach 到 ACC_ROW 的行矩形上)
|
||
* 按钮 —— ACC_FUNC_BUTTONS(面板外底部 4 个)
|
||
* ⚠ 行内各节点求出的是【相对 ACC_ROW_CONTAINER 的】坐标,可直接喂 SpriteCopyUtils.create。
|
||
* ⚠ 这些坐标是参考图【目视实测估值】(w/h 取资源尺寸),待设计稿复核;
|
||
* 但配置已成型,渲染代码一律引用节点,不得就地硬编码坐标(零裸值红线)。
|
||
*
|
||
* 资源说明:
|
||
* - 面板底: EQW_Images.PANEL_ACCOUNT (610), 1 帧, 1100×540, 圆角浅灰绿
|
||
* - 标题栏: EQW_Images.BAR_ACCOUNT_TITLE (611), 1 帧, 1100×56, 青绿底含圆角上沿
|
||
* - 规则栏: EQW_Images.BAR_ACCOUNT_RULE (612), 1 帧, 1100×62, 浅绿底含圆角下沿
|
||
* - 关闭钮: EQW_Images.BTN_ACC_CLOSE (547), 1 帧, 36×36
|
||
* - 名次徽章: EQW_Images.BADGE_RANK (579), 3 帧, 44×44, 帧=名次 1–3
|
||
* - 分隔线: EQW_Images.LINE_DIVIDER (613), 1 帧, 1060×2
|
||
* - 总分数字: EQW_Images.NUM_RESULT_WIN (632) / NUM_RESULT_LOSE (633), 16 帧, 单字符 46×62
|
||
* - 四个按钮: EQW_Images.BTN_ACCOUNT_AGAIN (543) / SHARE (544) / COPY (545) / EXIT (546),
|
||
* 各 1 帧, 190×60
|
||
*
|
||
* 精灵ID分配: 1900–1905 / 1910–1915 / 1920–1927(群组 241)
|
||
*
|
||
* @see docs_dev/二七王-UI资源与精灵清单.md §1.9 大局总结算 / §1.10 解散结算 / §5.7a
|
||
* @see docs_dev/uiref/大局结算.png
|
||
*/
|
||
//大局总结算 / 解散结算(清单 §5.7a,Layer 303 群组 241,玩家栏用精灵复制)——
|
||
//三条玩家栏结构完全相同、仅数据不同,用 SpriteCopyUtils 复制生成;面板外壳与按钮预置。
|
||
//tag 分段(SpriteCopyUtils.createTagManager):rank 1–20 / avatar 21–40 / text 41–140(每行 6 条文字)/ score 141–160 / divider 161–180。
|
||
//清理:关闭面板时按各段 removeRange。
|
||
//解散结算复用本面板(协议 §14.1,解散包也带 account),只是 aset 各项为 0。
|
||
EQW_Sprites.AccountView = {
|
||
Layer: EQW_Layers.POPUP_ACCOUNT, //303
|
||
|
||
Account: {
|
||
id: EQW_Groups.ACCOUNT, //241
|
||
|
||
ACC_PANEL_BG: 1900, //图片:面板底(圆角浅灰绿),资源 EQW_Images.PANEL_ACCOUNT
|
||
ACC_TITLE_BAR: 1901, //图片:标题栏(青绿底),资源 EQW_Images.BAR_ACCOUNT_TITLE
|
||
ACC_TITLE_TEXT: 1902, //文字:「二七王-3人 房号… 共…局 …」
|
||
ACC_BTN_CLOSE: 1903, //图片:右上角关闭按钮,资源 EQW_Images.BTN_ACC_CLOSE
|
||
ACC_RULE_BAR: 1904, //图片:底部规则栏(浅绿底),资源 EQW_Images.BAR_ACCOUNT_RULE
|
||
ACC_RULE_TEXT: 1905, //文字:「规则:可查牌、傍王、爬坡算子」
|
||
|
||
ACC_ROW_CONTAINER: 1910, //容器:玩家栏的复制父精灵
|
||
|
||
//—— 玩家栏复制模板(tag 分段见上)——
|
||
ACC_TPL_RANK: 1911, //模板:名次徽章,资源 EQW_Images.BADGE_RANK,帧=名次1–3
|
||
ACC_TPL_AVATAR: 1912, //模板:头像,运行时贴玩家头像
|
||
ACC_TPL_TEXT: 1913, //模板:通用文字(昵称/ID/各项分数,一行一个)
|
||
ACC_TPL_SCORE_NUM: 1914, //模板:右侧总分大字(多帧图数字精灵),资源 EQW_Images.NUM_RESULT_WIN / NUM_RESULT_LOSE,
|
||
//显示用 SpriteManager.setNumberImage(复制精灵ID, '+120', charWidth)——
|
||
//setNumberImage 走的是 TEXT/WIDTH 属性,_validateSpriteId 也接受复制精灵的字符串 ID,
|
||
//故复制出来的玩家栏总分同样一个精灵显示整串(2026-08-26 核对)
|
||
ACC_TPL_DIVIDER: 1915, //模板:行间分隔线,资源 EQW_Images.LINE_DIVIDER
|
||
|
||
//—— 底部 4 个功能按钮 ——
|
||
ACC_BTN_AGAIN: 1920, //图片:「再来一局」按钮,资源 EQW_Images.BTN_ACCOUNT_AGAIN
|
||
ACC_BTN_AGAIN_TEXT: 1921, //文字:按钮文案「再来一局」
|
||
ACC_BTN_SHARE: 1922, //图片:「分享好友」按钮,资源 EQW_Images.BTN_ACCOUNT_SHARE
|
||
ACC_BTN_SHARE_TEXT: 1923, //文字:按钮文案「分享好友」
|
||
ACC_BTN_COPY: 1924, //图片:「复制战绩」按钮,资源 EQW_Images.BTN_ACCOUNT_COPY
|
||
ACC_BTN_COPY_TEXT: 1925, //文字:按钮文案「复制战绩」
|
||
ACC_BTN_EXIT: 1926, //图片:「退出房间」按钮,资源 EQW_Images.BTN_ACCOUNT_EXIT
|
||
ACC_BTN_EXIT_TEXT: 1927 //文字:按钮文案「退出房间」
|
||
}
|
||
};
|
||
|
||
// ============================================================================
|
||
// 出牌历史 / 上一轮 / 亮牌 - Layer 304 (POPUP_HISTORY), Group 242 (HISTORY)
|
||
// ============================================================================
|
||
|
||
/**
|
||
* 出牌历史 / 上一轮 / 亮牌 - HistoryView
|
||
*
|
||
* 用途: 半透黑遮罩 + 每家一排牌的查看面板,【一套精灵三种用途】,只换数据源:
|
||
* 出牌历史 = pushlist 全部轮次摊平聚合到各家,三排
|
||
* 上一轮 = pushlist 末尾一项,三排
|
||
* 亮牌 = liangpai.cards(庄家的固定主牌),只用一排
|
||
*
|
||
* 布局说明(版式照 docs_dev/uiref/冲关牌型显示.png——本 View 与 MingPaiView、
|
||
* ChongGuanOverlayView 三者是同一种版式:遮罩 + 每家一排重叠排列的大牌):
|
||
*
|
||
* ┌──────────────────────────────────────────────────────────────┐ y=0
|
||
* │ ┌──┬──┬──┬──┬────┐ ┌──┬──┬──┬──┬────┐ │
|
||
* │ │K │K │K │K │ K │ │K │K │K │K │ K │ │
|
||
* │ └──┴──┴──┴──┴────┘ └──┴──┴──┴──┴────┘ │
|
||
* │ ↑CG_BOX 位同左上家 ↑位同右上家 │
|
||
* │ HIST_BOX_LEFT(1951) HIST_BOX_RIGHT(1952) │
|
||
* │ HIST_LABEL_LEFT(1955) HIST_LABEL_RIGHT(1956)│
|
||
* │ │
|
||
* │ (半透黑遮罩 HIST_MASK(1950) 铺满全屏,兼关闭热区)│
|
||
* │ │
|
||
* │ ┌──┬──┬──┬──┬────┐ │
|
||
* │ │K │K │K │K │ K │ ← HIST_BOX_SELF(1953) │
|
||
* │ └──┴──┴──┴──┴────┘ HIST_LABEL_SELF(1957) │
|
||
* └──────────────────────────────────────────────────────────────┘ y=720
|
||
*
|
||
* 三排的落点与各自座位方位一致(左上家在左、右上家在右、自己中央偏下),
|
||
* 与 ChongGuanOverlayView 同构;【亮牌】只显示庄家那一排,其余两个容器隐藏。
|
||
*
|
||
* 元素说明:
|
||
* - 【牌用精灵复制】张数不定(出牌历史摊平后可达整手 28 张以上),
|
||
* 编辑器里只建 1 个遮罩 + 3 个容器 + 1 个牌模板 + 3 个座位标签文字。
|
||
* 关闭 / onDestroy 时必须 removeRange 清理复制精灵。
|
||
* - 出牌历史与上一轮【仅可查牌模式】;不可查牌模式下底栏那两个按钮整体不出现。
|
||
* 数据在出牌过程中由前端逐包(chupai1/2/3)自行累积,重连时从 pushlist 恢复。
|
||
* - 出牌历史【不按轮次分组】(D-7 已定):每家出过的牌全部摊平聚合到该玩家名下,
|
||
* 再按手牌那套主牌序排序,三家各一排。前端自行摊平 + 排序,不需要改服务端。
|
||
* - 【亮牌的关闭方式与其余两个面板不同】:只按自动时长关闭
|
||
* (EQW_Anim.LIANGPAI_AUTO_CLOSE = 3000,清单原文时长「默认值待定」,现值为起始估值),
|
||
* 遮罩【不注册点击事件】;而出牌历史 / 上一轮是点遮罩关闭。同一批精灵、两种关闭策略,
|
||
* 实现时按用途分别挂事件,别写混。
|
||
* - 【亮牌时机 T-34 已定】埋牌后、出牌前——庄家埋牌完成、服务端下发 maipai 包(带 liangpai)
|
||
* 时弹出,出牌开始前收起;只有【闲家】会收到并弹出,庄家自己不弹。
|
||
* 一次性弹出、不是常驻入口;不阻塞出牌,若面板还开着就收到出牌推送,直接收起即可。
|
||
* - 【与 MingPaiView 的关系】版式相同、渲染逻辑可共用,但数据独立、图层不同
|
||
* (304 vs 305),故拆成两个 View——一个 View 恰好一个图层。
|
||
* - 【布局节点已补齐 · 2026-08-27】见 Layout_Result.js「出牌历史 / 上一轮 / 亮牌」一节:
|
||
* HIST_MASK(遮罩)/ HIST_BOX(三个容器同摆原点、铺满屏)/ HIST_FAN(每家一排牌,
|
||
* bySeat 三变体,锚点沿用 §6.7 冲关牌的 LEFT 260,120 · RIGHT 1035,120 · SELF 640,400)/
|
||
* HIST_LABEL(三家座位标签,w/h 运行时注入)。
|
||
* 与 CHONGGUAN_FAN 的差别只有张数上限:出牌历史摊平后可达 28 张以上,
|
||
* 故 maxWidth 放宽到 500、spacingMin 收到 -96【估值,待设计稿复核】。
|
||
*
|
||
* 资源说明:
|
||
* - 遮罩: EQW_Images.MASK_DIM (609), 1 帧, 纯色可拉伸(与冲关/明牌共用)
|
||
* - 牌模板: EQW_Images.CARD_FACE_L (501), 60 帧, 单帧 110×190
|
||
*
|
||
* 精灵ID分配: 1950–1957(群组 242)
|
||
*
|
||
* @see docs_dev/二七王-UI资源与精灵清单.md §1.6 亮牌 / §1.7 出牌历史 / §5.7b
|
||
* @see docs_dev/uiref/冲关牌型显示.png
|
||
*/
|
||
//出牌历史 / 上一轮 / 亮牌(清单 §5.7b,Layer 304,群组 242,牌用精灵复制)——
|
||
//三家都显示,数据 = pushlist 摊平聚合到各家(§1.7 D-7);上一轮同一套精灵,只取 pushlist 末尾一项;
|
||
//亮牌只显示一排(庄家固定主牌),数据 = liangpai.cards(§1.6),复用同一套遮罩+容器+牌模板,仅数据源与排数不同。
|
||
//与下方 MingPaiView(Layer 305)版式相同(遮罩 + 每家一排牌),差别只在数据源与家数,两个 View 共用同一套渲染逻辑,
|
||
//但各自数据独立、图层不同,故拆成两个 View(一个 View 恰好一个图层)。
|
||
EQW_Sprites.HistoryView = {
|
||
Layer: EQW_Layers.POPUP_HISTORY, //304
|
||
|
||
History: {
|
||
id: EQW_Groups.HISTORY, //242
|
||
|
||
HIST_MASK: 1950, //图片:半透黑遮罩(兼关闭热区),资源 EQW_Images.MASK_DIM
|
||
HIST_BOX_LEFT: 1951, //容器:左上家牌容器
|
||
HIST_BOX_RIGHT: 1952, //容器:右上家牌容器
|
||
HIST_BOX_SELF: 1953, //容器:自己牌容器
|
||
HIST_CARD_TPL: 1954, //模板:牌模板,资源 EQW_Images.CARD_FACE_L
|
||
HIST_LABEL_LEFT: 1955, //文字:左上家座位标签(昵称/张数)
|
||
HIST_LABEL_RIGHT: 1956, //文字:右上家座位标签
|
||
HIST_LABEL_SELF: 1957 //文字:自己座位标签
|
||
}
|
||
};
|
||
|
||
// ============================================================================
|
||
// 明牌面板 - Layer 305 (POPUP_MINGPAI), Group 243 (MINGPAI)
|
||
// ============================================================================
|
||
|
||
/**
|
||
* 明牌面板 - MingPaiView
|
||
*
|
||
* 用途: 半透黑遮罩 + 【另两家】各一排牌,展示他们手中全部未出主牌的具体牌面。
|
||
* 与 HistoryView 版式相同,差别只在数据源与家数(明牌只看他家,没有自己那排)。
|
||
*
|
||
* 布局说明(版式照 docs_dev/uiref/冲关牌型显示.png,去掉中央偏下的自己那一排):
|
||
*
|
||
* ┌──────────────────────────────────────────────────────────────┐ y=0
|
||
* │ ┌──┬──┬──┬──┬────┐ ┌──┬──┬──┬──┬────┐ │
|
||
* │ │K │K │K │K │ K │ │K │K │K │K │ K │ │
|
||
* │ └──┴──┴──┴──┴────┘ └──┴──┴──┴──┴────┘ │
|
||
* │ ↑ MING_BOX_A(2001) ↑ MING_BOX_B(2002) │
|
||
* │ MING_LABEL_A(2004) MING_LABEL_B(2005) │
|
||
* │ │
|
||
* │ (半透黑遮罩 MING_MASK(2000) 铺满全屏,兼关闭热区) │
|
||
* │ │
|
||
* │ (自己那排不存在——自己的牌自己看得见) │
|
||
* │ │
|
||
* └──────────────────────────────────────────────────────────────┘ y=720
|
||
*
|
||
* A / B 两个容器分别落在两个他家的方位(左上 / 右上),与 HistoryView 的
|
||
* HIST_BOX_LEFT / HIST_BOX_RIGHT 同位;牌用 CARD_FACE_L 重叠排列(fan)。
|
||
*
|
||
* 元素说明:
|
||
* - 【按钮显示条件 D-6 已定,按 design 手册】可查牌模式 + 出牌阶段 +
|
||
* 【场上已有任一玩家报无主】(baozhu == 1) → 三家都显示「明牌」按钮,可随时查看、不限次数。
|
||
* 判定的是「场上有人报无主」,不是「自己报无主」——报无主的那位自己也能看。
|
||
* - 交互: 点按钮 → 发 mingpai { seat } → 收 mingpai { seat, others:[{seat, zhucards}] }
|
||
* → 弹出本面板。【再点一次取消是纯前端开关】,不再请求服务端。
|
||
* - 关闭方式: 点遮罩关闭;另可再点底栏按钮切换(与亮牌的「仅自动时长关闭」不同)。
|
||
* - 【牌用精灵复制】张数不定;编辑器里只建 1 遮罩 + 2 容器 + 1 牌模板 + 2 标签文字。
|
||
* 关闭 / onDestroy 时必须 removeRange 清理。
|
||
* - 【为什么与 HistoryView 拆成两个 View】版式相同、渲染逻辑可共用,但两者数据独立、
|
||
* 图层不同(304 vs 305);本项目约定「一个 View 恰好一个图层」,故各自成 View。
|
||
* - 【布局节点已补齐 · 2026-08-27】见 Layout_Result.js「明牌面板」一节:
|
||
* MING_MASK / MING_BOX / MING_FAN / MING_LABEL,与 HIST_* 同构,差别只在【家数】——
|
||
* bySeat 只有 LEFT / RIGHT 两个变体(MING_BOX_A 落 LEFT 位、MING_BOX_B 落 RIGHT 位),
|
||
* 没有 SELF 那排。坐标同为目视实测估值,待设计稿复核。
|
||
*
|
||
* 资源说明:
|
||
* - 遮罩: EQW_Images.MASK_DIM (609), 1 帧, 纯色可拉伸(与冲关/出牌历史共用同一资源)
|
||
* - 牌模板: EQW_Images.CARD_FACE_L (501), 60 帧, 单帧 110×190
|
||
*
|
||
* 精灵ID分配: 2000–2005(群组 243)
|
||
*
|
||
* @see docs_dev/二七王-UI资源与精灵清单.md §1.7 明牌(D-6)/ §2.6 底栏 / §5.7b
|
||
* @see docs_dev/uiref/冲关牌型显示.png
|
||
*/
|
||
//明牌(清单 §5.7b,Layer 305,群组 243,牌用精灵复制)——
|
||
//只显示另两家,数据 = mingpai.others[].zhucards(§1.7 D-6);
|
||
//版式与上方 HistoryView(Layer 304)相同(遮罩 + 每家一排牌),差别只在数据源与家数,两个 View 共用同一套渲染逻辑,
|
||
//但各自数据独立、图层不同,故拆成两个 View(一个 View 恰好一个图层)。
|
||
EQW_Sprites.MingPaiView = {
|
||
Layer: EQW_Layers.POPUP_MINGPAI, //305
|
||
|
||
MingPai: {
|
||
id: EQW_Groups.MINGPAI, //243
|
||
|
||
MING_MASK: 2000, //图片:明牌遮罩,资源 EQW_Images.MASK_DIM
|
||
MING_BOX_A: 2001, //容器:另一家A牌容器
|
||
MING_BOX_B: 2002, //容器:另一家B牌容器
|
||
MING_CARD_TPL: 2003, //模板:牌模板,资源 EQW_Images.CARD_FACE_L
|
||
MING_LABEL_A: 2004, //文字:A座位标签
|
||
MING_LABEL_B: 2005 //文字:B座位标签
|
||
}
|
||
};
|