@@ -2,7 +2,26 @@ import { WebGLRenderer } from "three"
22
33import defaultGameBuilder from "../builders/GameBuilder"
44import EventBus from "../eventbus/EventBus"
5- import FPSClock , { FPSClockSubscriberOptions } from "../utils/FPSClock"
5+ import {
6+ addCameraChangeListener ,
7+ removeCameraChangeListener ,
8+ } from "../eventbus/events/cameraChange"
9+ import {
10+ addCanvasResizeListener ,
11+ CanvasResizeEvent ,
12+ removeCanvasResizeListener ,
13+ } from "../eventbus/events/canvasResize"
14+ import {
15+ addFrameListener ,
16+ FrameEvent ,
17+ removeFrameListener ,
18+ } from "../eventbus/events/frame"
19+ import {
20+ addPlayPauseListener ,
21+ PlayPauseEvent ,
22+ removePlayPauseListener ,
23+ } from "../eventbus/events/playPause"
24+ import FPSClock from "../utils/FPSClock"
625import AnimationManager from "./AnimationManager"
726import CameraManager from "./CameraManager"
827import SceneManager from "./SceneManager"
@@ -21,18 +40,22 @@ export class GameManager {
2140 this . animate = this . animate . bind ( this )
2241 this . render = this . render . bind ( this )
2342 this . clock = clock
24- clock . subscribe ( this . animate )
2543
2644 AnimationManager . getInstance ( ) . playAnimationClips ( )
45+ addPlayPauseListener ( this . onPlayPause )
46+ addFrameListener ( this . animate )
47+ addCanvasResizeListener ( this . updateSize )
48+ addCameraChangeListener ( this . render )
2749 }
2850
29- animate ( { } : FPSClockSubscriberOptions ) {
51+ onPlayPause = ( { paused } : PlayPauseEvent ) => {
52+ paused ? this . clock . pause ( ) : this . clock . play ( )
53+ }
54+
55+ animate ( { } : FrameEvent ) {
3056 const delta = this . clock . getDelta ( )
31- CameraManager . getInstance ( ) . update ( )
3257
3358 if ( delta ) {
34- SceneManager . getInstance ( ) . update ( )
35- CameraManager . getInstance ( ) . update ( )
3659 AnimationManager . getInstance ( ) . updateAnimationClips ( delta )
3760 this . render ( )
3861 }
@@ -42,31 +65,26 @@ export class GameManager {
4265 return this . renderer . domElement
4366 }
4467
45- updateSize ( width : number = 640 , height : number = 480 ) {
46- CameraManager . getInstance ( ) . updateSize ( width , height )
47- this . renderer . setSize ( width , height )
48- this . render ( )
49- }
50-
51- render ( ) {
68+ private readonly render = ( ) => {
5269 const { scene } = SceneManager . getInstance ( )
5370 const { activeCamera } = CameraManager . getInstance ( )
5471 this . renderer . render ( scene , activeCamera )
5572 }
5673
57- static builder = defaultGameBuilder
58-
59- private destruct ( ) {
60- this . clock . unsubscribe ( this . animate )
61- this . clock . reset ( )
62- EventBus . reset ( )
74+ private readonly updateSize = ( {
75+ width = 640 ,
76+ height = 480 ,
77+ } : CanvasResizeEvent ) => {
78+ this . renderer . setSize ( width , height )
79+ this . render ( )
6380 }
6481
6582 /**
6683 * ========================================
6784 * Managers are singletons
6885 * ========================================
6986 */
87+ static builder = defaultGameBuilder
7088 private static instance ?: GameManager
7189 static getInstance ( ) {
7290 if ( ! GameManager . instance ) {
@@ -75,10 +93,24 @@ export class GameManager {
7593 return GameManager . instance
7694 }
7795 static init ( options : GameManagerOptions ) {
78- if ( GameManager . instance ) {
79- GameManager . instance . destruct ( )
80- }
8196 GameManager . instance = new GameManager ( options )
8297 return GameManager . instance
8398 }
99+ static destruct ( ) {
100+ // Destruct other managers
101+ SceneManager . destruct ( )
102+ CameraManager . destruct ( )
103+
104+ // Handle destruction of the existing game
105+ const { instance } = GameManager
106+ if ( instance ) {
107+ removePlayPauseListener ( instance . onPlayPause )
108+ removeFrameListener ( instance . animate )
109+ removeCanvasResizeListener ( instance . updateSize )
110+ removeCameraChangeListener ( instance . render )
111+ instance . clock . reset ( )
112+ EventBus . reset ( )
113+ GameManager . instance = undefined
114+ }
115+ }
84116}
0 commit comments