二七王:LayoutSolver attach 加 ctx.w/ctx.h 运行时尺寸注入通道
求解冒烟守卫拿真实布局配置跑出 9 个失败节点:叫分档位分数文字、花色数量 文字、牌角标、结算文案等动态文字标签配置里有意不写 w/h(真实宽高要等 文案渲染出来才知道),此前的按对齐模式校验因此在 hAlign=center/right、 corner=topRight/bottomRight 时正确地抛错,但没给调用方注入真实尺寸的通道。 补 ctx.w/ctx.h,语义与已有的 ctx.target 对称:优先于配置里的 n.w/n.h, 校验与求解都用合并后的值,返回的 width/height 也用合并后的值(不再是 可能为 undefined 的配置原值);两处都缺且用得到该维度时仍抛错,错误信息 点明"配置未写 X,且 ctx.X 未给出"两条路径。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -171,8 +171,9 @@ var EQW_LayoutSolver = EQW_LayoutSolver || {
|
||||
},
|
||||
|
||||
//attach:贴在另一个精灵上。corner 为空 = 在目标【内部】对齐;有值 = 与目标对应角重合
|
||||
//target 支持运行时注入:叫分档位贴自己的按钮、花色图标贴自己的按钮、牌角标贴"打出的那张牌",
|
||||
//这类目标配置里写不出固定值,节点写成无 target 的模板,由 ctx.target 在运行时补上(ctx.target 优先于 n.target)
|
||||
//target/w/h 都支持运行时注入:叫分档位贴自己的按钮、花色图标贴自己的按钮、牌角标贴"打出的那张牌",
|
||||
//这类目标配置里写不出固定值;动态文字标签的真实宽高要等文案渲染出来才知道,配置里也留空。
|
||||
//这些节点写成模板,由 ctx.target/ctx.w/ctx.h 在运行时补上(ctx.* 优先于 n.* 里的同名字段)
|
||||
_solveAttach: function (n, ctx) {
|
||||
if (!ctx.rects) { throw new Error('[EQW_LayoutSolver] attach 需要 ctx.rects'); }
|
||||
var targetKey = ctx.target || n.target;
|
||||
@@ -180,7 +181,11 @@ var EQW_LayoutSolver = EQW_LayoutSolver || {
|
||||
var target = ctx.rects[targetKey];
|
||||
if (!target) { throw new Error('[EQW_LayoutSolver] attach 的 target 未在 ctx.rects 中: ' + targetKey); }
|
||||
|
||||
var sprite = { width: n.w, height: n.h };
|
||||
//ctx.w/ctx.h 优先于配置里的 n.w/n.h;后续的校验、求解、返回值一律用合并后的值
|
||||
var w = (typeof ctx.w === 'number') ? ctx.w : n.w;
|
||||
var h = (typeof ctx.h === 'number') ? ctx.h : n.h;
|
||||
|
||||
var sprite = { width: w, height: h };
|
||||
var offset = { x: n.offsetX || 0, y: n.offsetY || 0 };
|
||||
var pos;
|
||||
|
||||
@@ -191,41 +196,41 @@ var EQW_LayoutSolver = EQW_LayoutSolver || {
|
||||
case 'topLeft':
|
||||
pos = AlignmentUtils.alignCornerTopLeft(target, sprite, offset); break;
|
||||
case 'topRight':
|
||||
this._requireW(n, targetKey, 'corner=topRight');
|
||||
this._requireW(w, targetKey, 'corner=topRight');
|
||||
pos = AlignmentUtils.alignCornerTopRight(target, sprite, offset); break;
|
||||
case 'bottomLeft':
|
||||
this._requireH(n, targetKey, 'corner=bottomLeft');
|
||||
this._requireH(h, targetKey, 'corner=bottomLeft');
|
||||
pos = AlignmentUtils.alignCornerBottomLeft(target, sprite, offset); break;
|
||||
case 'bottomRight':
|
||||
this._requireW(n, targetKey, 'corner=bottomRight');
|
||||
this._requireH(n, targetKey, 'corner=bottomRight');
|
||||
this._requireW(w, targetKey, 'corner=bottomRight');
|
||||
this._requireH(h, targetKey, 'corner=bottomRight');
|
||||
pos = AlignmentUtils.alignCornerBottomRight(target, sprite, offset); break;
|
||||
default: throw new Error('[EQW_LayoutSolver] 未知 corner: ' + n.corner);
|
||||
}
|
||||
} else {
|
||||
//hAlign: center/right 要用 sprite.width;left 不用(AlignmentUtils.js 第106/111/101行)
|
||||
if (n.hAlign === 'center' || n.hAlign === 'right') {
|
||||
this._requireW(n, targetKey, 'hAlign=' + n.hAlign);
|
||||
this._requireW(w, targetKey, 'hAlign=' + n.hAlign);
|
||||
}
|
||||
//vAlign: 只有 middle 用 sprite.height;top/bottom 都不用(bottom 用的是 target.height,第132行)
|
||||
if (n.vAlign === 'middle') {
|
||||
this._requireH(n, targetKey, 'vAlign=' + n.vAlign);
|
||||
this._requireH(h, targetKey, 'vAlign=' + n.vAlign);
|
||||
}
|
||||
pos = AlignmentUtils.alignTo(target, sprite, n.hAlign, n.vAlign, offset);
|
||||
}
|
||||
|
||||
return [{ x: pos.x, y: pos.y, width: n.w, height: n.h }];
|
||||
return [{ x: pos.x, y: pos.y, width: w, height: h }];
|
||||
},
|
||||
|
||||
_requireW: function (n, targetKey, mode) {
|
||||
if (typeof n.w !== 'number') {
|
||||
throw new Error('[EQW_LayoutSolver] attach target=' + targetKey + '(' + mode + ')需要数字 w,当前缺失');
|
||||
_requireW: function (w, targetKey, mode) {
|
||||
if (typeof w !== 'number') {
|
||||
throw new Error('[EQW_LayoutSolver] attach target=' + targetKey + '(' + mode + ')需要数字 w:配置未写 w,且 ctx.w 未给出');
|
||||
}
|
||||
},
|
||||
|
||||
_requireH: function (n, targetKey, mode) {
|
||||
if (typeof n.h !== 'number') {
|
||||
throw new Error('[EQW_LayoutSolver] attach target=' + targetKey + '(' + mode + ')需要数字 h,当前缺失');
|
||||
_requireH: function (h, targetKey, mode) {
|
||||
if (typeof h !== 'number') {
|
||||
throw new Error('[EQW_LayoutSolver] attach target=' + targetKey + '(' + mode + ')需要数字 h:配置未写 h,且 ctx.h 未给出');
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user