/////////////////////////////////////////////////////////////// ////////// EQW_Layout: 阶段操作区配置(清单 §6.8)////////////// /////////////////////////////////////////////////////////////// // 【纯数据文件】无函数、无副作用;依赖 LayoutConstants.js 先加载 // (引用其 EQW_Layout.TEXT_STYLE.*,属 EQW_Layout 内部自引用)。 var EQW_Layout = EQW_Layout || {}; //===== 叫分面板 ===== EQW_Layout.CALL_PANEL_BG = { kind: 'point', x: 355, y: 140, w: 575, h: 170 }; EQW_Layout.CALL_HINT_BG = { kind: 'point', x: 470, y: 100, w: 345, h: 33 }; //14 档位按钮:grid 布局(清单 §6.1 示例,7×2) EQW_Layout.CALL_BTN_GRID = { kind: 'grid', anchorX: 640, anchorY: 160, cols: 7, rows: 2, itemWidth: 74, itemHeight: 56, spacingX: 7, spacingY: 24, anchor: 'center', fillOrder: 'row' }; //档位分数数字(多帧图数字精灵):贴对应档位按钮居中。CALL_BTN_1..14 是 14 个固定精灵,但本节点是共用模板, //target 由调用方按第几档注入(不预置单一 target)。 //宽度随位数变化(SpriteManager.setNumberImage 会按【字符数 × charWidth】自动改精灵宽), //故 w 留到运行时注入;高度恒为单字高,取 NUM_STYLE.CALL_SCORE.charHeight(SSOT,2026-08-26) //节点名去掉 _TEXT 后缀改为 _NUM:驱动的是数字图精灵而非文字精灵(2026-08-27) EQW_Layout.CALL_BTN_SCORE_NUM = { kind: 'attach', targetKind: 'sprite', hAlign: 'center', vAlign: 'middle', offsetY: 4, h: EQW_Layout.NUM_STYLE.CALL_SCORE.charHeight, runtime: ['target', 'w'] }; //档位子数角标:贴对应档位按钮右上角,纯文字无底图,清单未给宽高(同上,调用方注入 target) EQW_Layout.CALL_BTN_MULTIPLE_BADGE = { kind: 'attach', targetKind: 'sprite', corner: 'topRight', offsetX: -30, offsetY: 2, runtime: ['target', 'w', 'h'] }; EQW_Layout.CALL_BTN_NONE = { kind: 'point', x: 553, y: 345, w: 184, h: 57 }; //自己叫分大字 EQW_Layout.CALL_SELF_SCORE_TEXT = { kind: 'point', x: 570, y: 320, w: 140, h: 70, textStyle: EQW_Layout.TEXT_STYLE.CALL_BIG }; //===== 选主 / 投降面板 ===== EQW_Layout.MAIN_TITLE_BG = { kind: 'point', x: 330, y: 315, w: 425, h: 50 }; //4 花色 + 投降:投降不显示时只排前 4 项,anchor:left 保证前 4 个位置不变 EQW_Layout.MAIN_SUIT_LINE = { kind: 'line', direction: 'horizontal', anchorX: 330, anchorY: 373, itemWidth: 128, itemHeight: 55, spacing: 9, anchor: 'left' }; //张数数字:贴对应花色按钮下方居中,一个花色【一个】精灵,整串「N张」由 setNumberImage 显示。 //2026-08-26:原十位/个位两节点合并为本节点;宽度随位数变化(2 或 3 个字符)留到运行时注入, //高度恒为单字高,取 NUM_STYLE.MAIN_SUIT_COUNT.charHeight(SSOT) EQW_Layout.MAIN_SUIT_COUNT = { kind: 'attach', targetKind: 'sprite', hAlign: 'center', vAlign: 'bottom', offsetY: -6, h: EQW_Layout.NUM_STYLE.MAIN_SUIT_COUNT.charHeight, runtime: ['target', 'w'] }; //对数角标文字:贴对应花色按钮右上角(按钮帧内已含角标底,本节点只定位叠加的文字)。 //清单未给宽高(调用方注入 target) EQW_Layout.MAIN_SUIT_PAIR_BADGE = { kind: 'attach', targetKind: 'sprite', corner: 'topRight', offsetX: -36, offsetY: 2, w: 34, h: 18, runtime: ['target'] }; //===== 埋牌 / 出牌操作条 ===== //埋牌操作条:提示 / 倒计时(CD_SELF) / 埋牌,逐项不等宽(清单 §6.1) EQW_Layout.BURY_OPERATION_BAR = { kind: 'line', direction: 'horizontal', anchorX: 640, anchorY: 165, itemHeight: 63, spacing: 45, anchor: 'center', items: [ { key: 'BURY_BTN_TIP', width: 180 }, { key: 'CD_SELF', width: 60 }, { key: 'BURY_BTN_SUBMIT', width: 180 } ] }; //出牌操作条:倒计时(CD_SELF) / 出牌 / 提示,逐项不等宽(清单 §6.1)。 //2026-08-27 补上「提示」项:清单 §1.7 明确「出牌操作条 = 倒计时 + 出牌 按钮 + 提示 按钮 //(出牌阶段必须有)」,但 §6.8 给的 items 只有 [75,157](倒计时/出牌)——清单自身漏了提示; //排序照 §1.7 的行文(倒计时 → 出牌 → 提示)。 //【估值】提示 180:清单未给该项宽度;提示按钮与埋牌条的提示按钮同资源 BTN_TIP(§3.3 实测 180×63), //埋牌条 items 首项(同一个提示按钮)也取 180,故沿用 180,待设计稿复核。 //⚠ 本条 itemHeight 为 55(对齐出牌按钮 BTN_PLAY 157×55),而 BTN_TIP 原生高 63—— // 求解结果里提示项的 height 会是 55,实际显示高度以精灵自身资源为准;此高度差同样待设计稿裁定 // //2026-08-27 修订:补「提示」项后原先仍用 anchor:'center',导致整排重新居中、把已有的 //CD_SELF / PLAY_BTN_SUBMIT 两项相对原先(仅 2 项时)左移了 107.5px——「出牌」按钮的位置在 //参考图 `出牌.png` 是有实测依据的(556–711,宽约 156×57),不该因为插入第 3 项而漂移。 //改为 anchor:'left',把 anchorX 定成【首项 CD_SELF 的起点】,让先前已有的两项固定不动、只是 //在其后追加「提示」——与 FOOTER_FUNC_BUTTONS 用 anchor:'right' 固定住最右项「底牌」是同一思路 //(那边插入更早的项,这边追加更晚的项,对称地选左/右锚点)。 //反推 anchorX:_solveLineItems 在 anchor:'left' 下 start = anchorX,故 // PLAY_BTN_SUBMIT.x = anchorX + CD_SELF.width(75) + spacing(35) = anchorX + 110 //要 PLAY_BTN_SUBMIT.x ≈ 556(参考图实测),故 anchorX = 556 - 110 = 446。 //实际调用求解器验证(count=3,spacing=35): // CD_SELF x=446 width=75 (参考图目测约 444,估值层面 2px 差可接受) // PLAY_BTN_SUBMIT x=556 width=157 (与参考图 556–711 实测吻合) // PLAY_BTN_TIP x=748 width=180 EQW_Layout.PLAY_OPERATION_BAR = { kind: 'line', direction: 'horizontal', anchorX: 446, anchorY: 345, itemHeight: 55, spacing: 35, anchor: 'left', items: [ { key: 'CD_SELF', width: 75 }, { key: 'PLAY_BTN_SUBMIT', width: 157 }, { key: 'PLAY_BTN_TIP', width: 180 } ] }; //===== 浮层 ===== //捡分飘字:起始位置在此。动画参数(floatRise / floatDuration)见 EQW_Anim.SCORE_FLOAT,不在此重复(SSOT) EQW_Layout.GRADE_FLOAT = { kind: 'point', x: 570, y: 180, w: 170, h: 55 }; //状态提示条 · 等待类(如『等待庄家选主』)。与即时反馈类共用同一套精灵 BAR_TOAST/TXT_TOAST, //仅位置预设不同,调用方按提示类型二选一应用(清单 §2.8:收敛为 3 条) EQW_Layout.TOAST_WAIT = { kind: 'point', x: 500, y: 373, w: 320, h: 47 }; //状态提示条 · 即时反馈类(如『强甩失败』)。自动消失时长见 EQW_Anim.TOAST_DURATION,不在此重复(SSOT) EQW_Layout.TOAST_INSTANT = { kind: 'point', x: 462, y: 172, w: 363, h: 50 };