/////////////////////////////////////////////////////////////// ////////// EQW_Sprites: 精灵结构(清单 §5.4/§5.5 阶段操作区与浮层) /////////////////////////////////////////////////////////////// // 子游戏精灵段 1001–2999。结构与 Sprites_Table.js 一致: // View 下 Layer 为图层声明(一个 View 恰好一个图层),其余键是 group 容器; // 容器内 id 为群组 ID、其余键才是精灵 id。 // 连号精灵逐条写全,不用循环生成。 var EQW_Sprites = EQW_Sprites || {}; // ============================================================================ // 叫分面板 - Layer 104 (ACTION), Group 220 (CALL_PANEL) // ============================================================================ /** * 叫分面板 - CallPanelView * * 用途: 轮到【自己】叫分时在桌面中央弹出,14 个档位按钮(两行 × 7)+「不叫」按钮 + * 上方一条静态提示条。收到 jiaofen 推送后收起。轮到他家叫分时本面板不出现。 * * 布局说明(参考图 docs_dev/uiref/自己叫分.png 全景、docs_dev/uiref/叫分按钮面板.png 近景): * * ┌──────────────────────────────┐ y=100 x=470,345×33 * │ 70分坐庄才可投降 │ ← CALL_HINT_BG(1601) * └──────────────────────────────┘ y=133 +CALL_HINT_TEXT(1602) * ┌────────────────────────────────────────────────────────────┐ y=140 * │ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ │ x=355 * │ │70│ │65│ │60│ │55│ │50│ │45│ │40│ ← 行1 = 档位 1–7 │ 575×170 * │ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ │ * │ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ │ * │ │35│ │30│ │25│ │20│ │15│ │10│ │5 │ ← 行2 = 档位 8–14 │ * │ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ │ * └────────────────────────────────────────────────────────────┘ y=310 * ↑ CALL_PANEL_BG(1600) 面板底 * 档位排布 EQW_Layout.CALL_BTN_GRID: grid, anchor center, anchorX=640 anchorY=160, * cols=7 rows=2, itemWidth=74 itemHeight=56, spacingX=7 spacingY=24, fillOrder='row' * * 12 ┌──────────────┐ y=345 * ↑ │ 不 叫 │ x=553, 184×57 * CD_SELF └──────────────┘ y=402 * (CountdownView, ↑ CALL_BTN_NONE(1645)+CALL_BTN_NONE_TEXT(1646) * EQW_Layout.P_COUNTDOWN.SELF = 445,345) * * 单个档位按钮由【3 个精灵】叠成(第 n 档 n=1..14): * * ┌───────────────┐ * │ ┌────┐│ ← CALL_BTN_BADGE_n (1631+n-1) 文字精灵,随爬坡开关变 * │ │2子 ││ EQW_Layout.CALL_BTN_MULTIPLE_BADGE: attach 按钮 topRight(-30,+2) * │ 70 └────┘│ ← CALL_BTN_NUM_n (1617+n-1) 多帧图数字精灵 * │ │ EQW_Layout.CALL_BTN_SCORE_NUM: attach 按钮 center/middle(+4) * └───────────────┘ * ↑ CALL_BTN_n (1603+n-1) 按钮底(已含右上角角标底),74×56 * * 元素说明: * - 14 档固定为 70 65 60 55 50 45 40 / 35 30 25 20 15 10 5(行1 = 70…40,行2 = 35…5)。 * - 【按钮配色按档位位置写死,不随数据变】: * 位置 1–4 (70/65/60/55) → 帧1 浅黄底 + 蓝角标底 * 位置 5–7 (50/45/40) → 帧2 金黄底 + 绿角标底 * 位置 8–14 (35…5) → 帧3 橙底 + 深橙角标底 * 不可叫(已被叫过 / 不高于 currcall)→ 帧4 全灰 * ⚠ 参考图里角标写的 1子/2子/4子 是填充假数据(§0.5),恰好与三组配色一一对应, * 【不要据此以为颜色随子数变】——颜色按位置固定,角标数值才随爬坡开关变。 * 反证:常规算子下 50/45/40 与 35…5 的 multiple 同为 6 子,图里却是两种颜色。 * - 【两种数字,两种精灵】档位分数用多帧图数字精灵(带描边美术字,setNumberImage 整串一个 * 精灵,两位数不拆);角标子数用文字精灵(值域 2–15,随爬坡动态变,用文字最省)。 * - 可选性由服务端权威 currcall 决定,前端只据其置灰、不自行推导规则: * 暂定庄家首叫 → 5–70 全可选,【无「不叫」】;其后 → 只有严格低于 currcall 的档位可选。 * - 【悲观 UI】点击后只发包(jiaofen {seat, call},不叫为 call:0),面板收起与状态文字 * 出现一律等推送包到达再做;唯一允许的乐观处理是按钮本身防连点禁用。 * - 上方提示条「70分坐庄才可投降」是静态文字,仅在面板展开时显示。 * * 资源说明: * - 面板底: EQW_Images.PANEL_CALL_SCORE (602), 1 帧, 575×170 * - 提示条底: EQW_Images.BAR_HINT_TOP (603), 1 帧, 345×33 * - 档位按钮底: EQW_Images.BTN_CALL_SCORE (531), 4 帧, 74×56(含角标底,见上) * - 档位数字: EQW_Images.NUM_CALL_SCORE (635), 16 帧固定帧序 0123456789.+-x/p, * 单字符 30×40, 整图 480×40;charWidth 取 EQW_Layout.NUM_STYLE.CALL_SCORE.charWidth * - 不叫按钮: EQW_Images.BTN_NO_CALL (532), 1 帧, 184×57, 蓝色渐变 * * 精灵ID分配: 1600–1646(群组 220 号段 1600–1649) * * @see docs_dev/二七王-UI资源与精灵清单.md §1.3 叫分坐庄 / §5.4 Layer 104 / §6.8 * @see docs_dev/uiref/自己叫分.png * @see docs_dev/uiref/叫分按钮面板.png * @see docs_dev/uiref/自己已经叫分轮到下家叫分.png */ //叫分面板:14 档位按钮 + 「不叫」按钮(清单 §5.4,Layer 104 群组 220) EQW_Sprites.CallPanelView = { Layer: EQW_Layers.ACTION, //104 CallPanel: { id: EQW_Groups.CALL_PANEL, //220 CALL_PANEL_BG: 1600, //图片:面板底,资源 EQW_Images.PANEL_CALL_SCORE CALL_HINT_BG: 1601, //图片:提示条底,资源 EQW_Images.BAR_HINT_TOP CALL_HINT_TEXT: 1602, //文字:「70分坐庄才可投降」 //—— 14 档位按钮底(含角标底),资源 EQW_Images.BTN_CALL_SCORE,档位 70..5, // 帧1=浅黄+蓝角标(70/65/60/55) 帧2=金黄+绿角标(50/45/40) 帧3=橙+深橙角标(35..5) 帧4=灰(不可选), // 颜色按档位位置固定,仅因不可叫切换到灰帧4 —— CALL_BTN_1: 1603, CALL_BTN_2: 1604, CALL_BTN_3: 1605, CALL_BTN_4: 1606, CALL_BTN_5: 1607, CALL_BTN_6: 1608, CALL_BTN_7: 1609, CALL_BTN_8: 1610, CALL_BTN_9: 1611, CALL_BTN_10: 1612, CALL_BTN_11: 1613, CALL_BTN_12: 1614, CALL_BTN_13: 1615, CALL_BTN_14: 1616, //—— 14 档位分数数字(多帧图数字精灵),资源 EQW_Images.NUM_CALL_SCORE(16 帧固定帧序), // 字符宽见 EQW_Layout.NUM_STYLE.CALL_SCORE.charWidth。 // 显示用 SpriteManager.setNumberImage(spriteId, '70', charWidth):整串交给引擎按字符逐帧渲染、 // 精灵宽度自动按字符数调整,故 14 档(其中 13 档是两位数)各只需【一个】精灵,不拆十位/个位 —— CALL_BTN_NUM_1: 1617, CALL_BTN_NUM_2: 1618, CALL_BTN_NUM_3: 1619, CALL_BTN_NUM_4: 1620, CALL_BTN_NUM_5: 1621, CALL_BTN_NUM_6: 1622, CALL_BTN_NUM_7: 1623, CALL_BTN_NUM_8: 1624, CALL_BTN_NUM_9: 1625, CALL_BTN_NUM_10: 1626, CALL_BTN_NUM_11: 1627, CALL_BTN_NUM_12: 1628, CALL_BTN_NUM_13: 1629, CALL_BTN_NUM_14: 1630, //—— 14 档位 multiple 子数角标文字(「2子」…「15子」),随爬坡规则开关变 —— CALL_BTN_BADGE_1: 1631, CALL_BTN_BADGE_2: 1632, CALL_BTN_BADGE_3: 1633, CALL_BTN_BADGE_4: 1634, CALL_BTN_BADGE_5: 1635, CALL_BTN_BADGE_6: 1636, CALL_BTN_BADGE_7: 1637, CALL_BTN_BADGE_8: 1638, CALL_BTN_BADGE_9: 1639, CALL_BTN_BADGE_10: 1640, CALL_BTN_BADGE_11: 1641, CALL_BTN_BADGE_12: 1642, CALL_BTN_BADGE_13: 1643, CALL_BTN_BADGE_14: 1644, CALL_BTN_NONE: 1645, //图片:「不叫」按钮,资源 EQW_Images.BTN_NO_CALL CALL_BTN_NONE_TEXT: 1646 //文字:按钮文案「不叫」 } }; // ============================================================================ // 选主 / 投降面板 - Layer 104 (ACTION), Group 221 (CHOOSE_MAIN) // ============================================================================ /** * 选主 / 投降面板 - ChooseMainView * * 用途: 庄家上庄后弹出,让庄家在【4 个花色】与【投降】之间二选一(同一决策点、互斥)。 * 只有庄家看得到;两个闲家此时看到的是「等待庄家选主」提示条(OverlayView)。 * 收到 xuanzhu 推送后收起,进入埋牌。 * * 布局说明(参考图 docs_dev/uiref/亮主.png): * * ┌─────────────────────────────────────────┐ y=315 x=330, 425×50 * │ 亮主 20 │ ← MAIN_TITLE_BG(1650) 斜角条 * └─────────────────────────────────────────┘ y=365 +MAIN_TITLE_TEXT(1651)「亮主」 * ↑ ↑ * 标题文字 倒计时 CD_SELF(属 CountdownView,不在本群组) * * ┌─────────┐┌─────────┐┌─────────┐┌─────────┐┌─────────┐ y=373 x=330 起 * │ ♠ 2对 ││ ♥ 2对 ││ ♣ 2对 ││ ♦ 2对 ││ 投 降 │ 128×55,间距 9 * │ 6张 ││ 8张 ││ 6张 ││ 7张 ││ │ * └─────────┘└─────────┘└─────────┘└─────────┘└─────────┘ y=428 * ↑ ↑ ↑ ↑ * │ │ └ MAIN_SUIT_BTN_2(1653) … └ MAIN_BTN_SURRENDER(1672) * │ └ MAIN_SUIT_PAIR_TEXT_n(1668+)「N对」文字精灵,叠在按钮帧内的角标底上 * │ EQW_Layout.MAIN_SUIT_PAIR_BADGE: attach 按钮 topRight(-36,+2), 34×18 * └ MAIN_SUIT_BTN_1(1652):一个精灵一帧就含「按钮底 + 花色图标 + 右上角蓝色角标底」 * 下方 MAIN_SUIT_COUNT_n(1674+)「N张」多帧图数字精灵 * EQW_Layout.MAIN_SUIT_COUNT: attach 按钮 center/bottom(-6) * * 排布 EQW_Layout.MAIN_SUIT_LINE: line/horizontal, anchor='left', * anchorX=330 anchorY=373, itemWidth=128 itemHeight=55, spacing=9 * —— anchor 取 left 是有意的:投降按钮不显示时只排前 4 项,前 4 个位置保持不变。 * * 元素说明: * - 花色按钮帧 = 花色序号 1–4,按【服务端 flower 编号】:帧1=方块♦ 帧2=梅花♣ * 帧3=红心♥ 帧4=黑桃♠。⚠ 参考图上 4 个按钮自左向右显示为 ♠♥♣♦,与 flower 编号相反; * 槽位与帧的对应由渲染代码决定,本文件只登记 4 个精灵、不预设槽位顺序。 * - 「N对」= 该花色的对子数;「N张」= 该花色在庄家手中的总张数(两副牌单花色最多 26 张)。 * 两者都【由前端据自己的 cards 本地统计】,协议明确服务端不额外下发。 * - 「N张」用 SpriteManager.setNumberImage(spriteId, '26张', charWidth) 在【一个】精灵上 * 显示整串,后缀「张」= 资源第 16 帧;不拆十位/个位(2026-08-26 定案,见下方空号说明)。 * - 投降按钮仅 touxiang === 1(即叫分 70)时显示;点它直接跳到结算,不选主、不埋牌、不出牌。 * - 交互:点花色 → xuanzhu { seat, flower };点投降 → touxiang { seat }。收包后才收面板。 * - 【时序】收到 xuanzhu 推送后:顶部信息条「主」列显示花色图标 → 手牌按新主牌集合重排 * (正2/正7 升格为主牌)→ 本面板收起 → 进入埋牌。 * * 资源说明: * - 标题斜角条: EQW_Images.BAR_CHOOSE_MAIN (604), 1 帧, 425×50 * - 花色/投降按钮: EQW_Images.BTN_SUIT_CHOOSE (533), 5 帧, 128×55 * 帧1–4 = 四花色按钮(各含按钮底 + 花色图标 + 右上角蓝色角标底);帧5 = 投降按钮(含文字) * - 张数数字: EQW_Images.NUM_MAIN_SUIT_COUNT (636), 16 帧固定帧序, 单字符 24×32, * 整图 384×32, 第 16 帧 = 后缀「张」;charWidth 取 NUM_STYLE.MAIN_SUIT_COUNT.charWidth * * 精灵ID分配: 1650–1655 / 1668–1672 / 1674–1677(群组 221 号段 1650–1699) * —— 中间的空号是美术改一张图 5 帧出图后作废的键,逐条追溯见下方原注释。 * * @see docs_dev/二七王-UI资源与精灵清单.md §1.5 选主·投降 / §5.4 / §6.8 * @see docs_dev/uiref/亮主.png */ //选主/投降面板:4 花色按钮 + 投降按钮(清单 §5.4,Layer 104 群组 221) // //以下键号在源清单中被显式判定「不需要」,本文件不占用,留空号以便追溯(美术改一张图 5 帧出图, //花色图标与右上角角标底已并入 BTN_SUIT_CHOOSE 各帧,2026-08-26): // 1656–1659 MAIN_SUIT_ICON_1..4 —— 花色图标并入 BTN_SUIT_CHOOSE 帧1–4 // 1660–1663 MAIN_SUIT_COUNT_1..4 —— 原文字精灵,改为下方数字图片精灵(键名沿用,ID 改到 1674–1677) // 1664–1667 MAIN_SUIT_PAIR_BG_1..4 —— 角标底并入 BTN_SUIT_CHOOSE 帧1–4 // 1673 MAIN_BTN_SURRENDER_TEXT —— 「投降」二字并入 BTN_SUIT_CHOOSE 帧5 // 1678–1681 原 MAIN_SUIT_COUNT_3/4_TENS/ONES —— 张数改回「一个花色一个精灵」(多帧图数字,见下: // SpriteManager.setNumberImage 一个精灵就能显示整串),上一轮的十位/个位拆分作废, // 空出的 4 个 ID 不复用(2026-08-26) EQW_Sprites.ChooseMainView = { Layer: EQW_Layers.ACTION, //104 ChooseMain: { id: EQW_Groups.CHOOSE_MAIN, //221 MAIN_TITLE_BG: 1650, //图片:「亮主」斜角条,资源 EQW_Images.BAR_CHOOSE_MAIN MAIN_TITLE_TEXT: 1651, //文字:「亮主」 //—— 4 个花色按钮,资源 EQW_Images.BTN_SUIT_CHOOSE,帧 = 花色序号 1–4(服务端 flower 编号), // 该帧已含「按钮底 + 花色图标 + 右上角蓝色角标底」—— MAIN_SUIT_BTN_1: 1652, MAIN_SUIT_BTN_2: 1653, MAIN_SUIT_BTN_3: 1654, MAIN_SUIT_BTN_4: 1655, //—— 4 个对数角标文字:「N对」,叠在对应花色按钮的角标底之上 —— MAIN_SUIT_PAIR_TEXT_1: 1668, MAIN_SUIT_PAIR_TEXT_2: 1669, MAIN_SUIT_PAIR_TEXT_3: 1670, MAIN_SUIT_PAIR_TEXT_4: 1671, //—— 4 个花色张数数字精灵(多帧图数字精灵,一花色一个):该花色在庄家手中的张数 // (两副牌单花色最多 26 张,两位数),资源 EQW_Images.NUM_MAIN_SUIT_COUNT(16 帧固定帧序, // 第16帧=后缀「张」),字符宽见 EQW_Layout.NUM_STYLE.MAIN_SUIT_COUNT.charWidth。 // 显示用 SpriteManager.setNumberImage(spriteId, '26张', charWidth),整串一个精灵搞定, // 不拆十位/个位(2026-08-26)—— MAIN_SUIT_COUNT_1: 1674, MAIN_SUIT_COUNT_2: 1675, MAIN_SUIT_COUNT_3: 1676, MAIN_SUIT_COUNT_4: 1677, MAIN_BTN_SURRENDER: 1672 //图片:「投降」按钮,资源 EQW_Images.BTN_SUIT_CHOOSE 帧5(已含底与「投降」字) } }; // ============================================================================ // 阶段操作条 - Layer 104 (ACTION), Group 222 (BURY_BAR) / 223 (PLAY_BAR) // ============================================================================ /** * 埋牌 / 出牌操作条 - OperationBarView * * 用途: 自己该行动时,在手牌区【上方】横排一条操作按钮。两条操作条按阶段【互斥】出现: * 埋牌条只有庄家在埋牌阶段看得到,出牌条在出牌阶段轮到自己时出现。 * 两条都把倒计时 CD_SELF 排在自己的 items 里,故倒计时随操作条一起移动。 * * 布局说明(参考图 docs_dev/uiref/庄家埋牌.png = 埋牌条;docs_dev/uiref/出牌.png = 出牌条): * * 埋牌操作条(群组 222,EQW_Layout.BURY_OPERATION_BAR) * line/horizontal, anchor center, anchorX=640 anchorY=165, itemHeight=63, spacing=45 * items 逐项不等宽:BURY_BTN_TIP 180 / CD_SELF 60 / BURY_BTN_SUBMIT 180 * * ┌────────────────┐ ┌────────────────┐ y=165 * │ 提示 │ 12 │ 埋牌 (1/8) │ * └────────────────┘ ↑ └────────────────┘ y=228 * ↑ CD_SELF ↑ * BURY_BTN_TIP(1700) BURY_BTN_SUBMIT(1702) * +_TEXT(1701) +_TEXT(1703)「埋牌 (N/8)」 * 帧1=可提交(金黄) / 帧2=灰(未满 8 张) * * ┌── 手牌【双排】(Layer 102,见 Sprites_Cards.js HandView)──┐ y=285 起 * * 出牌操作条(群组 223,EQW_Layout.PLAY_OPERATION_BAR) * line/horizontal, anchor center, anchorX=640 anchorY=345, itemHeight=55, spacing=35 * items:CD_SELF 75 / PLAY_BTN_SUBMIT 157 * * 20 ┌──────────────┐ y=345 * ↑ │ 出 牌 │ * CD_SELF └──────────────┘ y=400 * ↑ PLAY_BTN_SUBMIT(1710)+_TEXT(1711) * 帧1=可出 / 帧2=灰(选中牌数为 0 时) * * ┌── 手牌【单排】(Layer 102)──┐ y=455 起 * * 元素说明: * - 埋牌条:N 为已选张数,N < 8 时提交按钮置灰;选中的牌在手牌区上浮表示待埋。 * 提交后庄家手牌回到单排 28 张。 * - 出牌条:点手牌选中(上浮)→ 点「出牌」→ 发 chupai { seat, cards }。 * 【只发意图不发结论】——不回传牌型、不回传「我最大」之类判定;前端可用 shared/ 做本地 * 预校验与提示,结果不回传。 * - 【自动选中】服务端会在下发包里带「应当选中的牌」(mustcard, S-2),前端收到后自动把这些 * 牌选中上浮,玩家确认后点「出牌」即可——方向是服务端→前端的建议,不违反红线。 * - 【缺口】出牌阶段的「提示」按钮 PLAY_BTN_TIP(1712)/PLAY_BTN_TIP_TEXT(1713) 已登记精灵 * (清单 §1.7 明确「出牌阶段必须有」),但参考图 出牌.png 里未画出, * EQW_Layout.PLAY_OPERATION_BAR 的 items 也只排了倒计时与出牌两项—— * 该按钮的位置【待设计稿】,补稿后在 items 里加一项即可,本文件不预设坐标。 * * 资源说明: * - 提示按钮: EQW_Images.BTN_TIP (535), 1 帧, 180×63, 蓝色渐变(埋牌/出牌两条共用同一资源) * - 埋牌按钮: EQW_Images.BTN_BURY (536), 2 帧, 180×63, 帧1=可提交 帧2=置灰 * - 出牌按钮: EQW_Images.BTN_PLAY (537), 2 帧, 157×55, 帧1=可出 帧2=置灰 * * 精灵ID分配: 1700–1703(埋牌条)/ 1710–1713(出牌条) * * @see docs_dev/二七王-UI资源与精灵清单.md §1.6 埋牌 / §1.7 出牌对局 / §5.4 / §6.8 * @see docs_dev/uiref/庄家埋牌.png * @see docs_dev/uiref/出牌.png */ //操作条:埋牌操作条(群组 222)+ 出牌操作条(群组 223),同一屏幕位置随阶段互斥展示(清单 §5.4) EQW_Sprites.OperationBarView = { Layer: EQW_Layers.ACTION, //104 BuryBar: { id: EQW_Groups.BURY_BAR, //222 BURY_BTN_TIP: 1700, //图片:「提示」按钮,资源 EQW_Images.BTN_TIP BURY_BTN_TIP_TEXT: 1701, //文字:按钮文案「提示」 BURY_BTN_SUBMIT: 1702, //图片:「埋牌」按钮,资源 EQW_Images.BTN_BURY,帧1=可提交 帧2=灰(未满8张) BURY_BTN_SUBMIT_TEXT: 1703 //文字:「埋牌 (N/8)」 }, PlayBar: { id: EQW_Groups.PLAY_BAR, //223 PLAY_BTN_SUBMIT: 1710, //图片:「出牌」按钮,资源 EQW_Images.BTN_PLAY,帧1=可出 帧2=灰 PLAY_BTN_SUBMIT_TEXT: 1711, //文字:按钮文案「出牌」 PLAY_BTN_TIP: 1712, //图片:「提示」按钮(出牌阶段必备),资源 EQW_Images.BTN_TIP PLAY_BTN_TIP_TEXT: 1713 //文字:按钮文案「提示」 } }; // ============================================================================ // 倒计时 - Layer 104 (ACTION), Group 224 (COUNTDOWN) // ============================================================================ /** * 倒计时 - CountdownView * * 用途: 把当前操作者剩余的秒数显示在【他自己的位置旁】。三家各一个精灵, * 按当前操作者显隐其一——所以看到数字在哪儿,就知道在等谁。 * * 布局说明(参考图:等待叫分.png 的「12」在左上家、出牌2.png 的「15」在左上家、 * 自己叫分.png 的「12」在不叫按钮左侧、庄家埋牌.png 的「12」在操作条中间): * * ┌──────────────────────────────────────────────────────────────┐ y=0 * │ ┌ 顶部信息条 ┐ │ * │ ┌────┐ ┌────┐ │ * │ │头像│ 12 15 │头像│ │ y≈165 * │ └────┘ ↑ ↑ └────┘ │ * │ CD_LEFT(1150) CD_RIGHT(1151) │ * │ point(195,165) point(1010,165) │ * │ │ * │ 20 ┌──────────┐ │ y≈345 * │ ↑ │ 出 牌 │ │ * │ CD_SELF └──────────┘ │ * │ (1152) │ * └──────────────────────────────────────────────────────────────┘ y=720 * * ⚠ 左右两家的倒计时与该家的状态文字(P_LEFT/RIGHT_STATUS_TEXT,见 Sprites_Table.js) * 落在【同一块区域】:轮到他时显示秒数,他表态后显示「60分」/「不叫」,两者不共存。 * * CD_SELF 一个精灵、三处落点,由当前阶段的布局节点决定: * 叫分阶段 → EQW_Layout.P_COUNTDOWN.SELF = point(445, 345)(不叫按钮左侧) * 埋牌阶段 → EQW_Layout.BURY_OPERATION_BAR 的 items 第 2 项(提示与埋牌之间,y=165) * 出牌阶段 → EQW_Layout.PLAY_OPERATION_BAR 的 items 第 1 项(出牌按钮左侧,y=345) * 选主阶段 → 参考图 亮主.png 显示在「亮主」标题条内、标题文字右侧(布局节点待补) * * 元素说明: * - 三个精灵均为【多帧图数字精灵】而非文字精灵(2026-08-27 订正):玩家视线焦点、视觉权重 * 最高的数字,参考图是带描边/渐变的美术字,文字精灵做不出这个效果。 * 显示走 SpriteManager.setNumberImage(spriteId, '15', charWidth),纯秒数、无后缀。 * - 布局节点 EQW_Layout.P_COUNTDOWN 的 h 恒取 NUM_STYLE.COUNTDOWN.charHeight(SSOT), * w 留到运行时注入——setNumberImage 会按【字符数 × charWidth】自动改精灵宽。 * - 数据来源:各包的 countdown 字段。 * - 【只做展示,不触发任何操作】倒计时归零后不自动叫分/选主/埋牌/出牌,也不判负、不跳过; * 前端不得在归零时做任何乐观界面推进(不跳阶段、不清控制权),一切仍等服务端推送。 * 超时裁定在服务端,前端只做插值显示。 * - 【归零后停在 0 继续显示,不隐藏】——隐藏会被误读为「已超时 / 已跳过」。 * * 资源说明: * - 数字: EQW_Images.NUM_COUNTDOWN (631), 16 帧固定帧序 0123456789.+-x/p, * 单字符 44×60, 整图 704×60;帧11–15 本套用不到但必须留占位,帧16 出空白(无后缀) * - charWidth / charHeight 只在 EQW_Layout.NUM_STYLE.COUNTDOWN 定义一处,业务代码只引用 * * 精灵ID分配: 1150–1152(群组 224 号段 1150–1159) * * @see docs_dev/二七王-UI资源与精灵清单.md §2.4 倒计时 / §5.4 / §6.8 * @see docs_dev/uiref/等待叫分.png * @see docs_dev/uiref/自己叫分.png * @see docs_dev/uiref/庄家埋牌.png */ //倒计时:左上家/右上家/自己 三处操作区倒计时(清单 §5.4,Layer 104 群组 224) // //三处均为【多帧图数字精灵】(非文字精灵):玩家视线焦点、视觉权重最高的数字,参考图是带描边/渐变 //的美术字,文字精灵做不出这个效果。资源 EQW_Images.NUM_COUNTDOWN(16 帧固定帧序),纯秒数无后缀。 //显示用 SpriteManager.setNumberImage(spriteId, '15', charWidth),charWidth 见 //EQW_Layout.NUM_STYLE.COUNTDOWN.charWidth(2026-08-27,与 NUM_STYLE.COUNTDOWN 一起落地) EQW_Sprites.CountdownView = { Layer: EQW_Layers.ACTION, //104 Countdown: { id: EQW_Groups.COUNTDOWN, //224 CD_LEFT: 1150, //多帧图数字精灵:左上家位倒计时 CD_RIGHT: 1151, //多帧图数字精灵:右上家位倒计时 CD_SELF: 1152 //多帧图数字精灵:自己操作区倒计时 } }; // ============================================================================ // 桌面浮层 - Layer 105 (OVERLAY), Group 230 (OVERLAY) // ============================================================================ /** * 桌面浮层 - OverlayView * * 用途: 盖在牌桌之上的一次性/短时表现层,三类互不相干的东西共用一个群组: * (1) 闲家提示气泡 (2) 捡分飘字 (3) 通用状态提示条。 * 都是「浮」在桌面上、不属于任何固定面板的元素,故集中在 Layer 105。 * * 布局说明(参考图:自己是闲家时,底下的踩有分没分按钮.png = 气泡入口; * 出牌2.png 中央的「20分」= 捡分飘字;强甩失败提示.png / 等待庄家选主.png = 提示条): * * ┌──────────────────────────────────────────────────────────────┐ y=0 * │ ┌ 顶部信息条 ┐ │ * │ ┌────┐ ┌────┐ │ * │ │头像│(踩) (踩)│头像│ │ y≈122 * │ └────┘ ↑ ↑ └────┘ │ * │ BUBBLE_TISHI_LEFT(1750) BUBBLE_TISHI_RIGHT(1751) │ * │ 箭头向左(帧1–3) 箭头向右(帧4–6) │ * │ │ * │ ┌────────────────────────────────┐ │ y=172 * │ │ 强 甩 失 败 │ ← TOAST_INSTANT│ 462,363×50 * │ └────────────────────────────────┘ │ * │ ┌──────────────┐ │ y=180 * │ │ 20分 │ ← GRADE_FLOAT │ 570,170×55 * │ └──────────────┘ │ * │ │ * │ ┌────────────────────────────┐ │ y=373 * │ │ 等待庄家选主 │ ← TOAST_WAIT │ 500,320×47 * │ └────────────────────────────┘ │ * └──────────────────────────────────────────────────────────────┘ y=720 * * (1) 提示气泡 BUBBLE_TISHI_LEFT/RIGHT/SELF (1750–1752) * EQW_Layout.TISHI_BUBBLE, attach 平台头像框, 96×44(尺寸为占位估值,资源待定稿): * LEFT → attach P_LEFT_AVATAR(379) right/middle, offsetX=+10, arrowRight=false * RIGHT → attach P_RIGHT_AVATAR(377) left/middle, offsetX=-10, arrowRight=true * SELF → attach P_SELF_AVATAR(376) right/top, offset(+10,-70), arrowRight=false * 帧 = (arrowRight ? 3 : 0) + tip,tip:1踩 2没分 3有分。 * 【朝向是配置项 arrowRight,不按座位硬判】——头像在气泡左侧就用箭头向左的帧。 * (2) 捡分飘字 GRADE_FLOAT_BG(1755) + GRADE_FLOAT_TEXT(1756) * EQW_Layout.GRADE_FLOAT = point(570, 180, 170×55) 为【起始】位置; * 上飘与时长见 EQW_Anim.SCORE_FLOAT = { rise: -60, duration: 800 }(SSOT,布局里不重复)。 * (3) 通用状态提示条 BAR_TOAST(1760) + TXT_TOAST(1761) * 整局【复用同一套精灵】,只换文案与位置预设,两个预设二选一: * 等待类(常驻到状态结束)→ EQW_Layout.TOAST_WAIT = point(500, 373, 320×47) * 即时反馈类(自动淡出) → EQW_Layout.TOAST_INSTANT = point(462, 172, 363×50) * 自动消失时长见 EQW_Anim.TOAST_DURATION = 1500(SSOT)。 * * 元素说明: * - 【提示条文案共 3 条,T-33 已定案】: * 「等待庄家选主」 状态类,两个闲家可见,收 shangzhuang 后 → 收 xuanzhu 前 * 「等待庄家埋牌」 状态类,两个闲家可见,收 xuanzhu 后 → 收 maipai 前 * 「强甩失败」 即时反馈,全场可见,收到 chupai1.shuaicuo == 1 时,自动淡出 * 明确【不做】:叫分等待 / 出牌等待(倒计时已指明在等谁)、准备等待(平台自带标识)、 * 掉线重连提示(平台已覆盖)、开底提示(画面本身已说清楚)。文案表进配置,不写死字符串。 * - 【甩错 D-3 已定】不做收回动画——甩出的牌不演「飞回手里」,直接按服务端下发的 cards * (被强制打出的最小主牌单张)落牌即可,另配一条「强甩失败」提示。 * - 【气泡的受控例外】服务端只把提示转发给对家、不回执给发送者,所以发送者【自己的气泡由 * 前端在点击时本地回显】。这是「悲观 UI」红线的一处受控例外,成立理由是提示不含任何对局 * 状态、不改阶段/控制权/分数,服务端也明确不校验其真实性;失败回包到达时须撤掉本地回显。 * 本人看不到自己的气泡(BUBBLE_TISHI_SELF 是给对家看的,见清单 §6.6)。 * - 【报无主 D-4 已定】不做全场提示,唯一界面变化是他家的主N/对N 角标出现(PlayerMarkView)。 * * 资源说明: * - 气泡: EQW_Images.BUBBLE_TISHI (651), 6 帧 (3×2), 尺寸待定 * 帧1=踩·左 帧2=没分·左 帧3=有分·左 / 帧4=踩·右 帧5=没分·右 帧6=有分·右 * - 提示条底: EQW_Images.BAR_TOAST (653), 1 帧, 363×50, 可九宫拉伸(按文案长度变宽) * - 捡分飘字底: EQW_Images.TXT_GRADE_FLOAT (654), 1 帧, 尺寸待定 * * 精灵ID分配: 1750–1752 / 1755–1756 / 1760–1761(群组 230 号段 1750–1799) * —— 中间空号(1753/1754/1757/1758/1759)是清单显式判定「不需要」的键,见下方原注释。 * * @see docs_dev/二七王-UI资源与精灵清单.md §2.8 状态提示条 / §1.7 闲家提示·甩错 / §5.5 / §6.8 * @see docs_dev/uiref/自己是闲家时,底下的踩有分没分按钮.png * @see docs_dev/uiref/强甩失败提示.png * @see docs_dev/uiref/等待庄家选主.png * @see docs_dev/uiref/出牌2.png */ //桌面浮层:提示气泡 + 通用状态提示条 + 捡分飘字(清单 §5.5,Layer 105 群组 230) // //以下键号在源清单中被显式判定「不需要」,本文件不占用,留空号以便追溯: // 1753 TXT_BAOZHU —— 报无主不做全场提示(D-4),只让他家 主N/对N 角标出现 // 1754/1759 BAR_SHUAICUO —— 甩错提示并入通用状态提示条 BAR_TOAST/TXT_TOAST(§2.8) // 1757/1758 BOTTOM_3S_* —— 70分底牌亮3秒复用底牌区翻牌(D-2),仅可见范围不同,不单独建精灵 EQW_Sprites.OverlayView = { Layer: EQW_Layers.OVERLAY, //105 Overlay: { id: EQW_Groups.OVERLAY, //230 //—— 提示气泡:踩/没分/有分,按发送者位置三选一显示,资源 EQW_Images.BUBBLE_TISHI, // 帧 = (arrowRight ? 3 : 0) + tip(tip:1踩 2没分 3有分);朝向为配置项 arrowRight,非按座位硬判(清单 §6.6)—— BUBBLE_TISHI_LEFT: 1750, //左上家气泡:头像在气泡左侧,箭头向左,帧1–3,attach 头像框 hAlign:right BUBBLE_TISHI_RIGHT: 1751, //右上家气泡:头像在气泡右侧,箭头向右,帧4–6,attach 头像框 hAlign:left BUBBLE_TISHI_SELF: 1752, //自己气泡:头像在气泡左侧,箭头向左,帧1–3(本人看不到自己气泡,仅对家可见,见清单 §6.6) GRADE_FLOAT_BG: 1755, //图片:捡分飘字底,资源 EQW_Images.TXT_GRADE_FLOAT GRADE_FLOAT_TEXT: 1756, //文字:「20分」 BAR_TOAST: 1760, //图片:通用状态提示条底(等待类/即时反馈类共用,收敛为 3 条,见清单 §2.8),资源 EQW_Images.BAR_TOAST,可九宫拉伸 TXT_TOAST: 1761 //文字:提示文案 } };