From 32cbb7bbe9552d64246fad11b1f194e5e2425c3e Mon Sep 17 00:00:00 2001 From: min Date: Fri, 5 Jun 2026 08:51:36 +0300 Subject: [PATCH] =?UTF-8?q?fix(studio):=20=D0=B4=D0=B2=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B2=D0=BE=D1=80=D0=B0=D1=87=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=D0=BE=D0=BA=D1=80=D1=83=D0=B3?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=82=D0=BB=D0=B8=20(=D0=BA=D0=B0=D0=BA=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D0=BE=D1=8F=D1=89=D0=B0=D1=8F),=20?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=20=D0=BE=D1=82=D1=81=D0=BA=D0=B0=D0=BA?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Было: дверь сдвигалась вбок. Стало: вращение вокруг левой грани (петли) на 90°. Центр двери пересчитывается по дуге вокруг hinge (p0.z - halfW), плюс self.rotate(angle) — дверь распахивается, как в реальности. Co-Authored-By: Claude Opus 4.8 --- src/editor/engine/GameplayKits.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/editor/engine/GameplayKits.js b/src/editor/engine/GameplayKits.js index 738a193..c04308b 100644 --- a/src/editor/engine/GameplayKits.js +++ b/src/editor/engine/GameplayKits.js @@ -267,14 +267,24 @@ game.self.onTouch(() => { icon: 'door', category: 'world', prims: [{ type: 'cube', x: 0, y: 2, z: 0, sx: 1, sy: 4, sz: 3, color: '#8a5a3c', material: 'matte', name: 'Дверь' }], scripts: [{ attachTo: 'on-target', code: -`// Дверь по E: уезжает В СТОРОНУ (вбок) и возвращается. Ширина двери sx=1, -// сдвигаем на 3 единицы вбок — проход открывается. +`// Дверь по E: ПОВОРАЧИВАЕТСЯ вокруг петли (левой грани), как настоящая дверь. +// Толщина двери по X (sx=1) → полуширина 0.5. Петля у грани z = центр - halfZ. let open = false; -const p0 = game.self.position; // закрытое положение +const p0 = game.self.position; +const halfW = 1.5; // половина ширины двери по Z (sz=3 → 1.5) +// Петля — у левого края двери (по Z): hinge = p0.z - halfW. +const hingeX = p0.x; +const hingeZ = p0.z - halfW; +function placeDoor(angle) { + // Центр двери на расстоянии halfW от петли, повёрнут на angle вокруг петли. + const cx = hingeX + Math.sin(angle) * halfW; + const cz = hingeZ + Math.cos(angle) * halfW; + game.self.move(cx, p0.y, cz); + game.self.rotate(angle); +} game.self.onInteract(() => { open = !open; - if (open) game.self.move(p0.x + 3, p0.y, p0.z); // уехала вбок (открыта) - else game.self.move(p0.x, p0.y, p0.z); // вернулась (закрыта) + placeDoor(open ? Math.PI / 2 : 0); // 90° открыта / 0° закрыта }, { text: 'Открыть / закрыть', key: 'e', distance: 5 });` }], }, ];