update: preparation for event-driven animation

This commit is contained in:
alikia2x (寒寒) 2024-11-17 20:32:46 +08:00
parent 93855a3f61
commit a4ddd83f91
Signed by: alikia2x
GPG Key ID: 56209E0CCD8420C6
3 changed files with 29 additions and 10 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "aquavox", "name": "aquavox",
"version": "2.5.1", "version": "2.9.1",
"private": false, "private": false,
"module": "index.ts", "module": "index.ts",
"type": "module", "type": "module",

View File

@ -5,7 +5,7 @@
import type { Spring } from '@core/graphics/spring/spring'; import type { Spring } from '@core/graphics/spring/spring';
const viewportWidth = document.documentElement.clientWidth; const viewportWidth = document.documentElement.clientWidth;
const blurRatio = viewportWidth > 640 ? 1 : 1.4; const blurRatio = viewportWidth > 640 ? 1.2 : 1.4;
export let line: ScriptItem; export let line: ScriptItem;
export let index: number; export let index: number;
@ -21,7 +21,7 @@
let time = 0; let time = 0;
let positionX: number = 0; let positionX: number = 0;
let positionY: number = 0; let positionY: number = 0;
let opacity = 1; let blur = 0;
let stopped = false; let stopped = false;
let lastPosX: number | undefined = undefined; let lastPosX: number | undefined = undefined;
let lastPosY: number | undefined = undefined; let lastPosY: number | undefined = undefined;
@ -75,11 +75,6 @@
positionY = pos; positionY = pos;
}; };
export const setCurrent = (isCurrent: boolean) => {
isCurrentLyric = isCurrent;
opacity = isCurrent ? 1 : 0.36;
};
$: { $: {
if (ref && ref.style) { if (ref && ref.style) {
let blurRadius = 0; let blurRadius = 0;
@ -92,7 +87,7 @@
blurRadius = Math.min(offset * blurRatio, 16); blurRadius = Math.min(offset * blurRatio, 16);
} }
if (scrolling) blurRadius = 0; if (scrolling) blurRadius = 0;
ref.style.filter = `blur(${blurRadius}px)`; blur = blurRadius
} }
} }
@ -198,7 +193,7 @@
clickMask.style.backgroundColor = 'rgba(255,255,255,.3)'; clickMask.style.backgroundColor = 'rgba(255,255,255,.3)';
}} }}
style="transform: translate3d({positionX}px, {positionY}px, 0); style="transform: translate3d({positionX}px, {positionY}px, 0);
transform-origin: center left; font-family: LyricFont, sans-serif;" transform-origin: center left; font-family: LyricFont, sans-serif; filter: blur({blur}px)"
> >
<span <span
bind:this={clickMask} bind:this={clickMask}

View File

@ -3,6 +3,7 @@
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import LyricLine from './lyricLine.svelte'; import LyricLine from './lyricLine.svelte';
import createLyricsSearcher from '@core/lyrics/lyricSearcher'; import createLyricsSearcher from '@core/lyrics/lyricSearcher';
import { createRule } from 'eslint-plugin-svelte/lib/utils';
// constants // constants
const viewportHeight = document.documentElement.clientHeight; const viewportHeight = document.documentElement.clientHeight;
@ -170,6 +171,29 @@
scrollEventAdded = true; scrollEventAdded = true;
}); });
let lastTriggered = $state(0);
let lastEventLyricIndex = $state(0);
let lastEventProgress = $state(0);
$effect(() => {
const progressDelta = progress - lastEventProgress;
const deltaInRange = 0 <= progressDelta && progressDelta <= 0.15;
const deltaTooBig = progressDelta > 0.15;
const deltaIsNegative = progressDelta < 0;
const lyricChanged = currentLyricIndex !== lastEventLyricIndex;
const lyricIndexDeltaTooBig = Math.abs(currentLyricIndex - lastEventLyricIndex) > 1;
if (lyricChanged && !lyricIndexDeltaTooBig && deltaInRange) {
console.log("Event: regular move");
}
else if (deltaTooBig && lyricChanged) {
console.log("Event: seek forward");
}
else if (deltaIsNegative && lyricChanged) {
console.log("Event: seek backward");
}
lastEventLyricIndex = currentLyricIndex;
lastEventProgress = progress;
});
$effect(() => { $effect(() => {
if (!lyricsContainer || lyricComponents.length < 0) return; if (!lyricsContainer || lyricComponents.length < 0) return;
if (progress >= nextUpdate - 0.5 && !scrolling) { if (progress >= nextUpdate - 0.5 && !scrolling) {