Diseñar un "bucle de secuencias de comandos" en Javascript

7

Javascript es un lenguaje de un solo hilo, pero al desarrollar juegos de aventura de apuntar y hacer clic, a menudo es ventajoso tener 2 "hilos" en ejecución, el hilo de renderizado / lógico y el hilo de secuencias de comandos del juego.

El subproceso de procesamiento / lógica ejecuta todos los bucles del juego para renderizar la escena y mover a los personajes, y así sucesivamente.

El hilo de "secuencias de comandos" es una interfaz simple para que el creador de juegos pueda escribir las interacciones. En Adventure Game Studio, las secuencias de comandos pueden tener este aspecto:

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
}

Estas funciones deben "bloquear" el subproceso de secuencias de comandos hasta que se hayan completado y luego continuar con el siguiente, mientras que no bloquea el subproceso de representación.

En Javascript puedo ver tres posibilidades para manejar esto:

Funciones del generador en todas partes.

function* onRoomLoad() {
    yield* myCharacter.walk(200,300);
    yield* myCharacter.say("I'm selling these fine leather jackets");
    yield* myCharacter.Walk(100,300);
}

(Ten en cuenta que todos estos rendimientos se reducirán a una llamada yield* wait(t) que esperaría t de loops de juego antes de terminar.)

Promesas

function onRoomLoad() {
    myChar.walk(200,300).
        then(x => x.say("I'm selling these fine leather jackets")).
        then(x => x.walk(100,300));
}

Aplazar la representación dentro de llamadas bloqueadas

No estoy seguro de que esto sea realmente posible, ya que bloquearía constantemente el navegador, pero básicamente funcionaría igual que un juego normal con un ciclo infinito que solo se dibujaba en el elemento del lienzo siempre que podía. Creo que el navegador probablemente pensaría que el sitio se había bloqueado si nunca hubiera tenido el control completo.

Pregunta

Ninguna de estas soluciones me parece particularmente satisfactoria. ¿He omitido alguna opción que permita el comportamiento arbitrario de bloqueo de secuencias de comandos en un navegador?

    
pregunta Steve 11.02.2017 - 20:00

2 respuestas

1

Los trabajadores web permiten subprocesos en segundo plano que no bloquean el subproceso principal y se comunican a través de mensajes / eventos.

enlace

    
respondido por el jhyot 13.04.2017 - 20:53
0

Implementaría técnicas de codificación polimórfica para lograr lo que estás buscando hacer. De esta manera, podría tener dos clases básicas y heredar esas clases en subclases que alteran los marcos progresivamente a lo largo del programa. Luego, si implementa una función a-sync para pasar a través de cada subclase después de que la función anterior haya finalizado dependiendo de otras variables especificadas por el usuario, tendrá un programa que responde esencialmente a la acción del usuario y luego procesa esa información en consecuencia. Espero haber entendido tu pregunta correctamente.

    
respondido por el AlyssaFox 12.02.2017 - 13:32

Lea otras preguntas en las etiquetas