@@ -92,6 +92,61 @@ Engine.Game = class Game {
92
92
this . playing = false ;
93
93
}
94
94
95
+ changeScreen ( Screen , ...screenArgs ) {
96
+ // If there is a screen defined, dispose it first
97
+ if ( this . screen ) {
98
+ this . unloadScreen ( ) ;
99
+ this . screen . disposeEventListeners ( ) ;
100
+ }
101
+
102
+ this . screen = new Screen ( this , ...screenArgs ) ;
103
+
104
+ // Load screen assets
105
+ this . loadScreen ( ( ) => {
106
+ // Once assets are loaded, initialize event listeners
107
+ this . screen . initEventListeners ( ) ;
108
+ // The "initialize" method is exactly the same as the constructor, only it runs
109
+ // once assets are available and event listeners are registered
110
+ this . screen . initialize ( this , ...screenArgs ) ;
111
+ } ) ;
112
+ }
113
+
114
+ // Loads screen assets and invokes callback once loading is finished
115
+ loadScreen ( callback = _ . noop ) {
116
+ if ( ! this . screen . load ) return callback ( ) ;
117
+
118
+ this . screen . loading = true ;
119
+ // The number of assets to load
120
+ let loadsize = 0 ;
121
+ let onload ;
122
+
123
+ // This object can load assets
124
+ let assetsLoader = new Engine . AssetsLoader ( ( ) => {
125
+ loadsize ++ ;
126
+ return ( ) => onload ( ) ;
127
+ } ) ;
128
+
129
+ // The "load" method returns the assets loaded by the screen
130
+ let screenAssets = this . screen . load ( assetsLoader ) ;
131
+
132
+ // We use the "after" method because we want the following callback to be invoked
133
+ // only once all assets are loaded
134
+ onload = _ . after ( loadsize , ( ) => {
135
+ delete this . screen . loading ;
136
+ callback ( ) ;
137
+ } ) ;
138
+
139
+ // The returned assets will be available on screen's assets object
140
+ _ . extend ( this . screen . assets , screenAssets ) ;
141
+ }
142
+
143
+ // Disposes screen assets
144
+ unloadScreen ( ) {
145
+ if ( ! this . screen . unload ) return ;
146
+ let assetsNames = this . screen . unload ( ) ;
147
+ _ . omit ( this . assets , assetsNames ) ;
148
+ }
149
+
95
150
// Defines global assets
96
151
extendAssets ( assets ) {
97
152
_ . extend ( this . assets , assets ) ;
0 commit comments