fix(studio): дверь поворачивается вокруг петли (как настоящая), а не отскакивает
Было: дверь сдвигалась вбок. Стало: вращение вокруг левой грани (петли) на 90°. Центр двери пересчитывается по дуге вокруг hinge (p0.z - halfW), плюс self.rotate(angle) — дверь распахивается, как в реальности. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
4906c82792
commit
32cbb7bbe9
@ -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 });` }],
|
||||
},
|
||||
];
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user