Konfetti-Flackern beheben: Burst nicht bei jedem Timer-Tick neu starten

This commit is contained in:
schmop 2026-05-31 22:35:28 +02:00
parent 35564602b2
commit 7896803100

View File

@ -9,7 +9,16 @@
const PALETTE = ['#ff5555', '#ffa84a', '#ffe34a', '#6cdc6c', '#4ab3ff', '#b06cff'];
// triggerKey kommt von $game.stageBumpKey — das Lesen abonniert (Svelte 5) den ganzen
// game-Store, daher feuert dieser Effekt bei JEDEM Timer-Tick (~60×/s). Ohne Wertvergleich
// würde er die Partikel jede Frame neu erzeugen und die fly-Animation endlos bei 0% neu
// starten → flackernde Punkte in der Mitte. Nur bei echtem Wechsel von triggerKey auslösen.
let prevTrigger = 0;
let hideTimer: ReturnType<typeof setTimeout> | null = null;
$effect(() => {
if (triggerKey === prevTrigger) return;
prevTrigger = triggerKey;
if (triggerKey === 0) return;
counter++;
const seed = counter;
@ -21,10 +30,16 @@
size: 8 + Math.random() * 8,
}));
active = true;
const timeout = setTimeout(() => {
if (hideTimer) clearTimeout(hideTimer);
hideTimer = setTimeout(() => {
active = false;
}, 700);
return () => clearTimeout(timeout);
});
// Timer beim Verlassen aufräumen (der Effekt oben kehrt meist früh zurück und gibt
// selbst keine Cleanup-Funktion mehr zurück).
$effect(() => () => {
if (hideTimer) clearTimeout(hideTimer);
});
</script>