Cambiare Scene
Una volta che il tuo gioco raggiunge una certa dimensione, vorrai iniziare a cambiare tra le scene. Questo potrebbe significare passare da un’introduzione o menu al gioco o da un livello a un altro.
La funzione più importante da conoscere qui è engine.loadMainScene(),
che sostituirà la scena attuale con un filename .bin o URL che gli passi per il caricamento.
Ecco un esempio di un componente che passa a un’altra scena dopo un certo periodo di tempo:
import {Component, Property} from '@wonderlandengine/api';
export class LoadAfterDelay extends Component {
static TypeName = 'load-after-delay';
static Properties = {
sceneFile: Property.string("AnotherScene.bin"),
delaySeconds: Property.float(10),
};
start() {
setTimeout(() => {
this.engine.loadMainScene({ file: this.sceneFile });
}, this.delaySeconds*1000);
}
}); Precaricamento delle Scene
Mentre la scena continuerà a funzionare mentre la prossima si sta caricando, ci sarà ancora un ritardo fra il momento in cui il caricamento è stato iniziato e quando la scena successiva appare all’utente.
Per minimizzare questo ritardo, puoi inserire i seguenti tag HTML all’interno del <head> del tuo
index.html:
{/* non necessario <link rel="preload" href="First.bin" ... /> */}
<link rel="preload" href="Next.bin" as="fetch" crossorigin async />
<link rel="preload" href="Last.bin" as="fetch" crossorigin async /> Puoi anche aggiungere questi tag dinamicamente tramite JavaScript.
Avvertenze
Caricare una scena non rimuoverà automaticamente i listener degli eventi. Questo include
i listener degli eventi sugli elementi DOM e i callback aggiunti agli emitter.
Sei responsabile per la rimozione dei listener degli eventi. È una buona pratica
farlo in onDeactivate del tuo componente.
onDeactivate è chiamato prima di onDestroy. Entrambi sono chiamati quando una scena
viene scaricata.
keyUpHandler = e => { /* ... */ };
onActivate() { /* o start() */
this.engine.canvas.addEventListener('keyup', this.keyUpHandler);
}
onDeactivate() {
/* Rimuovi il listener per i ricaricamenti della scena, altrimenti la pressione dei tasti
* è gestita più volte o gestita anche nella scena successiva */
this.engine.canvas.removeEventListener('keyup', keyUpHandler);
}