Skip to content

Commit 1ea23dd

Browse files
committed
Step 2.13: Add the ability to change and load screen
1 parent 5761ec0 commit 1ea23dd

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

resources/scripts/engine/game.js

+55
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,61 @@ Engine.Game = class Game {
9292
this.playing = false;
9393
}
9494

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+
95150
// Defines global assets
96151
extendAssets(assets) {
97152
_.extend(this.assets, assets);

0 commit comments

Comments
 (0)