Skip to content

Commit a4b9507

Browse files
v30.10: cámara online sin latigazos y portada sin Exportar/Importar
El tirón al caminar («salto en el tiempo hacia atrás») era la cámara de v30.7: el lerp de posición solo se anulaba MIENTRAS el ratón orbitaba, así que tocar/soltar el ratón andando conmutaba entre 0 y ~0.7 tiles de retraso — latigazo de hasta 72 px por frame, medido con un arnés que proyecta al propio jugador en pantalla frame a frame. Online la traslación de la cámara es ahora rígida SIEMPRE (estilo Roblox; la física del jugador ya es continua) y el suavizado queda para el yaw y para el modo por turnos. Tras el arreglo el máximo baja a 3.3 px, idéntico a andar sin tocar el ratón. Fuera los botones Exportar/Importar del expediente (petición del usuario); Profiles.exportar/importar quedan como API interna cubierta por los tests del PR #67. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 4fadd75 commit a4b9507

4 files changed

Lines changed: 56 additions & 68 deletions

File tree

game/index.html

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1">
66
<title>BACKROOMS MMO</title>
7-
<link rel="stylesheet" href="css/style.css?v=291">
8-
<link rel="stylesheet" href="css/title-interface.css?v=291">
7+
<link rel="stylesheet" href="css/style.css?v=292">
8+
<link rel="stylesheet" href="css/title-interface.css?v=292">
99
</head>
1010
<body>
1111
<div id="app">
@@ -32,9 +32,6 @@ <h1 class="glitch">BACKROOMS MMO</h1>
3232
<div class="profile-row">
3333
<button id="btn-codex" class="btn-small"><span data-icon="libro" data-icon-size="13"></span> Códice del Errante</button>
3434
<button id="btn-changelog" class="btn-small"><span data-icon="reloj" data-icon-size="13"></span> Changelog</button>
35-
<button id="btn-profile-export" class="btn-small">Exportar</button>
36-
<button id="btn-profile-import" class="btn-small">Importar</button>
37-
<input id="profile-import-file" type="file" accept=".json,application/json" style="display:none">
3835
<button id="btn-profile-del" class="btn-small">Borrar</button>
3936
</div>
4037
</div>
@@ -394,44 +391,44 @@ <h3>Tu recorrido</h3>
394391

