Sobre los diálogos en los juegos

NoWandStds

Buenas a todos, el otro día debatimos un poco en el estudio cual sería la mejor manera de introducir los diálogos en los juegos (hablamos a nivel programación). En anteriores juegos los hemos metido casi artesanalmente, pero en juegos con muchas líneas no nos parece optimo. Hemos estado trasteando con un programa llamado Chat Mapper ver si nos puede generar un fichero que podamos integrar, pero nos da demasiados campos que no necesitamos.

Por eso, se me ocurrió plantearlo a los "gamevideros" ¿cómo lo estáis solucionando?

VicoViper

#1 Yo en Unity suelo hacer un Gameobject que me almacena los datos de la partida, y es a este al que le suelo meter el script que contiene los diálogos en matrices de variables.

Matrices del estilo String[Pj][Dialogo] y hasta la fecha me ha sobrado con eso.
Si tuviera que hacer muchos diálogos, lo separaría en diferentes matrices para cada Pj del tipo String[Fase][Dialogo], o diferentes matrices por fase... no se...

Pero vamos, que estos casos, lo suyo es usar archivos tipo .xml lo que a mi siempre me ha dado pereza, y nunca he tenido que trabajar con mucho dialogo.

NoWandStds

Si, esa solución es la que aplicamos en la última jam, pero buscábamos algo que no mate a nuestros programadores :D

Estamos investigando sobre los .xml a ver que sale... ¿alguien ha trasteado con ellos?

mr_badger

Yo para valki donde hay bastantes dialogos he realizado algo como esto (basado en el trabajo anterior de midgard). Todo dicho de memoria y con mi lenguaje poco técnico....

Int nº de dialogos: esta crea el numero de clases dialogos siguientes

Clase dialogo{
int IDdialogo
string Texto
boolean pregunta
string boton 1
string boton 2
Nodo boton 1 ---->es el IdDialogo o funcion a la que se dirige cuando pulsas ese boton
Nodo boton 2 ----> es el IdDialogo o funcion a la que se dirige cuando pulsas ese boton
}

si pregunta es false boton next salta al siguiente texto
Si pregunta es true boton next desaparece y aparecen string boton 1, string boton 2, Nodo boton 1 ,Nodo boton 2

Este script se adjunta a cada NPC y el protagonista tiene la funcion que hace que si colisionas con un objeto de tag dialogante y pulsas el boton accion salta la funcion dialogos.

Cuando trabajaba con blender use una especie de texto tipo xml con todos los dialogos, pero al final esta manera de trabajar de cada npc sus dialogos se me hace mas amigable.

No se si me he explicado muy bien. :P

1 2 respuestas
NoWandStds

#4 Nuestros programadores te han entendido así que has debido hacerlo jajaja. Gracias por la explicación, se les ha encendido la bombillita.

Ya te/os iremos diciendo resultados :D

1 respuesta
m4andg4

¿Y que tal los HashMap<clave, Valor>?

HashMap<String, String> dialogues;

Si el Personaje tuviera más de un diálogo simplemente nombraría tal que así:

put.dialogues("ronald", "Is too easy dude"); 
put.dialogues("ronald2", "I told you");
get.dialogues("ronald"); (out)->"is too easy dude"
get.dialogues("ronald2"); (out)->"I told you"

Puedes ahondar más, y en vez de crear una clave-valor para cada diálogo de cada personaje, puedes usar una lista o array como valor dentro del HashMap.

Tanto con listas como con arrays Ahorras n-1 en claves a nivel de memoria. Y además con arrays tendrías un acceso directo al dialogo que buscas, con listas tendrías que iterar n/2 hasta llegar al que buscas.

En un proyecto pequeño, no creo que haga falta, pero si eres un maníatico de la optimización, estudiate los Hash y tirale, son bastante útiles.

He usado la nomenclatura de java, ya que me parece la más sencilla a la hora de entenderla pero si usas Unity C# tiene librerias bastante buenas.

1 1 respuesta
mr_badger

#5 Me alegro :)

