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 });` }], }, ];