From 303f05e870955d810a6f521373479ee2beb12697 Mon Sep 17 00:00:00 2001 From: kim jeong yong Date: Mon, 20 Jul 2026 16:14:32 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=B3=80=EC=88=98=20=ED=91=9C=EC=8B=9C?= =?UTF-8?q?=EC=B0=BD=20=EC=A2=8C=ED=91=9C=EB=A5=BC=20=EC=9C=A0=ED=95=9C=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=EB=A1=9C=20=EB=B3=B4=EC=A0=95=ED=95=B4=20?= =?UTF-8?q?=EC=BB=A4=EC=84=9C=20=EC=98=A4=EC=9E=91=EB=8F=99=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Number.MAX_VALUE 등 극단값이 좌표로 저장된 변수(예: 대답 표시창)의 경우 스테이지 스케일과 곱해질 때 Infinity 로 오버플로되고, easeljs 히트테스트의 setTransform 이 non-finite 인자로 무시되면서 마우스 커서가 항상 변수 뷰에 걸려 캔버스 커서가 move 로 바뀌는 문제가 있었음. Variable.sanitizeCoordinate 를 추가해 setX/setY 와 생성자에서 좌표를 ±10000 유한 범위로 clamp 하고, 비유한 값은 0 으로 보정. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/class/variable/variable.js | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/class/variable/variable.js b/src/class/variable/variable.js index 3dd416ca2d..58540695d1 100644 --- a/src/class/variable/variable.js +++ b/src/class/variable/variable.js @@ -9,6 +9,15 @@ import BinPacking from '../../util/binPacking'; const VariableBP = new BinPacking(460, 250); const bpReplace = _throttle(VariableBP.replace.bind(VariableBP)); +/* + * 변수 표시창 좌표 허용 범위. + * Number.MAX_VALUE 같은 극단값이 좌표로 저장된 프로젝트의 경우 스테이지 스케일과 곱해질 때 + * Infinity 로 오버플로되고, easeljs 히트테스트의 setTransform 이 non-finite 인자로 무시되어 + * 마우스 커서가 항상 변수 뷰에 걸리는 문제가 있었음. + * 표시창을 화면 밖으로 숨기는 용도는 이 범위로 충분하다. + */ +const COORDINATE_LIMIT = 10000; + /** * 기본 변수블록 객체 * @param {Object} variable variableMetadata @@ -65,9 +74,9 @@ class Variable { this.visible_ = variable.visible || typeof variable.visible === 'boolean' ? variable.visible : true; /** @type {number} */ - this.x_ = variable.x ? variable.x : null; + this.x_ = variable.x ? Variable.sanitizeCoordinate(variable.x) : null; /** @type {number} */ - this.y_ = variable.y ? variable.y : null; + this.y_ = variable.y ? Variable.sanitizeCoordinate(variable.y) : null; const fontFamily = EntryStatic.fontFamily || "NanumGothic, 'Nanum Gothic'"; this.BORDER = 6; this.FONT = `10pt ${fontFamily}`; @@ -376,13 +385,27 @@ class Variable { this.updateView(); } + /** + * 좌표값을 유한한 허용 범위로 보정한다. + * 숫자가 아니거나 NaN 이면 0, 범위를 벗어나면 ±COORDINATE_LIMIT 로 clamp. + * @param {number} value + * @return {number} + */ + static sanitizeCoordinate(value) { + const num = Number(value); + if (!Number.isFinite(num)) { + return 0; + } + return Entry.adjustValueWithMaxMin(num, -COORDINATE_LIMIT, COORDINATE_LIMIT); + } + /** * X coordinate setter * @param {number} x */ setX(x) { /** @type {number} */ - this.x_ = x; + this.x_ = Variable.sanitizeCoordinate(x); this.updateView(); } @@ -400,7 +423,7 @@ class Variable { */ setY(y) { /** @type {number} */ - this.y_ = y; + this.y_ = Variable.sanitizeCoordinate(y); this.updateView(); }