diff --git a/src/game/make.ts b/src/game/make.ts index 762be681..68bdd219 100644 --- a/src/game/make.ts +++ b/src/game/make.ts @@ -27,7 +27,7 @@ import { type QueryOpt, type Tag, } from "../types"; -import { type KEventController, KEventHandler, uid } from "../utils"; +import { KEventController, KEventHandler, uid } from "../utils"; export function make(comps: CompList = []): GameObj { const compStates = new Map(); @@ -596,15 +596,26 @@ export function make(comps: CompList = []): GameObj { for (const e of evs) { obj[e] = (...args: [any]) => { - const ev = app[e]?.(...args); + let ev = app[e]?.(...args); inputEvents.push(ev); obj.onDestroy(() => ev.cancel()); obj.on("sceneEnter", () => { - ev.cancel(); + // All app events are already canceled by changing the scene + // not neccesary -> ev.cancel(); inputEvents.splice(inputEvents.indexOf(ev), 1); - app[e]?.(...args); + // create a new event with the same arguments + const newEv = app[e]?.(...args); + + // Replace the old event functions with the new ones + // old KEventController.cancel() => new KEventController.cancel() + KEventController.replace(ev, newEv); + // Save the reference to the new event so replace work every scene change + // There's always only 2 events connected, old and new + ev = newEv; + inputEvents.push(ev); }); + return ev; }; } diff --git a/src/utils/events.ts b/src/utils/events.ts index f36b1b63..fed2dcd4 100644 --- a/src/utils/events.ts +++ b/src/utils/events.ts @@ -35,7 +35,7 @@ export class KEventController { /** If the event is paused */ paused: boolean = false; /** Cancel the event */ - readonly cancel: () => void; + cancel: () => void; constructor(cancel: () => void) { this.cancel = cancel; @@ -51,6 +51,16 @@ export class KEventController { ev.paused = false; return ev; } + static replace(oldEv: KEventController, newEv: KEventController) { + oldEv.cancel = () => newEv.cancel(); + newEv.paused = oldEv.paused; + Object.defineProperty(oldEv, "paused", { + get: () => newEv.paused, + set: (p: boolean) => newEv.paused = p, + }); + + return oldEv; + } } export class KEvent {