Javascript è un linguaggio a thread singolo, ma quando si sviluppano giochi d'avventura point-and-click, è spesso vantaggioso avere 2 "thread" in esecuzione, il thread di rendering / logico e il thread di scripting del gioco.
Il rendering / thread logico esegue ogni loop di gioco per rendere la scena e spostare i personaggi e così via.
Il thread "scripting" è un'interfaccia semplice per il game maker per lo script delle interazioni. In Adventure Game Studio, lo scripting potrebbe essere simile a questo:
function onRoomLoad() {
myCharacter.Walk(200,300); // Walk to a point on the screen
myCharacter.Say("I'm selling these fine leather jackets"); // Say a line of dialogue
myCharacter.Walk(100,300); // Walk back to where they came from
}
Queste funzioni dovrebbero "bloccare" il thread di scripting fino a quando non sono state completate e poi continuare con il successivo mentre non bloccare il thread di rendering.
In Javascript posso vedere tre possibilità su come gestirlo:
Funzioni del generatore ovunque.
function* onRoomLoad() {
yield* myCharacter.walk(200,300);
yield* myCharacter.say("I'm selling these fine leather jackets");
yield* myCharacter.Walk(100,300);
}
(Si noti che tutti questi rendimenti finirebbero per ridursi a una chiamata yield* wait(t)
che aspetterebbe t
cicli di gioco prima di finire.)
Promesse
function onRoomLoad() {
myChar.walk(200,300).
then(x => x.say("I'm selling these fine leather jackets")).
then(x => x.walk(100,300));
}
Rinvia il rendering all'interno delle chiamate di blocco
Non sono sicuro che questo sia effettivamente possibile poiché bloccherebbe costantemente il browser, ma fondamentalmente funzionerebbe come un normale ciclo di gioco con un ciclo infinito che si limitava a disegnare l'elemento canvas ogni volta che poteva. Penso che il browser probabilmente penserebbe che il sito si è arrestato in modo anomalo se non ha mai ceduto e mantenuto il controllo completo.
Domanda
Nessuna di queste soluzioni mi sembra particolarmente soddisfacente. Ci sono delle opzioni che mi sono sfuggite che avrebbero consentito un comportamento di script arbitrario e bloccante in un browser?