- I1:Layers.js 群组 206 改名遗漏一处注释(亮牌信息条 → 主牌统计条),全仓复查确认无第二处 - I2:出牌操作条补「提示」项后 anchor:center 导致已有两项挤偏,改用 anchor:left 并反推 anchorX=446,令「出牌」按钮回到参考图实测 x≈556(求解器验证:446/556/748) - I3:HIST_FAN/MING_FAN 的 maxWidth 反推算错(旧注释「488」有误,实际总宽恒等于 maxWidth=500),导致 RIGHT 座位整排超出画布 5px;收窄为 490 使三座位求解结果落在 0-1280 内,订正注释与清单 §6.9c 对应文字 - M3:同步修正计划文档里遗留的旧名「亮牌信息条/亮牌条」 - M6:test_constants.js 补 items[].key 的三命名空间解析守卫(此前完全无守卫) - M5/M7:订正 ACC_ROW_TEXT_GRID 与扣底按钮宽度的估值依据说明 - M1/M2:清单 §6.9 子节重新排序为 6.9a→6.9b→6.9c 并统一标题层级,修正脚注星号误渲染 client/tests/run.js 与 server/games/erqiwang/test/run.js 均全绿,精灵总数(380)/ 布局节点数(83) 两个钉死断言未变。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
127 lines
6.9 KiB
JavaScript
127 lines
6.9 KiB
JavaScript
///////////////////////////////////////////////////////////////
|
||
////////// 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 };
|