395392
<!-- ?v= rompe la caché del edge (Cloudflare cachea .js/.css por defecto aunque
396393
el origen no lo pida): SUBIR el número en cada versión, junto con VERSION_JUEGO -->
397-
<script src="js/data.js?v=291"></script>
398-
<script src="js/engine/rng.js?v=291"></script>
399-
<script src="js/mapgen/mapgen.js?v=291"></script>
400-
<script src="js/engine/tiles.js?v=291"></script>
401-
<script src="js/engine/sprites.js?v=291"></script>
402-
<script src="js/engine/effects.js?v=291"></script>
403-
<script src="js/audio-manifest.js?v=291"></script>
404-
<script src="js/assets-manifest.js?v=291"></script>
405-
<script src="js/engine/sfx.js?v=291"></script>
406-
<script src="js/engine/fov.js?v=291"></script>
407-
<script src="js/systems/entities.js?v=291"></script>
408-
<script src="js/systems/rules.js?v=291"></script>
409-
<script src="js/engine/render.js?v=291"></script>
410-
<script src="js/lib/three.min.js?v=291"></script>
411-
<script src="js/lib/shaders/CopyShader.js?v=291"></script>
412-
<script src="js/lib/shaders/LuminosityHighPassShader.js?v=291"></script>
413-
<script src="js/lib/shaders/GammaCorrectionShader.js?v=291"></script>
414-
<script src="js/lib/postprocessing/EffectComposer.js?v=291"></script>
415-
<script src="js/lib/postprocessing/RenderPass.js?v=291"></script>
416-
<script src="js/lib/postprocessing/ShaderPass.js?v=291"></script>
417-
<script src="js/lib/postprocessing/UnrealBloomPass.js?v=291"></script>
418-
<script src="js/engine/atmos3d.js?v=291"></script>
419-
<script src="js/engine/render3d.js?v=291"></script>
420-
<script src="js/systems/game.js?v=291"></script>
421-
<script src="js/ui/icons.js?v=291"></script>
422-
<script src="js/ui/controllers.js?v=291"></script>
423-
<script src="js/ui/ui.js?v=291"></script>
424-
<script src="js/ui/title-interface.js?v=291"></script>
425-
<script src="js/ui/changelog.js?v=291"></script>
426-
<script src="js/ui/minimap.js?v=291"></script>
427-
<script src="js/sim/fisica.js?v=291"></script>
394+
<script src="js/data.js?v=292"></script>
395+
<script src="js/engine/rng.js?v=292"></script>
396+
<script src="js/mapgen/mapgen.js?v=292"></script>
397+
<script src="js/engine/tiles.js?v=292"></script>
398+
<script src="js/engine/sprites.js?v=292"></script>
399+
<script src="js/engine/effects.js?v=292"></script>
400+
<script src="js/audio-manifest.js?v=292"></script>
401+
<script src="js/assets-manifest.js?v=292"></script>
402+
<script src="js/engine/sfx.js?v=292"></script>
403+
<script src="js/engine/fov.js?v=292"></script>
404+
<script src="js/systems/entities.js?v=292"></script>
405+
<script src="js/systems/rules.js?v=292"></script>
406+
<script src="js/engine/render.js?v=292"></script>
407+
<script src="js/lib/three.min.js?v=292"></script>
408+
<script src="js/lib/shaders/CopyShader.js?v=292"></script>
409+
<script src="js/lib/shaders/LuminosityHighPassShader.js?v=292"></script>
410+
<script src="js/lib/shaders/GammaCorrectionShader.js?v=292"></script>
411+
<script src="js/lib/postprocessing/EffectComposer.js?v=292"></script>
412+
<script src="js/lib/postprocessing/RenderPass.js?v=292"></script>
413+
<script src="js/lib/postprocessing/ShaderPass.js?v=292"></script>
414+
<script src="js/lib/postprocessing/UnrealBloomPass.js?v=292"></script>
415+
<script src="js/engine/atmos3d.js?v=292"></script>
416+
<script src="js/engine/render3d.js?v=292"></script>
417+
<script src="js/systems/game.js?v=292"></script>
418+
<script src="js/ui/icons.js?v=292"></script>
419+
<script src="js/ui/controllers.js?v=292"></script>
420+
<script src="js/ui/ui.js?v=292"></script>
421+
<script src="js/ui/title-interface.js?v=292"></script>
422+
<script src="js/ui/changelog.js?v=292"></script>
423+
<script src="js/ui/minimap.js?v=292"></script>
424+
<script src="js/sim/fisica.js?v=292"></script>
428425
<!-- reglas del mundo COMPARTIDAS con el servidor (duales): IA + Sala; el modo
429426
offline las ejecuta en la pestaña vía el servidor local de net/local.js -->
430-
<script src="js/sim/entidades.js?v=291"></script>
431-
<script src="js/sim/sala.js?v=291"></script>
432-
<script src="js/net/local.js?v=291"></script>
433-
<script src="js/net/otros.js?v=291"></script>
434-
<script src="js/net/cliente.js?v=291"></script>
435-
<script src="js/main.js?v=291"></script>
427+
<script src="js/sim/entidades.js?v=292"></script>
428+
<script src="js/sim/sala.js?v=292"></script>
429+
<script src="js/net/local.js?v=292"></script>
430+
<script src="js/net/otros.js?v=292"></script>
431+
<script src="js/net/cliente.js?v=292"></script>
432+
<script src="js/main.js?v=292"></script>
436433
</body>
437434
</html>

