From a34d78733615a74df74d41a5ebde2511de1d5b96 Mon Sep 17 00:00:00 2001 From: cocos02 Date: Sun, 7 Jun 2026 21:16:31 +0800 Subject: [PATCH] fix: register checkQTE once in constructor instead of per-scene MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously goToScene added a new checkQTE closure to onTimeUpdate on every scene transition, accumulating stale closures that re-triggered old QTE. Now checkQTE is an arrow property registered once in the constructor, reading this.currentScene directly — no closure, no stale references, no guard condition needed. --- engine/core/Engine.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/engine/core/Engine.ts b/engine/core/Engine.ts index 2223845..f0bff83 100644 --- a/engine/core/Engine.ts +++ b/engine/core/Engine.ts @@ -27,6 +27,8 @@ export class Engine { this.stateManager = new StateManager() this.choiceSystem = new ChoiceSystem() this.qteSystem = new QTESystem() + + this.videoManager.onTimeUpdate(this.checkQTE) } on(event: EngineEvent, handler: EventHandler) { @@ -70,10 +72,6 @@ export class Engine { } }) - this.videoManager.onTimeUpdate((time) => { - this.checkQTE(scene, time) - }) - if (this.isInitialScene) { this.isInitialScene = false this.videoManager.playInitial(scene.videoUrl, preloadUrls) @@ -84,9 +82,9 @@ export class Engine { this.emit('sceneChange', scene) } - private checkQTE(scene: SceneNode, time: number) { - if (this.currentScene?.id !== scene.id) return - if (!scene.qte || this.qteTriggered) return + private checkQTE = (time: number) => { + const scene = this.currentScene + if (!scene?.qte || this.qteTriggered) return if (time >= scene.qte.triggerTime) { this.qteTriggered = true const qte = scene.qte