Progettazione di un "ciclo di scripting" in Javascript

7

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?

    
posta Steve 11.02.2017 - 20:00
fonte

2 risposte

1

I lavoratori Web consentono thread in background che non bloccano il thread principale e comunicano tramite messaggi / eventi.

link

    
risposta data 13.04.2017 - 20:53
fonte
0

Vorrei implementare tecniche di codifica polimorfiche per ottenere ciò che stai cercando di fare. In questo modo potresti avere due classi base e ereditare quelle classi in sottocategorie che modificano progressivamente i frame in tutto il programma. Quindi, se si implementa una funzione a-sync per scorrere ciascuna sottoclasse dopo che la funzione precedente ha completato la dipendenza da altre variabili specificate dall'utente, si avrà un programma che essenzialmente risponde all'azione dell'utente e quindi elabora di conseguenza tali informazioni. Spero di aver capito correttamente la tua domanda.

    
risposta data 12.02.2017 - 13:32
fonte

Leggi altre domande sui tag