game/js/engine/render3d.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1891,13 +1891,20 @@
18911891
target.y = Math.min(target.y, TP.alto + bob);
18921892
}
18931893
}
1894-
camera.position.lerp(target, orbitando ? 1 : corrDt(TP.suavidad));
1894+
// v30.10: online la TRASLACIÓN es rígida SIEMPRE (estilo Roblox) — la
1895+
// física del jugador ya es continua y no necesita amortiguador. El lerp
1896+
// de posición solo-al-no-orbitar conmutaba entre 0 y ~0.7 tiles de
1897+
// retraso cada vez que tocabas/soltabas el ratón andando: latigazo de
1898+
// ~70 px por frame (medido). El suavizado queda para el yaw (continuo)
1899+
// y para el modo offline por turnos, cuyos pasos discretos sí lo piden.
1900+
if (world.online) camera.position.copy(target);
1901+
else camera.position.lerp(target, corrDt(TP.suavidad));
18951902
// mira hacia delante (según la órbita actual: giro suave sin bandazos)
18961903
frame._look = frame._look || new THREE.Vector3(px, TP.lookY, pz);
1897-
frame._look.lerp(
1898-
new THREE.Vector3(px - Math.sin(camYaw) * TP.lookAhead, TP.lookY, pz - Math.cos(camYaw) * TP.lookAhead),
1899-
orbitando ? 1 : corrDt(0.12)
1900-
);
1904+
const lookObjetivo = new THREE.Vector3(
1905+
px - Math.sin(camYaw) * TP.lookAhead, TP.lookY, pz - Math.cos(camYaw) * TP.lookAhead);
1906+
if (world.online) frame._look.copy(lookObjetivo);
1907+
else frame._look.lerp(lookObjetivo, corrDt(0.12));
19011908
camera.lookAt(frame._look);
19021909
// si la cámara queda pegada (muro a la espalda), el personaje se desvanece
19031910
// en vez de tapar media pantalla

game/js/main.js

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Arranque: input, bucle de animación y pantalla de título.
22
(function () {
33
// versión visible del juego (Ajustes); súbela con cada tanda de cambios
4-
window.VERSION_JUEGO = 'v30.9';
4+
window.VERSION_JUEGO = 'v30.10';
55
const world = Game.world;
66
world.data = window.GAME_DATA;
77

@@ -1920,26 +1920,6 @@
19201920
const n = P.activeName();
19211921
if (n && confirm(`¿Borrar el perfil «${n}» y todo su códice?`)) { P.remove(n); refreshTitle(); }
19221922
};
1923-
$id('btn-profile-export').onclick = () => {
1924-
const json = P.exportar();
1925-
if (!json) return;
1926-
const a = document.createElement('a');
1927-
a.href = 'data:application/json;charset=utf-8,' + encodeURIComponent(json);
1928-
a.download = `backrooms-perfil-${P.activeName()}.json`;
1929-
a.click();
1930-
};
1931-
$id('btn-profile-import').onclick = () => $id('profile-import-file').click();
1932-
$id('profile-import-file').onchange = (ev) => {
1933-
const f = ev.target.files[0];
1934-
if (!f) return;
1935-
const r = new FileReader();
1936-
r.onload = () => {
1937-
if (P.importar(r.result)) refreshTitle();
1938-
else alert('Ese archivo no parece un perfil válido.');
1939-
};
1940-
r.readAsText(f);
1941-
ev.target.value = '';
1942-
};
19431923
$id('btn-codex').onclick = () => world.ui.toggleCodex(true);
19441924
$id('btn-changelog').onclick = () => {
19451925
if (window.Changelog) Changelog.marcarVisto();

game/js/ui/changelog.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
// tanda de cambios (junto con VERSION_JUEGO en main.js).
55
(function () {
66
const CHANGELOG = [
7+
{ v: 'v30.10', cambios: [
8+
'Arreglado el tirón al caminar: al mover o soltar el ratón la cámara daba un latigazo (parecía retroceder en el tiempo). Ahora la cámara va clavada a tu personaje, toques el ratón o no.',
9+
'La portada pierde los botones Exportar/Importar del expediente.',
10+
] },
711
{ v: 'v30.9', cambios: [
812
'Las salas concurridas van mucho más fluidas: los demás errantes se mueven suaves aunque haya decenas en pantalla, y ya no dan un salto brusco al reanudar la marcha tras estar quietos.',
913
'En una multitud, los nombres y bocadillos de chat priorizan a los más cercanos en vez de apilarse ilegibles.',

0 commit comments

Comments
 (0)