@@ -15,6 +15,13 @@ export class Input extends Part {
1515 currentMousePos : { x : number , y : number } = { x : 0 , y : 0 } ;
1616 lastClickPos : { x : number , y : number } | null = null ;
1717 initialized : boolean ; // Have the event listeners been initialized?
18+ private mousemoveDef ?: ( event : MouseEvent ) => void ; // Store the mousemove event handler (definite)
19+ private clickDef ?: ( event : MouseEvent ) => void ; // Store the click event handler (definite)
20+ private mousedownDef ?: ( event : MouseEvent ) => void ;
21+ private mouseupDef ?: ( event : MouseEvent ) => void ;
22+ private keydownDef ?: ( event : KeyboardEvent ) => void ;
23+ private keyupDef ?: ( event : KeyboardEvent ) => void ;
24+
1825 constructor ( {
1926 key,
2027 keyup,
@@ -36,7 +43,7 @@ export class Input extends Part {
3643 this . type = "Input" ;
3744 }
3845 initialize ( canvas : HTMLCanvasElement ) {
39- canvas . addEventListener ( "mousemove" , ( event ) => {
46+ this . mousemoveDef = ( event : MouseEvent ) => {
4047 const game = this . top as Game ;
4148 if ( ! game || ! game . currentScene || game . currentScene !== this . parent || ! game . currentScene ?. activeCamera ) {
4249 return ;
@@ -66,9 +73,8 @@ export class Input extends Part {
6673
6774
6875 this . currentMousePos = { x : finalX , y : finalY } ;
69- } ) ;
70-
71- canvas . addEventListener ( "click" , ( event ) => {
76+ }
77+ this . clickDef = ( event ) => {
7278 const game = this . top as Game ;
7379 if ( ! game || ! game . currentScene || game . currentScene !== this . parent || ! game . currentScene ?. activeCamera ) {
7480 return ;
@@ -98,33 +104,51 @@ export class Input extends Part {
98104
99105
100106 this . lastClickPos = { x : finalX , y : finalY } ;
101- } ) ;
102- canvas . addEventListener ( "mousedown" , ( event ) => {
107+ }
108+ this . mousedownDef = ( event ) => {
103109 const game = this . top as Game ;
104110 if ( game . hovering ) {
105111 game . hovering . onmousedown ( event ) ;
106112 }
107- } ) ;
108- canvas . addEventListener ( "mouseup" , ( event ) => {
113+ }
114+ this . mouseupDef = ( event ) => {
109115 const game = this . top as Game ;
110116 if ( game . hovering ) {
111117 game . hovering . onmouseup ( event ) ;
112118 }
113- } ) ;
114-
115- document . addEventListener ( "keydown" , ( event ) => {
119+ }
120+ this . keydownDef = ( event ) => {
116121 this . downkeys . add ( event . key ) ;
117- } ) ;
118- document . addEventListener ( "keyup" , ( event ) => {
122+ }
123+ this . keyupDef = ( event ) => {
119124 this . downkeys . delete ( event . key ) ;
120125 if ( typeof this . keyup == "function" ) {
121126 this . keyup ( event ) ;
122127 }
123- } ) ;
128+ }
129+ canvas . addEventListener ( "mousemove" , this . mousemoveDef ) ;
130+ canvas . addEventListener ( "click" , this . clickDef ) ;
131+ canvas . addEventListener ( "mousedown" , this . mousedownDef ) ;
132+ canvas . addEventListener ( "mouseup" , this . mouseupDef ) ;
133+
134+ document . addEventListener ( "keydown" , this . keydownDef ) ;
135+ document . addEventListener ( "keyup" , this . keyupDef ) ;
124136 this . initialized = true ; // Mark as initialized after setting up listeners
125137 }
126138
127-
139+ destroy ( ) : void {
140+ super . destroy ( ) ;
141+ const canvas = this . top ?. canvas ;
142+ if ( canvas ) {
143+ // Remove all event listeners
144+ canvas . removeEventListener ( "mousemove" , this . mousemoveDef ! ) ;
145+ canvas . removeEventListener ( "click" , this . clickDef ! ) ;
146+ canvas . removeEventListener ( "mousedown" , this . mousedownDef ! ) ;
147+ canvas . removeEventListener ( "mouseup" , this . mouseupDef ! ) ;
148+ document . removeEventListener ( "keydown" , this . keydownDef ! ) ;
149+ document . removeEventListener ( "keyup" , this . keyupDef ! ) ;
150+ }
151+ }
128152 act ( delta : number ) {
129153 super . act ( delta ) ;
130154 if ( ! this . initialized ) {
0 commit comments