Por cierto si usais unity podeis modificar el inspector para que oculte las preguntas y todos los elementos textos dejando solo la id o el texto del dialogo para que sea mas comodo.

#6 ni idea soy muy newbie aun en unity, tendre que mirarmelo, gracias :D

m4andg4

joder, como se tabula y organiza el código en las cajas ???

Nazhor

#4 Encantado mr_badger, yo soy uno de los de No Wand Studios que te ha entendido xD

Para la última Ludum Dare hice algo parecido a lo que algunos habeís dicho.
Pero mi idea actual es que los diálogos estén en ficheros fuera (bien XML, json o alguno así...aún no me he decidido). De esta forma el que haga el "guión" puede directamente exportarme los ficheros y yo ya me ocupo de cargarlos en alguna estructura como las que habeís comentado.

En Unity hay mucha info para utilizar estos ficheros pero otros motores que estamos probando como Gamemaker no encuentro más que addons desactualizados.

¿Vosotros que motores usáis?

1 respuesta
mr_badger

#9 Yo ahora uso unity. Cuando usaba flash use xml para cargar dialogos y en blender (nada recomendable como motor) en python hice un script que era similar a lo que entiendo quieres hacer. Una variable global.historia (que podria ser una etiquieta de xml??) indica en que punto de la historia estamos. La variable/etiqueta collider el nombre del personaje/objeto que habla.

todos los dialogos que era una cosa como

if g.historia==1:  //variable que indica en que punto de la historia estas    
if collider.name=="guardia01": o["text1.1"]="Hola valki. ¿Te han dicho que busco a alguien? Bueno solo es un recado, hace \nrato que mi colega deberia de haber vuelto para relevarme en el puesto..." o["text1.2"]="Yo no me puedo mover de aquí hasta que no venga. Fue a la antigua escuela de \ndanza que ahora esta abandonada. Por lo visto alguien oyó ruidos dentro." o["text1.3"]="El propietario Nos dio la copia de llaves. Toma. Ves a ver si esta allí." if collider.name=="niño": o["text1.1"]="hola" if g.historia==2: if collider.name=="guardia01":
o["text1.1"]="Ya te dí la llave de la escuela de Danza" if collider.name=="niño": o["text1.1"]="jeje" if g.historia==3: if collider.name=="guardia01":
o["text1.1"]="¿Como? ¿que has estado dentro y no lo has visto? Busca bien seguro que esta allí"

Lo que aqui no meti el tema preguntas y respuestas, lo tuve que hacer manualmente para la unica que habia en todo el juego.

1 respuesta
B

Lo suyo es tener los diálogos en un fichero con formato json o xml si lo prefieres y cargar en memoria solo el lenguaje deseado( si lo tienes en multi idioma) y la sección del juego. Tenerlo todo en una variable todo el juego es una mala idea sobre todo a la hora de añadir idiomas o modificar el diálogo.

1 respuesta
VicoViper

De hecho yo suelo hacer las cosas en un punto intermedio entre #10 #11.

Los sistemas de diálogos son similares, pero todas las lineas de texto hacen referencia al script donde se almacenan las arrays con las líneas de texto, que es distinto al del código.

El código es más abstracto y a veces es un coñazo ver un montón de textos del estilo "Lvl1[2][15]", pero es un código mucho más limpio y si hay que corregir algo, es mucho más sencillo si tienes el código en un archivo a parte del texto, por no hablar de las traducciones, o de repetir diálogos...
Supongo que sería mucho más fácil hacerlo en un XML (o cualquier lenguaje de marcas) pero sinceramente, nunca lo he considerado necesario, ya que rara vez he pasado de las 2 cifras.

PD: Muchas veces, separo el texto incluso para cosas tan sencillas como "has ganado" "has perdido" y los almaceno en Arrays del tipo St_Win, St_Lost ya sea fuera o en el mismo script para que sea más limpio todo después.

NoWandStds

Wow, gracia a todos por las respuestas. Estamos intentando juntar todas las experiencias y parece que nuestros programadores están a tope jaja. Ya os iremos contando resultados :D

Usuarios habituales