jueves, 26 de julio de 2012

Sistema de dialogos animados en Blender Game Engine



En al entrada anterior en los comentarios estuve hablando con Erik sobre el motor de Blender y sobre el sistema de dialogos de Ren'Py.

Al principio tenia pensado hacer un sistema de diálogos solo con bloques de lógica pero tras ver un vídeo que Erik me recomendó empecé a indagar sobre códigos en Python y otros vídeos que fui viendo en Youtube.

Y el resultado (por lo menos para mi) a sigo de lo mas gratificante.

Empecé con hacer que las letras fuesen apareciendo en la pantalla gradualmente (como en cualquier juego rpg)
y solo con 10 lineas de código extremadamente simple (13 teniendo en cuenta los espacios para hacer el código mas legible)

Después de eso comencé con el verdadero reto (hacer que cualquier objeto de la escena pudiese mandar texto enriquecido al plano que representa el texto)
y hoy por fin con 32 lineas de codigo (37 con espacios) lo he hecho posible.

De no ser por que Blender enviaba 2 triggers de golpe cuando pulsaba una tecla habría sido mas fácil de implementar con una simple lista en Python sin que al final se saliera de los limites de esta, así que me las arreglé haciendo el "sistema de mensajes", aunque tal vez para continuar tenga que implementar un evento de teclado para que envié solo un trigger.

Podría decirse que ya es apto para usarse en cualquier juego, solo me queda pulir algunos detalles para evitar que el usuario pueda saltarse los diálogos por accidente a demás de dotarlo para que las letras puedan cambiar de color y de tamaño.

Solo hay una pega en todo esto y es que Blender de por si no soporta codificación UTF-8, es decir que de momento no se pueden escribir caracteres como á é í ó ú ñ.
Creo que tendré que editar la imagen de la tipografía y sustituir a mano caracteres que no se usarán como "#$%& por las letras y la ñ.

El código lo publicaré en la web que estoy preparando (todo el código estará bajo licencia GNU)


En esta ocasión me salto el resumen de avances por que todo sigue igual excepto la web que esta un poco mas decorada y el archivo blend base que es en lo que estoy trabajando ahora con el sistema de diálogos.

3 comentarios:

  1. Pues estaba yo buscando como hacer para escribir un nombre en runtime con python y me encuentro con esto. No tiene nada que ver, pero aun así me ha sorprendido. Llevo tiempo programando un juego en python. Como empece sin saber nada de python tuve que ingeniármelas para arreglar los problemas que surgían de una forma... poco funcional que digamos. Por ejemplo: Las variables globales. Malditas variables globales, si inicias el script por el modulo (en lugar de iniciarlo desde la función) el bucle se repite en todo el script, y todas las variables se reinician en cada pasada del bucle. Para solucionarlo tuve que crear un script de arranque (sin bucle) que creaba propiedades del tipo bge.logic.globalDict["Propiedad"], o bge.logic.Propiedad. En cualquier caso, nada practico. Ahora me doy cuanta de que se puede hacer de esa forma. Que curiosa es la vida.

    No me puedo ir sin devolverte el favor. Puede que ya lo sepas, pero te lo explico igual, pues a mi me costo de encontrar (lo encontré un día de casualidad, como esto). El caso es que, si tienes distintos objetos y quieres modificaros en el mismo script, no puedes usar obj = ...owner, pues modificaras solo el que haga la llamada al script. Pero puedes referirte a otros objetos con obj = bge.logic.getCurrentScene().objects["Nombre del objeto"]

    Gracias y surte con el proyecto. No me parece mala idea lo del Ren'Py.

    ResponderEliminar
  2. Gracias por tu comentario y por compartir con nosotros tu experiencia en programación.
    Es gratificante ver que alguien saca provecho del proyecto que es precisamente para lo que lo estamos haciendo.
    Parece mentira que cosas tan simples como esta no estén explicadas en otros sitios mas importantes, pero así son las cosas.

    Veo que a nivel de programación en Python nos parecemos bastante, a mi lo que menos me entra en la cabeza es la programación orientada a objetos, sencillamente no veo por donde cogerla por eso hago programación funcional en Python.

    Lo que ves aquí es el ejemplo sencillo de dialogo.
    Tenia pensado subir una versión mejorada cuando tuviésemos la web acabada pero como para eso aún falta un poco comparto contigo los avances que tengo del BGE de Blender:
    http://www.mediafire.com/?tubm242kozfukg9

    Incluye un sistemas de dialogo mas avanzado (incluido en el archivo dialog.py) el resto es el blend con un cubo y un plano con texto y otro script que estaba haciendo pruebas sencillas para guardar la posición del cubo en un archivo y cargarla aún después de haber reiniciado el ordenador.

    Espero que te sirva y recuerda, todo lo que tenemos aquí lo puedes compartir con los demás (el conocimiento es libre)

    ResponderEliminar
    Respuestas
    1. Me he mirado el código y realmente esta bien. Todo con su función correspondiente, muy bien la POO. Lo único que veo que tienes que solucionar es lo de las dirección globales, si las usas tu proyecto solo funcionara en tu PC. Como alternativa usa direcciones locales o la función bge.logic.expandPath("Dirección local") para convertir tu dirección en una global valida.

      Si necesitas ayuda mándame un correo, como tu dices estamos más o menos al mismo nivel, pero seguro que dos pueden más que uno. Saludos!

      Eliminar