From b3bbe7b39dd155403f96c6a4d361327bf8d8be52 Mon Sep 17 00:00:00 2001 From: cocos02 Date: Sun, 7 Jun 2026 20:38:24 +0800 Subject: [PATCH] fix: support multiple onTimeUpdate callbacks in VideoManager Previously onTimeCallback was a single nullable function pointer, so registerEvents()'s store.setVideoTime callback was overwritten by goToScene()'s checkQTE callback, causing videoTime to stay at 0. Changed to a Set to support multiple concurrent listeners. --- engine/core/VideoManager.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/engine/core/VideoManager.ts b/engine/core/VideoManager.ts index ccf212f..1812910 100644 --- a/engine/core/VideoManager.ts +++ b/engine/core/VideoManager.ts @@ -7,7 +7,7 @@ export class VideoManager { private activeSlot: 'A' | 'B' = 'A' private crossFadeMs = 300 private onEndCallback: VideoEndCallback | null = null - private onTimeCallback: TimeUpdateCallback | null = null + private onTimeCallbacks: Set = new Set() private currentSrc = '' private preloaded: Map<'A' | 'B', string> = new Map() private switching = false @@ -50,6 +50,7 @@ export class VideoManager { } this.elA = null this.elB = null + this.onTimeCallbacks.clear() } playInitial(src: string, preloadUrls: string[]) { @@ -141,7 +142,11 @@ export class VideoManager { } onTimeUpdate(cb: TimeUpdateCallback) { - this.onTimeCallback = cb + this.onTimeCallbacks.add(cb) + } + + offTimeUpdate(cb: TimeUpdateCallback) { + this.onTimeCallbacks.delete(cb) } private waitReady(el: HTMLVideoElement): Promise { @@ -160,7 +165,8 @@ export class VideoManager { private handleTimeUpdate = () => { if (this.active) { - this.onTimeCallback?.(this.active.currentTime) + const t = this.active.currentTime + this.onTimeCallbacks.forEach((cb) => cb(t)) } } }