2021-04-23 13:29:23 +02:00
|
|
|
const Events = Phaser.Core.Events;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A specialization of the main Phaser Game scene.
|
|
|
|
* It comes with an optimization to skip rendering.
|
|
|
|
*
|
|
|
|
* Beware, the "step" function might vary in future versions of Phaser.
|
|
|
|
*/
|
|
|
|
export class Game extends Phaser.Game {
|
|
|
|
public step(time: number, delta: number)
|
|
|
|
{
|
|
|
|
// @ts-ignore
|
|
|
|
if (this.pendingDestroy)
|
|
|
|
{
|
|
|
|
// @ts-ignore
|
|
|
|
return this.runDestroy();
|
|
|
|
}
|
|
|
|
|
|
|
|
const eventEmitter = this.events;
|
|
|
|
|
|
|
|
// Global Managers like Input and Sound update in the prestep
|
|
|
|
|
|
|
|
eventEmitter.emit(Events.PRE_STEP, time, delta);
|
|
|
|
|
|
|
|
// This is mostly meant for user-land code and plugins
|
|
|
|
|
|
|
|
eventEmitter.emit(Events.STEP, time, delta);
|
|
|
|
|
|
|
|
// Update the Scene Manager and all active Scenes
|
|
|
|
|
|
|
|
this.scene.update(time, delta);
|
|
|
|
|
|
|
|
// Our final event before rendering starts
|
|
|
|
|
|
|
|
eventEmitter.emit(Events.POST_STEP, time, delta);
|
|
|
|
|
|
|
|
// This "if" is the changed introduced by the new "Game" class to avoid rendering unnecessarily.
|
|
|
|
if (this.isDirty()) {
|
|
|
|
const renderer = this.renderer;
|
|
|
|
|
|
|
|
// Run the Pre-render (clearing the canvas, setting background colors, etc)
|
|
|
|
|
|
|
|
renderer.preRender();
|
|
|
|
|
|
|
|
eventEmitter.emit(Events.PRE_RENDER, renderer, time, delta);
|
|
|
|
|
|
|
|
// The main render loop. Iterates all Scenes and all Cameras in those scenes, rendering to the renderer instance.
|
|
|
|
|
|
|
|
this.scene.render(renderer);
|
|
|
|
|
|
|
|
// The Post-Render call. Tidies up loose end, takes snapshots, etc.
|
|
|
|
|
|
|
|
renderer.postRender();
|
|
|
|
|
|
|
|
// The final event before the step repeats. Your last chance to do anything to the canvas before it all starts again.
|
|
|
|
|
|
|
|
eventEmitter.emit(Events.POST_RENDER, renderer, time, delta);
|
2021-04-28 10:06:40 +02:00
|
|
|
} else {
|
|
|
|
// @ts-ignore
|
|
|
|
this.scene.isProcessing = false;
|
2021-04-23 13:29:23 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private isDirty(): boolean {
|
|
|
|
// Loop through the scenes in forward order
|
|
|
|
for (let i = 0; i < this.scene.scenes.length; i++)
|
|
|
|
{
|
|
|
|
const scene = this.scene.scenes[i];
|
|
|
|
const sys = scene.sys;
|
|
|
|
|
|
|
|
if (sys.settings.visible && sys.settings.status >= Phaser.Scenes.LOADING && sys.settings.status < Phaser.Scenes.SLEEPING)
|
|
|
|
{
|
|
|
|
// @ts-ignore
|
|
|
|
if(typeof scene.isDirty === 'function') {
|
|
|
|
// @ts-ignore
|
|
|
|
const isDirty = scene.isDirty() || scene.tweens.getAllTweens().length > 0;
|
|
|
|
if (isDirty) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|