Estoy haciendo un tipo de juego de novela visual muy básico en JavaScript. Soy un principiante, así que solo hago esto por diversión y aprendizaje, y debido a una mala planificación, me he encontrado con un pequeño problema cuando llegas a una rama en el diálogo.
Actualmente mantengo el script para el juego en una variable de cadena y divido cada escena con una etiqueta como "# ~" en arreglos más pequeños para que el script del juego se vea así:
var script = "Hello World!#~How are you today?"
var gameText = script.split("#~");
//gameText[0]= Hello World!
Esto funciona muy bien para cosas lineales, pero ¿cómo debo manejar una rama en el árbol de diálogo? Este método parece muy complicado, ya que tendría que saber exactamente cuánto dura cada ruta y, si alguna vez necesito cambiar algo, sería un dolor de cabeza.
¿Cómo puedo hacer esto de una manera más simple? Estoy tratando de mantener JavaScript vainilla ya que me gustaría que el juego funcione con Web Run Time.
fuente
Respuestas:
La respuesta de Philipp ya muestra la dirección correcta. Simplemente creo que la estructura de datos es innecesariamente detallada. Los textos más cortos serían más fáciles de escribir y leer.
Incluso si los textos más cortos harían que el algoritmo sea un poco más complejo, vale la pena hacerlo, porque solo escribe el algoritmo una vez, pero la mayor parte de su tiempo se dedicará a escribir y mantener la historia. Por lo tanto, optimice para facilitar la parte que pasará más tiempo haciendo.
Algunas explicaciones para este diseño:
Toda la historia está escrita en una matriz. No tiene que proporcionar números, la sintaxis de la matriz los proporciona automáticamente: el primer elemento tiene el índice 0, el siguiente tiene el índice 1, etc.
En la mayoría de los casos, no es necesario escribir el número del siguiente paso. Supongo que la mayoría de las líneas de texto no son ramas. Hagamos que "el siguiente paso sea el siguiente elemento" sea una suposición predeterminada, y solo tomemos notas cuando no sea así.
Para saltos, use etiquetas , no números. Luego, si luego agrega o elimina algunas líneas, se conservará la lógica de la historia y no tendrá que ajustar los números.
Encuentre un compromiso razonable entre claridad y brevedad. Por ejemplo, sugiero escribir "m" en lugar de "mensaje", ya que ese será el comando utilizado con más frecuencia, por lo que acortarlo hará que el texto sea más legible. Pero no hay necesidad de acortar las palabras clave restantes. (Sin embargo, haga lo que desee. Lo importante es que sea más legible para usted . Alternativamente, puede admitir "m" y "mensaje" como palabras clave válidas).
El algoritmo para el juego debería ser algo como esto:
Por cierto, estas ideas fueron inspiradas por Ren'Py , que no es exactamente lo que quieres (ni JavaScript, ni web), pero de todos modos podría darte algunas ideas geniales.
fuente
({ label: "like_yes"; m: "I am happy you like my game!"; next: "like_end" },)
debería tener un ',' no un ';'. Además, ¿cómo se llama exactamente la cosa en las llaves? ¿Es eso un objeto dentro de la matriz? si quisiera más información sobre cómo usar esto, ¿qué buscaría?{...}
es un objeto. En JavaScript, el objeto es una matriz asociativa de valor clave (con alguna funcionalidad adicional, no utilizada en este ejemplo), similar a la matriz en PHP o Mapa en Java. Para obtener más información, consulte los artículos de Wikipedia sobre JavaScript y ECMAScript, y la documentación vinculada desde allí, especialmente la documentación oficial de ECMAScript.Le recomendaría que cree una serie de eventos de diálogo. Cada evento es un objeto que contiene el texto que dice el NPC y una serie de posibles respuestas del jugador, que a su vez son objetos con un texto de respuesta y el índice del evento que sigue a esta respuesta.
fuente
Deberías usar un enfoque diferente. JavaScript admite matrices y objetos, entonces, ¿por qué no usar uno por entrada, ahorrándote toda la división y haciendo que el texto real sea más fácil de editar / leer?
Si lo desea, puede echar un vistazo a algunos prototipos que he hecho durante unas horas para # 1gam . La fuente es gratuita para usarse bajo GPLv3 (estoy perfectamente bien si no te apegas a la GPL, si solo la estás usando como inspiración. Pero avísame una vez que tu juego haya terminado). Simplemente no esperes una escritura increíble ni nada de eso. ;)
Para dar una breve explicación sobre cómo funciona el código, ignorando las cosas de animación CSS y cosas por el estilo:
var data
esencialmente contiene toda la historia con todas las opciones posibles, etc.start
, la segundacwait
, etc.[target location:display text]
.navigate()
: esta función hace que los enlaces de marcado sean clicky. Es un poco más largo, porque también estoy manejando algo de texto estático para puntos muertos allí. La parte importante son las dos primeras llamadas areplace()
.En lugar de definir estos colores, también podría agregar enlaces que apuntan a otras ubicaciones (tenga en cuenta que mi código no maneja esto; es solo una idea para demostrar esto):
'start': ['Waking up', 'You wake...', 'cwait:yell for help', 'cwait: wait a bit', 'clook: look around']
fuente