| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa |
| tutorial_de_renpy [2025/01/20 17:15] – peron | tutorial_de_renpy [2026/04/21 16:09] (actual) – editor externo 127.0.0.1 |
|---|
| Para ejecutar la plantilla de tu prototipo de novela visual, apretá "Lanzar proyecto". | Para ejecutar la plantilla de tu prototipo de novela visual, apretá "Lanzar proyecto". |
| |
| ====Un juego simple==== | ====Un juego simple para aprender==== |
| |
| Para empezar a crear nuestra novela visual, haremos una versión traducida al castellano de The Question (puesto que esto facilitará aún más el aprendizaje). | Para empezar a crear nuestra novela visual, haremos una versión traducida al castellano de The Question (puesto que esto facilitará aún más el aprendizaje). |
| Ahora bien, una vez que se abra el editor, borrá todo el contenido de ''script.rpy'': como empezaremos desde cero, no necesitaremos nada del guion anterior. Pegá el siguiente contenido en ''script.rpy'', y guardalo. | Ahora bien, una vez que se abra el editor, borrá todo el contenido de ''script.rpy'': como empezaremos desde cero, no necesitaremos nada del guion anterior. Pegá el siguiente contenido en ''script.rpy'', y guardalo. |
| |
| <code python> | <file python script.rpy> |
| label start: | label start: |
| |
| |
| "Silvana" "¡Dale!" | "Silvana" "¡Dale!" |
| </code> | </file> |
| |
| Este primer guion de juego sigue la sintaxis de Ren'Py, y como ves, es sumamente simple. Aún no le pusimos ninguna imagen ni nada de música, pero al menos presenta una //conversación entre dos personajes//, y una de las líneas es una //narración en off//. | Este primer guion de juego sigue la sintaxis de Ren'Py, y como ves, es sumamente simple. Aún no le pusimos ninguna imagen ni nada de música, pero al menos presenta una //conversación entre dos personajes//, y una de las líneas es una //narración en off//. |
| |
| ===Declaración Hide=== | ===Declaración Hide=== |
| | |
| Ren'Py también soporta una declaración ''hide'', que __oculta__ una imagen dada. | Ren'Py también soporta una declaración ''hide'', que __oculta__ una imagen dada. |
| |
| <code renpy> | <code python> |
| label irse: | label irse: |
| |
| </code> | </code> |
| |
| En realidad es bastante raro usar ''hide''. Podés usar ''show'' cuando un personaje cambia de emociones, mientras que ''scene'' lo usás para el momento en que todos los personajes se van. Sólo es necesario usar ''hide'' cuando un personaje abandona la escena, pero el resto de la escena y los demás personajes tienen que quedar igual. | En realidad ''hide'' se usa bastante poco. Podés usar ''show'' cuando un personaje cambia de emociones, mientras que a ''scene'' lo usás para el momento en que todos los personajes se van. Sólo es necesario usar ''hide'' cuando un personaje abandona la escena, pero el resto de la escena y los demás personajes tienen que quedar igual. |
| |
| ===Declaración Image=== | ===Declaración Image=== |
| </code> | </code> |
| |
| La declaración ''with'' recibe el __nombre de la transición__ a emplear. La más común es ''dissolve'', que //disuelve// de una pantalla a la siguiente. Otra transición útil es ''fade'', que //desvanece la pantalla a negro//, y luego la desvanece a la siguiente pantalla. | La declaración ''with'' recibe el __nombre de la transición__ a emplear. La más común es ''dissolve'', que //disuelve// de una pantalla a la siguiente. Otra transición útil es ''fade'', que //desvanece la pantalla a negro//, y luego la transiciona a la siguiente pantalla. |
| |
| Cuando colocás una transición tras múltiples declaraciones ''scene'', ''show'' o ''hide'', se aplicará a todas ellas a la vez. Si escribís: | Cuando colocás una transición tras múltiples declaraciones ''scene'', ''show'' o ''hide'', ésta se aplicará a todas ellas a la vez. Por lo tanto, si escribís: |
| |
| <code python> | <code python> |
| </code> | </code> |
| |
| Tanto las imágenes "''bg meadow''" y "''sylvie green smile''" se disolverán al mismo tiempo. Para disolver una a la vez, es necesario programarlo usando dos declaraciones ''with'': | ...tanto las imágenes "''bg meadow''" y "''sylvie green smile''" se disolverán al mismo tiempo. Para disolver de a una por vez, es necesario programarlo de otra forma, usando dos declaraciones ''with'', de esta manera: |
| |
| <code python> | <code python> |
| </code> | </code> |
| |
| Esto primero disuelve el fondo del prado, y luego disuelve a Silvana. Si querías mostrar el prado instantáneamente, y luego presentar a Silvana, podías programarlo así: | De esta manera, primero se disuelve el fondo del prado, y luego disuelve a Silvana. Si querías mostrar el prado instantáneamente, y luego hacer que Silvana aparezca suavemente, podías programarlo así: |
| |
| |
| |
| |
| La mayoría de los juegos de Ren'Py tienen música de fondo. La música se reproduce con la declaración ''play music''. La declaración ''play music'' recibe un nombre de archivo que es interpretado como un fichero de audio que debe ejecutarse. Los ficheros de audio se interpretan en relación al directorio de juego. Los ficheros de audio deben estar en formato opus, ogg vorbis, o mp3. | La mayoría de los juegos de Ren'Py tienen música de fondo. La música se reproduce con la declaración ''play music''. La declaración ''play music'' incluye un nombre de archivo que es interpretado como un fichero de audio que debe ejecutarse de manera sinfín (en bucle). Los ficheros de audio se interpretan en relación al directorio de juego. Los ficheros de audio que acepta Ren'Py son de formato ''opus'', ''ogg vorbis'', o ''mp3''. |
| |
| Por ejemplo: | Por ejemplo: |
| </code> | </code> |
| |
| Cuando se cambia la música, uno puede indicar una cláusula ''fadeout'' o ''fadein'', que se usan para desvanecer el volúmen de la antigua música y aumentar el volúmen de la música nueva (para hacer una transición suave de músicas). | Cuando se cambia la música, uno puede indicar una cláusula ''fadeout'' o ''fadein'', que se usan para desvanecer el volumen de la antigua música y aumentar el volumen de la música nueva (para hacer una transición suave de músicas). |
| |
| <code python> | <code python> |
| </code> | </code> |
| |
| La declaración ''queue music'' reproduce un fichero de audio después que el fichero de audio actual terminal | La declaración ''queue music'' permite hacer una //playlist//, o sea, reproduce un fichero de audio nuevo una vez que termina el fichero de audio actual. |
| |
| <code pywhon> | <code pywhon> |
| </code> | </code> |
| |
| Podés parar la música con la declaración ''stop music'', que también puede recibir una cláusula ''fadeout'' opcional. | Podés detener la reproducción de la música abruptamente con la declaración ''stop music'', o bien agragarle una cláusula ''fadeout'' opcional para detener la música suavemente. |
| |
| <code python> | <code python> |
| </code> | </code> |
| |
| Los efectos de sonido pueden reproducirse con la declaración ''play sound''. A diferencia de la música, los efectos de sonido no tienen bucle (no se repiten indefenidamente). | Los efectos de sonido se reproducen con la declaración ''play sound''. A diferencia de la música, los efectos de sonido no se reproducen en bucle sinfín (no se repiten indefinidamente). |
| |
| <code python> | <code python> |
| </code> | </code> |
| |
| Cuando ponés los archivo de audio en el directorio ''game/audio'', y podés usar el nombre sin extensión de archivo, al estilo de una variable de Python (o sea, comienza con una letra, y contiene sólo letras, números y guiones bajos). En tal caso, te será posible reproducir dicho fichero sin poner las comillas. | Si ponés los archivo de audio en el directorio ''game/audio'', podés usar el nombre sin extensión de archivo, al estilo de una variable de Python (o sea, comienza con una letra, y contiene sólo letras, números y guiones bajos). En tal caso, te será posible programar la reproducción de dicho fichero sin poner las comillas. |
| |
| Por ejemplo, si tenés el archivo de audio ''game/audio/illurock.ogg'', podés programar: | Por ejemplo, si tenés el archivo de audio ''game/audio/illurock.ogg'', podés programar: |
| ====Declaración pause==== | ====Declaración pause==== |
| |
| La declaración ''pause'' hace que Ren'Py haga una pausa hasta hacer clic con el mouse. | La declaración ''pause'' hace que Ren'Py haga una pausa hasta que el jugador haga clic con el mouse. |
| |
| <code python> | <code python> |
| En este ejemplo, cada una de las dos opciones del menú ejecuta una única declaración ''jump''. La declaración ''jump'' transfiere el control a la etiqueta definida a través de la declaración ''label''. Luego del salto ''jump'', se ejecutan las declaraciones del guion que siguen a la etiqueta ''label'' determinada. | En este ejemplo, cada una de las dos opciones del menú ejecuta una única declaración ''jump''. La declaración ''jump'' transfiere el control a la etiqueta definida a través de la declaración ''label''. Luego del salto ''jump'', se ejecutan las declaraciones del guion que siguen a la etiqueta ''label'' determinada. |
| |
| {{ :renpy_pregunta.png?200 |}} | {{ :renpy_pregunta.jpg?200 |}} |
| |
| En el ejemplo anterior, luego de que Silvana realiza su pregunta, al jugador se le presentará un menú que contiene dos opciones. Si el jugador elige "Es un videojuego", se ejecuta la primer declaración ''jump'', y Ren'Py saltará a la etiqueta ''juego''. Esto provocará que el Punto de Vista del personaje diga "Es una historia con imágenes y música", tras lo cual Ren'Py saltará a la etiqueta ''casamiento''. | En el ejemplo anterior, luego de que Silvana realiza su pregunta, al jugador se le presentará un menú que contiene dos opciones. Si el jugador elige "Es un videojuego", se ejecuta la primer declaración ''jump'', y Ren'Py saltará a la etiqueta ''juego''. Esto provocará que el Punto de Vista del personaje diga "Es una historia con imágenes y música", tras lo cual Ren'Py saltará a la etiqueta ''casamiento''. |
| |
| Si no hay una declaración ''jump'' al final del bloque asociado con la etiqueta ''label'', Ren'Py continuará a la siguiente declaración. La última declaración jump aquí es técnicamente innecesaria, pero se la incluye para hacer más claro el flujo del juego. | Si no hay una declaración ''jump'' al final del bloque asociado con la etiqueta ''label'', Ren'Py continuará a la siguiente declaración. La última declaración ''jump'' aquí es técnicamente innecesaria, pero se la incluye para hacer más claro el flujo del juego. |
| |
| Pueden definirse las etiquetas label en cualquier archivo de juego que esté en el directorio ''game'', y termine con extensión .rpy. El nombre de archivo no importa en Ren'Py, solamente importan las etiquetas contenidas en el. Podés pensar todos los archivos .rpy como si fuese un único archivo .rpy enorme, en el cual se usan los saltos para transferir el control. Esto te da flexibilidad en la manera en la cual organizás el guión de un juego muy largo. | Pueden definirse las etiquetas ''label'' en cualquier archivo de juego que esté en el directorio ''game'', y termine con extensión ''.rpy''. El nombre de archivo no importa en Ren'Py, solamente importan las etiquetas contenidas en el. Podés pensar todos los archivos ''.rpy'' como si fuese un único archivo ''.rpy'' enorme, en el cual se usan los saltos para transferir el control. Esto te da flexibilidad en la manera en la cual organizás el guión de un juego muy largo. |
| |
| Ver manual: [[https://renpy.org/doc/html/menus.html|In-Game Menus]] y [[https://renpy.org/doc/html/label.html|Labels & Control Flow]] | Ver manual: [[https://renpy.org/doc/html/menus.html|In-Game Menus]] y [[https://renpy.org/doc/html/label.html|Labels & Control Flow]] |
| ==== Integración de Python==== | ==== Integración de Python==== |
| |
| Si bien podés hacer algunos juegos simples usando las declaraciones ya indicadas, ciertos juegos requieren una programación más compleja para almacenar datos para recabarlos luego. Por ejemplo, puede tener sentido que el juego recuerde una opción escogida por el jugador, volver a una sección común del guion, y actuar más adelante según la opción escogida anteriormente. Esta es una de las razones por la cual Ren'Py cuenta con [[tutorial de python|soporte de Python]] incorporado. | Si bien podés hacer algunos juegos simples usando las declaraciones ya indicadas, ciertos juegos requieren una programación más compleja en la cual se almacenan datos para recabarlos luego. Por ejemplo, puede tener sentido que el juego recuerde una opción escogida por el jugador, volver a una sección común del guion, y actuar más adelante según la opción escogida anteriormente. Esta es una de las razones por la cual Ren'Py cuenta con [[tutorial de python|soporte de Python]] incorporado. |
| |
| ===Flags de apoyo usando las declaraciones Default, Python e If=== | ===Flags de apoyo usando las declaraciones Default, Python e If=== |
| if libro: | if libro: |
| |
| "Nuestro primer juego se basó en las ideas de Silvana, pero luego se me ocurrieron mis propias historias también." | "Nuestro primer juego se basó en las ideas de Silvana, pero luego se me ocurrieron historias propias también." |
| </code> | </code> |
| |
| if libro: | if libro: |
| |
| "Nuestro primer juego se basó en las ideas de Silvana, pero luego se me ocurrieron mis propias historias también." | "Nuestro primer juego se basó en las ideas de Silvana, pero luego se me ocurrieron historias propias también." |
| |
| else: | else: |
| </code> | </code> |
| |
| Las variables de Python no se limitan necesariamente a valores simples ''True''/''False''. También podés usar variables para almacenar el nombre del jugador, los puntajes, o para cualquier otro propósito que se te ocurra. Ya que Ren'Py incluye la habilidad de usar todo el lenguaje de programación Python, es posible hacer muchas cosas más. | Las variables de Python no se limitan necesariamente a valores simples ''True''/''False''. También podés usar variables para almacenar el nombre del jugador, puntajes, estadísticas de vida, logros, o para cualquier otro propósito que se te ocurra. Ya que Ren'Py incluye la habilidad de usar todo el lenguaje de programación Python, es posible hacer muchas cosas más. |
| |
| >Un recurso típico es el subgénero "simdate" o "juego de conquistas", donde las elecciones del jugador suman o restan puntaje de una o varias variables; de acuerdo al puntaje que vas sumando o restando, podés avanzar en determinadas //sendas// de la historia. | >Un recurso típico es el subgénero "simdate" o "juego de conquistas", donde las elecciones del jugador suman o restan puntaje de una o varias variables; de acuerdo al puntaje que vas sumando o restando estadísticas, podés avanzar en determinadas //sendas// de la historia, o retroceder en otras. |
| |
| Ver Manual: [[https://renpy.org/doc/html/python.html|Python Statements]] y [[https://renpy.org/doc/html/conditional.html|Conditional Statements]] | Ver Manual: [[https://renpy.org/doc/html/python.html|Python Statements]] y [[https://renpy.org/doc/html/conditional.html|Conditional Statements]] |
| |
| ====Guion de La Pregunta ==== | ====Guion de La Pregunta ==== |
| | |
| | //La Pregunta// es una versión traducida pero tiene los puntos básicos de este tutorial de Ren'Py. |
| |
| Si querés, podés ver el guion completo de ''[[script.rpy|La Pregunta]]'' aqui, pegarlo en el editor, y lanzarlo. | Si querés, podés ver el guion completo de ''[[script.rpy|La Pregunta]]'' aqui, pegarlo en el editor, y lanzarlo. |
| |
| |
| ====Publicar tu juego==== | ====Crear tu propio juego==== |
| |
| //La Pregunta// es una versión traducida pero tiene los puntos básicos de este tutorial de Ren'Py. ¿Felicitaciones! | Como ves, el ambiente Ren'Py es lo suficientemente sencillo como para poder recurrir a hacer tus propios personajes, historias, senderos de aventura, retruécanos y relatos. |
| |
| Pero como ves, el ambiente es lo suficientemente sencillo como para poder recurrir a hacer tus propios personajes, historias, senderos de aventura, retruécanos y relatos. ¡Podrías se un desarrollador de juegos noveles! | Dibujar y escanear/fotografiar tus propios personajes es una manera sencilla de comenzar. Existen recursos de música de licencias completamente libres para utilizar, o elementos generados por IA de libre uso. |
| | |
| | Gracias a todas las herramientas de software libre, recursos audiovisuales liberados ¡Podrías convertirte en desarrollador@ de juegos amateur! |
| |
| Una vez que hiciste un juego, existen varias cosas que podés hacer antes de publicarlo: | Una vez que hiciste un juego, existen varias cosas que podés hacer antes de publicarlo: |
| | |
| | ==Revisar tu guion== |
| | |
| | Desde la primer página del Lanzador, elegi "Revisar guion (Lint)". Esto depurará tu juego en busca de errores potenciales. Ya que algunos de estos errores sólo afectan a usuarios de otras plataformas, es importante entender y usaurlmente corregir todos estos errores, incluso si no te dan problemas en tu computadora. |
| |
| ==Revisar versiones nuevas de Ren'Py== | ==Revisar versiones nuevas de Ren'Py== |
| |
| Se lanzan nuevas versiones de Ren'Py periódicamente en base a correcciones de errores y nuevas funcionalidades. Antes de lanzarlas, querrías hacer clic en Actualizar en el lanzador de Ren'py para bajarte la última versión. También podés bajarte nuevas versiones y ver un listado de cambios en https://www.renpy.org/latest.html. | Periódicamente se lanzan nuevas versiones de Ren'Py en base a correcciones de errores y nuevas funcionalidades. Antes de lanzarlas, querrías hacer clic en Actualizar en el lanzador de Ren'py para bajarte la última versión. También podés bajarte nuevas versiones y ver un listado de cambios en https://www.renpy.org/latest.html. |
| |
| Raramente los cambios a Ren'Py requieren que hagas cambios en el guion de tu juego. Los cambios incompatibles se listan allí. | Raramente los cambios a Ren'Py requieren que hagas cambios en el guion de tu juego. Los cambios incompatibles se listan allí. |
| |
| ==Revisar el guion== | ==Compilar distribuciones== |
| |
| Desde la primer página del Lanzador, elegi "Revisar guion (Lint). Esto revisará tu juego en busca de errores potenciales. Ya que algunos de estos errores sólo afectan a usuarios de otras plataformas, es importante entender y usaurlmente corregir todos estos errores, incluso si no te dan problemas en tu computadora. | Desde la primer página del lanzador, elegí "Compilar Distribuciones". Basado en la información indicada en ''option.rpy'', el Lanzador Ren'Py compilará uno o más ficheros de archivaje que contendrán a tu juego. |
| |
| ===Compilar distribuciones=== | ==Probar el juego compilado== |
| |
| Desde la primer página del lanzador, elegí "Compilar Distribuciones". Pasado en la información indicada en ''option.rpy'', el lanzador construirá uno o más ficheros de archivaje que contendrán a tu juego. | Lint no es substituto para las pruebas completas del juego. Es tu responsabilidad revisar tu juego antes de publicarlo. Considerá pedirle a tus amig@s que te ayuden a testear la beta de tu juego compilado, puesto que a menudo un probador podrá encontrar problemas que vos no viste. |
| | |
| ===Probarlo=== | |
| | |
| Lint no es un substituto para evaluaciones completas. Es tu responsabilidad revisar tu juego antes de publicarlo. Considerá pedirle a tus amigos que te ayuden a testear la beta de tu juego ya que a menudo un probador podrá encontrar problemas que vos no. | |
| | |
| ===Lanzamiento=== | ===Lanzamiento=== |
| |
| Una vez que terminaste el juego y lo probaste, deberíaws postear el archivo generado en una web donde alguien pueda verlo (no tenés que tener tu propio website, https://itch.io hospeda un montón de novelas visuales) | Una vez que terminaste el juego y lo probaste, deberías postear el archivo compilado generado en una web donde alguien pueda verlo. Si ocupa poco espacio, ¡nuestra [[caja]] de texto-plano.xyz puede servirte! |
| | |
| | Tampoco necesitás tener tu propio website, https://itch.io hospeda un montón de novelas visuales) |
| |
| ¡Felicitaciones! ¡Publicaste tu primer novela visual! | ¡Felicitaciones! ¡Publicaste tu primer novela visual! |
| |
| |
| |
| ====Conclusión==== | ====Conclusión==== |
| |
| Si te interesa aprender mas, aprovechá para leer el [[https://renpy.org/doc/html/language_basics.html|Manual de Ren'Py]]. | Si te interesa aprender mas, aprovechá para leer el [[https://renpy.org/doc/html/language_basics.html|Manual de Ren'Py]]. |
| |
| |
| |
| ¡Gracias por escoger el motor de novelas visuales Ren'Py!. ¡Queremos ver lo que creás con él! | ¡Gracias por escoger el motor de novelas visuales Ren'Py!. ¡Queremos ver lo que creás con él! |
| |