Cartello d'apertura «Manzolo (Poca) Art Presents»; il primo fotogramma non congela più il gioco

Il cartello dura 5 secondi prima del titolo e si salta con un clic o un tasto; il test nel browser
lo controlla. Il primo timestamp di requestAnimationFrame può precedere quello del caricamento:
il dt negativo dava alla musica un volume sotto zero, il browser lanciava un errore e il ciclo
dei fotogrammi si fermava (una volta su tre nella prova in orizzontale).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UdeKd62opy9PKgpQXtVctF
This commit is contained in:
2026-10-23 13:26:43 +02:00
co-authored by Claude Opus 5.5
parent 33e2598718
commit 5a07b5effc
4 changed files with 49 additions and 5 deletions
+19 -3
View File
@@ -187,9 +187,11 @@ function updateUi() {
let last = performance.now();
function frame(now) {
const dt = Math.min(0.1, (now - last) / 1000);
// Il primo timestamp di requestAnimationFrame può precedere `last`: un dt negativo darebbe alla musica un volume
// sotto zero, il browser lancerebbe un errore e il ciclo dei fotogrammi si fermerebbe (gioco congelato).
const dt = Math.max(0, Math.min(0.1, (now - last) / 1000));
last = now;
const screen = !$('title').hidden ? 'title' : !$('intro').hidden ? 'intro' : !$('ending').hidden ? 'ending' : 'game';
const screen = !$('title').hidden || !$('splash').hidden ? 'title' : !$('intro').hidden ? 'intro' : !$('ending').hidden ? 'ending' : 'game';
music.update(trackFor(story, { screen, scene: game?.state.scene }), dt);
if (game) {
if (running) game.update(dt);
@@ -204,8 +206,22 @@ $('continue').addEventListener('click', () => start(readSave(storage)));
$('restart').addEventListener('click', () => { if (storage) clearSave(storage); start(null); });
// Dietro il titolo si vede già la piazza.
// --- Cartello d'apertura «Manzolo (Poca) Art Presents»: 5 secondi (un clic o un tasto lo salta), poi il titolo.
function showSplash() {
let done = false;
const end = () => {
if (done) return;
done = true;
$('splash').hidden = true;
showTitle();
};
setTimeout(end, 5000);
$('splash').addEventListener('click', end);
addEventListener('keydown', end, { once: true });
}
game = new Game(story);
command = new Command(game);
showTitle();
showSplash();
requestAnimationFrame(frame);
loadAssets(story).then(ok => { if (ok.includes(false)) console.warn('Alcune immagini non sono state caricate.'); });