From b70d0f3347564f5d4a3ed57138d26a48569bbaee Mon Sep 17 00:00:00 2001 From: Pihkaal Date: Sat, 13 Dec 2025 19:52:31 +0100 Subject: [PATCH] feat: improve screen context system --- src/nds.ts | 6 ++---- src/screen-manager.ts | 16 ++++++++++------ src/screen.ts | 3 ++- src/utils/buttonNavigation.ts | 1 - 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/nds.ts b/src/nds.ts index ce2c606..bcec543 100644 --- a/src/nds.ts +++ b/src/nds.ts @@ -1,7 +1,6 @@ import * as THREE from "three"; import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js"; import { ScreenManager } from "./screen-manager"; -import { HomeScreen } from "./screens/home"; const SCREEN_SOURCE_TEX_SIZE = 1024; const TOP_SCREEN_SOURCE_TEX_HEIGHT = SCREEN_SOURCE_TEX_SIZE / 404; @@ -37,11 +36,10 @@ export class NDS extends THREE.Object3D { public constructor(camera: THREE.Camera, domElement: HTMLCanvasElement) { super(); - // Initialize screen manager - this.screenManager = new ScreenManager(new HomeScreen()); + this.screenManager = new ScreenManager(); - const loader = new GLTFLoader(); // load model + const loader = new GLTFLoader(); loader.load("/nintendo-ds/scene.gltf", ({ scene: model }) => { model.scale.set(50, 50, 50); diff --git a/src/screen-manager.ts b/src/screen-manager.ts index 02fa253..fd98944 100644 --- a/src/screen-manager.ts +++ b/src/screen-manager.ts @@ -1,16 +1,20 @@ -import type { Screen, ScreenContext } from "./screen"; +import type { Screen } from "./screen"; +import { HomeScreen } from "./screens/home"; export class ScreenManager { private currentScreen: Screen; - private context: ScreenContext; - constructor(initialScreen: Screen) { - this.currentScreen = initialScreen; - this.context = { + constructor() { + const context = { navigate: (screen: Screen) => { + if (this.currentScreen.destroy) { + this.currentScreen.destroy(); + } this.currentScreen = screen; }, }; + + this.currentScreen = new HomeScreen(context); } renderTop(ctx: CanvasRenderingContext2D) { @@ -29,7 +33,7 @@ export class ScreenManager { handleTouch(x: number, y: number) { if (this.currentScreen.handleTouch) { - this.currentScreen.handleTouch(x, y, this.context); + this.currentScreen.handleTouch(x, y); } } } diff --git a/src/screen.ts b/src/screen.ts index 3cb6b9e..d3c5ce3 100644 --- a/src/screen.ts +++ b/src/screen.ts @@ -5,5 +5,6 @@ export interface ScreenContext { export interface Screen { renderTop(ctx: CanvasRenderingContext2D): void; renderBottom(ctx: CanvasRenderingContext2D): void; - handleTouch?(x: number, y: number, context: ScreenContext): void; + handleTouch?(x: number, y: number): void; + destroy?(): void; } diff --git a/src/utils/buttonNavigation.ts b/src/utils/buttonNavigation.ts index ae23e0c..9032715 100644 --- a/src/utils/buttonNavigation.ts +++ b/src/utils/buttonNavigation.ts @@ -27,7 +27,6 @@ export class ButtonNavigation { this.navigation = config.navigation; this.onButtonClick = config.onButtonClick; - // TODO: this should be handled by the nds itself i think, and dispatched this.keydownHandler = this.handleKeyPress.bind(this); window.addEventListener("keydown", this.keydownHandler); }