Herramientas de usuario

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
tutorial_de_renpy [2025/01/18 21:34] perontutorial_de_renpy [2026/04/21 16:09] (actual) – editor externo 127.0.0.1
Línea 7: Línea 7:
 El propósito de este tutorial es demostrar como hacer un juego en Ren'py en unos pocos pasos. El propósito de este tutorial es demostrar como hacer un juego en Ren'py en unos pocos pasos.
  
-====El lanzador de Ren'Py====+====Preparar Ren'Py====
  
-Antes de empezar a crear un juego, primero hay que tomarse el tiempo de aprender como funciona el //Lanzador de Ren'Py//. El lanzador te deja crear, gestionar, editar y ejecutar los proyectos de Ren'Py.+===Instalar===
  
-===Empezar=== +Para empezar tendrás que [[instalar renpy|instalar el ambiente Ren'Py en tu sistema]].
-Para empezar tendrás que [[instalar renpy|instalar ejecutar el Lanzador de Ren'Py en tu sistema]].+
  
-====Lanzador Renpy==== +====Lanzador Ren'py==== 
-Puesto que el lanzador está traducido a varios idiomas, lo primero que deberás hacer es elegir un idioma. Puedes escoger un idioma haciendo clic en //Preferencias// en la esquina inferior derecha, y eligiendo //Español//.+ 
 +El ambiente de programación gira alrededor de un programa llamado //Lanzador de Ren'Py// ("Ren'Py Laucher"). Este te permitirá crear, gestionar, editar, ejecutar y depurar distintos proyectos de Ren'Py. 
 + 
 +Puesto que el lanzador está traducido a varios idiomas, lo primero que deberás hacer es elegir un idioma. También puedes escoger un idioma haciendo clic en //Preferencias// en la esquina inferior derecha, y eligiendo //Español//.
  
 ===Elegir y lanzar un Proyecto=== ===Elegir y lanzar un Proyecto===
Línea 21: Línea 23:
 {{ :renpy_launcher.png?200 |}} {{ :renpy_launcher.png?200 |}}
  
-Primero deberías ver que apariencia tiene el juego "The Question". Para verlo, en la primer pantalla seleccioná The Question. Elegí Lanzar Proyecto para ejecutar The Question.+Primero revisemos qué apariencia tiene la novela visual "The Question". Para reproducirla, en el panel izquierdo seleccioná "The Question", y después apretá **Lanzar Proyecto** para reproducir //The Question//.
  
-Podés volver a la demo de Ren'Py haciendo lo mismo, pero eligiendo "Tutorial" en lugar de "The Question".+Podés volver a la demo de Ren'Py de la misma forma, pero eligiendo "Tutorial" en lugar de "The Question".
  
-====Iniciar un Proyecto Nuevo====+====Programar en Ren'Py==== 
 + 
 +Vamos a crear un nuevo nuevo proyecto de Ren'Py. 
 + 
 +Para ello tendremos siguiendo la sintaxis de Ren'Py. Esta funciona mayormente con palabras en inglés, y utilizan una sintaxis sencilla.
  
 ===Crea un nuevo proyecto=== ===Crea un nuevo proyecto===
-Vamos a crear un nuevo nuevo proyecto de Ren'Py. En el Lanzador de Ren'Py elegí "Crear Nuevo Proyecto".+ En el Lanzador de Ren'Py elegí "Crear Nuevo Proyecto".
  
-Si esta esa tu primera vez creando un proyecto, Ren'Py te pedirá que elijas un //Directorio de proyectos//. Este consiste en un directorio (también llamado carpeta) donde se almacenarán los nuevos proyectos, el cual se revisará  para buscar proyectos ya existentesEl //Selector de Directorios// puede aparecer en la parte inferior del Lanzador de Ren'Pyasegurate de revisarlo por si está allí.+Si esta esa tu primera vez creando un proyecto, Ren'Py te pedirá que elijas un //Directorio de proyectos//; este consiste en un //directorio// (también llamado //carpeta//) donde se almacenarán los nuevos proyectos que vayas creandoEn la parte inferior del Lanzador de Ren'Py puede aparecer el //Selector de Directorios//; asegurate de revisarlo por si está allí.
  
-Se te solicitará que indiques un nombre de proyecto. Por un nombre bobo, como "Mi Opción", y apretamos Intro.+Se te solicitará que indiques un //nombre de proyecto//Como nuestra novela visual estará en castellanopor ahora pongámosle algo como "Mi pregunta", y apretamos la **tecla Intro** para confirmar.
  
-Acto seguido el lanzador te pedirá que indiques la resolución del proyecto. 1280x720 es un buen compromiso entre tamaño de juego y calidad de imagen. Para el propósito de este tutorial, le elegimos 1280x720 para que coincida con el arte gráfico del juego "The Question",apretamos **Continuar**.+El Lanzador Ren'Py te solicitará que indiques la //resolución de pantalla// del proyecto. 1280x720 es un buen compromiso entre tamaño de juego y calidad de imagen. Para el propósito de este tutorial, elegí 1280x720 (ya que coincidirá con el arte gráfico de la novela visual de demostración "The Question"), y apretá **Continuar**.
  
-El lanzador te pedirá luego que escojas un esquema cromático (un color de fondo y de acentos para la interfaz de usuario). En este momento no importa demasiado, elegí algún color lindo, y dale "Continuar".+El Lanzador Ren'Py te pedirá luego que escojas un esquema cromático (un color de fondo y de acentos para la interfaz de usuario). En este momento no importa demasiado, elegí algún color lindo, y dale "Continuar".
  
-Llegado este momento, Ren'Py procesará lo escogido, y creará una plantilla simple para tu juego. La plantilla usa arte y texto "de quita y pon", pero funcionará, además que te creará automáticamente los botones típicos de retroceder, cargar y guardar jugadas, etcétera. +Llegado este momento, el Lanzador Ren'Py procesará lo escogido, y creará por tí una plantilla simple para tu juego. Por ahora la plantilla usa arte y texto "genérico", pero funcionará. Además, te creará automáticamente los botones típicos de retroceder, cargar y guardar jugadas, etcétera. 
  
-Para ejecutar la plantilla de tu novela visual, elegí "Lanzar proyecto".+Para ejecutar la plantilla de tu prototipo de novela visual, apretá "Lanzar proyecto".
  
-====Un juego simple====+====Un juego simple para aprender====
  
-<code python>+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). 
 + 
 +¡Manos a la obra! 
 + 
 +Para empezar, desde la parte superior del panel izquierdo del Lanzador Ren'Py seleccioná "My Question", y luego desde el sector //Editar Archivo//, elegí el fichero que contiene el guión de la obra: "''script.rpy''".  
 + 
 +Si es tu primera vez, Ren'Py pedirá que elijas un Editor para trabajar - para los creativos novatos recomendamos Editra, pero podés usar tu [[editores de texto|editor de texto favorito]]. El Lanzador Ren'Py recurrirá el editor que elijas, y abrirá el fichero de guion de la obra con el editor que pediste. 
 + 
 +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. 
 + 
 +<file python script.rpy>
 label start: label start:
  
-    "Silvia" "¡Como van! ¿Qué tal estuvo la clase?"+    "Silvana" "¡Como va! ¿Qué tal estuvo la clase?"
  
     "Yo" "Buena..."     "Yo" "Buena..."
Línea 55: Línea 71:
     "Yo" "¿Te vas a tu casa ahora? ¿Querés que volvamos juntos?"     "Yo" "¿Te vas a tu casa ahora? ¿Querés que volvamos juntos?"
  
-    "Silvia" "¡Dale!" +    "Silvana" "¡Dale!" 
-</code> +</file>
- +
-Este primer guión de juego de Ren'Py sumamente simple. No pusimos ninguna imagen ni música, pero al menos presenta una conversación entre dos personajes, y una de las líneas es una narración en off. +
- +
-Para probarlo, desde la parte superior de la pantalla seleccioná "My Question", y luego desde //Editar Archivo// elegí "''script.rpy''". Si es tu primera vez, Ren'Py pedirá que elijas un Editor para trabajar - para los creativos novatos recomendamos Editra - y el programa descargará el editor que elijas. Una vez hecho esto, abrirá el archivo de guion con el editor que pediste.+
  
-Ahora bienuna vez que se abra el editorborrá todo el contenido de ''script.rpy''. Empezaremos desde cero, por lo que no necesitamos nada de lo que ya tiene escrito. Copiá el ejemplo anterior en ''script.rpy'' y guardalo.+Este primer guion de juego sigue la sintaxis de Ren'Pyy como veses sumamente simpleAú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//.
  
-Ahora estamos listos para ejecutar este guion de ejemplo. Volvemos al Lanzador y elegimos "**Lanzar Proyecto**". Ren'Py lo ejecutará. Fijate como Ren'py te dará sin mas, los menús que te dejan cargar y grabar una partida, así como los de modificar las preferencias del juego. Cuando estés listo, apretá "Lanzar Proyecto" y podrás jugar este guion de ejemplo.+Ya estamos listos para ejecutar este guion de ejemplo. Volvé al Lanzador Ren'Py apretá "**Lanzar Proyecto**". Ren'Py lo ejecutará. Fijate como Ren'py pone directamente los menús que te dejan cargar y grabar una partida, así como los de modificar las preferencias del juego.
  
-El ejemplo tiene - sin embargo - varias //declaraciones// muy comunes del lenguaje Ren'Py.+Como vemos, este guion mínimo ya incluye varias //declaraciones// muy comunes del lenguaje Ren'Py. Estudiémoslas.
  
-La primer línea es una declaración ''label''. La declaración ''label'' se usa para etiquetar un lugar en el programa. En este caso, creamos una etiqueta llamada ''start''. La etiqueta ''start'' es especial porque determina el lugar donde comenzarán a ejecutarse los guiones de RenPy cuando presiones **Empezar Juego** en el menú principal.+La primer línea es una declaración ''label''. La declaración ''label'' se usa para etiquetar un lugar en el programa. En este caso, creamos una etiqueta llamada ''start''; esta etiqueta ''start'' resulta especial, puesto determina el lugar desde donde comenzará a ejecutarse los guiones de RenPy cuando apretás **Empezar Juego** en el menú principal.
  
-Las demás líneas son declaraciones ''say''. Existen dos formas de declaración ''say'': +Las demás líneas constituyen lo que se llaman declaraciones ''say''. Existen dos formas de declaración ''say'': 
-  * Una forma usada para **narración en off** o **pensamientos** del personaje principal. Consiste en una //cadena// (comienza con comillas ''"'', contiene caracteres, y termina con comillas ''"'', todo en una sola línea.  +  * Una __forma usada para **narración en off** o **pensamientos** del personaje principal__: consiste en una //cadena// (comienza con comillas ''"'', contiene caracteres, y termina con comillas ''"'', toda en una sola línea.  
-  * Una forma para **diálogos**. Consiste en dos //cadenas//; la primer cadena un //nombre de personaje// y la segunda cadena es lo que dice dicho personaje.+  * Una __forma para **diálogos**__: consiste en dos //cadenas//; la primer cadena es un //nombre de personaje// y la segunda cadena es lo que dice tal personaje.
  
-Tené en cuenta que todas las declaraciones ''say'' están sangradas 4 espacios. Esto se debe a que existe un //bloque// debajo de la declaración ''label''. En Ren'Py, los //bloques// __necesariamente deben estar sangrados en relación a la declaración anterior__, y todas las declaraciones en un bloque deben estar sangradas por la misma cantidad de caracteres.+>Tené en cuenta que todas las declaraciones ''say'' van sangradas //espacios//. Esto se debe a que existe un //bloque// debajo de la declaración ''label''. En Ren'Py, los //bloques// __necesariamente deben estar sangrados en relación a la declaración anterior__, y todas las declaraciones en un bloque deben estar sangradas por la misma cantidad de //espacios//.
  
-En caso que las cadenas en si contengan caracteres de ''"'', estas deben ser escapadas con una barra invertida ''<nowiki>\</nowiki>''. Por ejemplo:+En el caso que las cadenas contengan en sí caracteres de //comillas// (''"''), estas deben ser escapadas con un caracter de //barra invertida// (''<nowiki>\</nowiki>''). Por ejemplo:
  
  
 <code python> <code python>
-    "Silvia" "¿Alguna vez oíste la famosa frase de Perón, \"El problema con las citas sacadas de Internet, es que muchas de ellas no son genuinas.\"?"+    "Silvana" "¿Alguna vez oíste la famosa frase de Perón, \"El problema con las citas sacadas de Internet, es que muchas de ellas son truchas.\"?"
 </code> </code>
  
-Si bien este guion simple no tiene mucho efectismo, resulta un ejemplo de cuán fácil es lograr algo funcional usando Ren'Py. En breve le agregaremos las imágenes, pero primero veamos cómo se definen los personajes.+Aunque parezca que nuestra novela visual provista de este guion simple no tiene mucho efectismo, resulta un ejemplo que demuestra lo simple que es escribir algo que resulte funcional usando Ren'Py. En breve le agregaremos las imágenes, pero primero veamos cómo definimos los personajes de nuestra historia.
  
-====Personajes====+===Personajes===
  
-Main article: Defining Character Objects+Un problema que tiene este primer ejemplo es que fue necesario ingresar repetidamente el nombre de un personaje toda vez que el mismo habla (tal como si fuese un guion de una obra teatral). Si quisiéramos escribir mucho diálogo en nuestra novela, hacer esto se volvería sumamente tedioso. Por suerte también podemos indicar los nombres de personaje  al iniciar el guion. Para esto tenemos que **definir los personajes por adelantado** según la sintaxis de Ren'Py. Gracias a ello, podremos asociar un //nombre abreviado// al personaje, y cambiar el //color del nombre del personaje//.
  
-Un problema del primer ejemplo es que hace necesario ingresar repetidamente el nombre de un personaje cada vez que el tipo habla (como si fuese un guion de una obra teatral). Si tuviésemos mucho diálogo en nuestro juego, esto se volverá muy molesto en poco tiempo. Es posible también presentar ambos nombres del personaje de la misma manera, con el color identificatorio escogido al iniciar el juego. Para solucionarlo, Ren'Py nos dejará **definir los personajes por adelantado**. Gracias a ello, podremos asociar un //nombre abreviado// al personaje, y cambiar el color del nombre del personaje.+Altera el guión para que quede así:
  
 <code python> <code python>
-define s = Character('Silvia', color="#c8ffc8")+define s = Character('Silvana', color="#c8ffc8")
 define m = Character('Yo', color="#c8c8ff") define m = Character('Yo', color="#c8c8ff")
  
 label start: label start:
  
-    s "¡Como van! ¿Qué tal estuvo la clase?"+    s "¡Como va! ¿Qué tal estuvo la clase?"
  
     m "Buena..."     m "Buena..."
Línea 108: Línea 120:
 </code> </code>
  
-La primera y segunda línea definen personajes. La primer línea define un personaje con el //nombre abreviado// de "s", y su //nombre largo// "Silvia", con un //color de nombre// verdoso (los colores se representan con tripletes hexadecimales rojo-verde-azul, como lo hacen en las páginas web).+¡Ahora será más fácil escribir el diálogo entre los dos personajes!. La primera y segunda línea definen al primero y el segundo personajeVeamos:  
 + 
 +La primer línea define un personaje con el //nombre abreviado// de "s", y su //nombre largo// "''Silvana''", con un //color de nombre// verdoso (los colores se representan con tripletes hexadecimales rojo-verde-azul, como lo hacen en las páginas web).
  
 La segunda línea crea un personaje con el nombre corto "''m''" y el nombre largo "''Yo''". con el color de nombre rojizo. Podés inventar otros personajes copiando una de las líneas de definición de personaje, y cambiándole su //nombre corto//, //nombre largo// y el //color//. La segunda línea crea un personaje con el nombre corto "''m''" y el nombre largo "''Yo''". con el color de nombre rojizo. Podés inventar otros personajes copiando una de las líneas de definición de personaje, y cambiándole su //nombre corto//, //nombre largo// y el //color//.
  
-También cambiamos las declaraciones ''say'' para usar objetos ''Character'' en lugar de una cadena de nombre para un personaje. Esto le permitirá a Ren'Py usar los personajes que le hemos definido.+También modificamos las declaraciones ''say'' para hacer uso de los objetos ''Character'' en lugar de recurrir a la tediosa cadena de nombre para un personaje. 
  
 +>¡Este pequeño trabajo que nos tomamos, le permitirá ahora a Ren'Py usar los personajes que le hemos definido de una forma más abreviada y fácil de escribir!
  
-====Imagenes====+Ver manual: [[https://renpy.org/doc/html/dialogue.html#defining-character-objects|Defining Character Objects]]
  
-Main article: Displaying Images+====Imágenes====
  
 No obtendremos una novela visual si no recurrimos a presentar imágenes en la pantalla. Aquí hay otra escena de "The Question". Esta también incluye declaraciones que muestran imágenes al jugador. Esto puede reemplazar completamente la sección anterior del guion, si lo deseas probar. No obtendremos una novela visual si no recurrimos a presentar imágenes en la pantalla. Aquí hay otra escena de "The Question". Esta también incluye declaraciones que muestran imágenes al jugador. Esto puede reemplazar completamente la sección anterior del guion, si lo deseas probar.
  
 <code python> <code python>
-define s = Character('Silvia', color="#c8ffc8")+define s = Character('Silvana', color="#c8ffc8")
 define m = Character('Yo', color="#c8c8ff") define m = Character('Yo', color="#c8c8ff")
  
Línea 180: Línea 195:
 Las imágenes también pueden ser colocadas en subdirectorios (subcarpetas) contenidas en el directorio de imágenes. El nombre de directorio resultará ignorado y sólo se usará el nombre de archivo para definir el nombre de imágenes. Las imágenes también pueden ser colocadas en subdirectorios (subcarpetas) contenidas en el directorio de imágenes. El nombre de directorio resultará ignorado y sólo se usará el nombre de archivo para definir el nombre de imágenes.
  
 +Ver manual: [[https://renpy.org/doc/html/displaying_images.html|Displaying Images]]
  
 ===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 leaving:+label irse:
  
-    s "I'll get right on it!"+    s "¡Me voy a encargar ahora mismo!"
  
     hide sylvie     hide sylvie
Línea 193: Línea 210:
     "..."     "..."
  
-    m "That wasn't what I meant!"+    m "¡No era eso a lo que me refería!"
 </code> </code>
  
-En realidad es bastante raro usar ''hide''Se puede usar ''show'' cuando un personaje cambia de emociones, mientras que ''scene'' lo usás para el momento en que todos se van. Sólo necesitás usar ''hide'' cuando un personaje abandona la escena, pero el resto de la escena tiene que quedar igual.+En realidad ''hide'' se usa bastante pocoPodé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.
  
-===Declaracion Image===+===Declaración Image===
  
 A veces, puede que no quieras dejar que Ren'Py defina las imágenes automáticamente por sí mismo. Para esto se usa la declaración ''image''. Debería estar en el nivel superior del fichero (sin sangrado y antes de ''label start''), y puede usarse para mapear un nombre de imagen a un fichero de imagen específico. Por ejemplo A veces, puede que no quieras dejar que Ren'Py defina las imágenes automáticamente por sí mismo. Para esto se usa la declaración ''image''. Debería estar en el nivel superior del fichero (sin sangrado y antes de ''label start''), y puede usarse para mapear un nombre de imagen a un fichero de imagen específico. Por ejemplo
Línea 211: Línea 228:
 La declaración ''image'' también puede ser utilizada para llevar a cabo tareas mas complejas, pero esto se tratará aparte. La declaración ''image'' también puede ser utilizada para llevar a cabo tareas mas complejas, pero esto se tratará aparte.
  
-====Transiciones====+===Transiciones===
  
 En el guion anterior, las imágenes aparecen y desaparecen de forma instantánea. Ya que cambiar la locación y hacer que un personaje entre o salga de escena es importante, Ren'Py soporta //transiciones//, que permiten aplicarse cuando los personajes presentan modificaciones. En el guion anterior, las imágenes aparecen y desaparecen de forma instantánea. Ya que cambiar la locación y hacer que un personaje entre o salga de escena es importante, Ren'Py soporta //transiciones//, que permiten aplicarse cuando los personajes presentan modificaciones.
Línea 243: Línea 260:
 </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>
Línea 253: Línea 270:
 </code> </code>
  
-Tanto las imágenes "''bg meadow''" y "''sylvie green smile''" se disolverán al mismo tiempo. Para disolver una 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 una por vez, es necesario programarlo de otra forma, usando dos declaraciones ''with'', de esta manera:
  
 <code python> <code python>
Línea 262: Línea 279:
 </code> </code>
  
-Esto primero disuelve el fondo del prado, y luego disuelve a Sylvie. Si querías mostrar el prado instantáneamente, y luego presentar a Sylvie, 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í:
  
  
Línea 274: Línea 291:
 Aquí se usa ''None'' para indicar una transición especial que actualiza la idea de Ren'Py de que era la pantalla anterior, sin mostrarle nada al jugador. Aquí se usa ''None'' para indicar una transición especial que actualiza la idea de Ren'Py de que era la pantalla anterior, sin mostrarle nada al jugador.
  
-====Posiciones====+Ver manual: [[https://renpy.org/doc/html/transitions.html|Transitions]]
  
-Main article: Transforms+===Posiciones===
  
 Por defecto, las imágenes se muestran centradas horizontalmente, y con su borde inferior tocando el borde inferior de la pantalla. Esto usualmente está bien para fondos y personajes únicos, pero cuando se muestra más de un personaje en la pantalla, probablemente tenga más sentido hacerlo en otra posición. También puede tener sentido reposicionar un personaje según como venga el relato. Por defecto, las imágenes se muestran centradas horizontalmente, y con su borde inferior tocando el borde inferior de la pantalla. Esto usualmente está bien para fondos y personajes únicos, pero cuando se muestra más de un personaje en la pantalla, probablemente tenga más sentido hacerlo en otra posición. También puede tener sentido reposicionar un personaje según como venga el relato.
Línea 284: Línea 301:
 </code> </code>
  
-Para hacer este reposicionamiento, agrega una clásula ''at'' a la declaración ''show''. La cláusula ''at'' recibe una posición, y presenta la imágen en dicha posición. Ren'Py incluye varias posiciones predefinidas: +Para hacer este reposicionamiento, agrega una clausula ''at'' a la declaración ''show''. La cláusula ''at'' recibe una posición, y presenta la imagen en dicha posición. Ren'Py incluye varias posiciones predefinidas: 
 ''left'' para el lado izquierdo de la pantalla, ''right'' para el lado derecho, ''center'' para centrarlo horizontalmente (el valor por defecto) y ''truecenter'' para que la centre horizontalmente y verticalmente. ''left'' para el lado izquierdo de la pantalla, ''right'' para el lado derecho, ''center'' para centrarlo horizontalmente (el valor por defecto) y ''truecenter'' para que la centre horizontalmente y verticalmente.
  
 Los creadores puede incluso definir sus propias posiciones, y hacer eventos con movimientos complejos, pero esto cae por fuera de este tutorial rápido Los creadores puede incluso definir sus propias posiciones, y hacer eventos con movimientos complejos, pero esto cae por fuera de este tutorial rápido
  
-====Música y Sonido====+Ver manual: [[https://renpy.org/doc/html/transforms.html|Transforms]]
  
 +====Música y Sonido====
  
-Main article: Audio 
  
-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 archvio que es interpretado como un fichero de audio que debe ejecutarse. Los ficheros de audio se interpretan en relación al directorio de juevo. 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:
Línea 302: Línea 319:
 </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>
Línea 308: Línea 325:
 </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>
Línea 314: Línea 331:
 </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>
Línea 320: Línea 337:
 </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>
Línea 326: Línea 343:
 </code> </code>
  
-Cuando 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 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:
Línea 334: Línea 351:
 </code> </code>
  
 +Ver manual: [[https://renpy.org/doc/html/audio.html|Audio]]
  
 ====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>
Línea 354: Línea 372:
  
  
-<code pywhon+<code python
-    ".:Good Ending."+    ".:Final Feliz."
  
     return     return
 </code> </code>
  
-Esto es todo lo que tenés que hacer para hacer una novela cinética, un juego sin ningún tipo de opción que seguir en él. Ahora veremos lo que se necesita para hacer que un juego que presente menúes con opciones para que elija el usuario.+>Esto es todo lo que tenés que hacer para hacer una novela cinética, un juego sin ningún tipo de opción que seguir en él. 
  
  
 ====Menús, Etiquetas y Saltos==== ====Menús, Etiquetas y Saltos====
  
-Main articles: In-Game Menus and Labels & Control Flow+Ahora veremos lo que se necesita para hacer que un juego que presente **menúes con opciones para que el usuario elija interactivamente**. Estas permiten trazar diferentes //senderos// o //caminos//, si es que queremos permitir seguir distintos desarrollos arbolados.
  
 La declaración ''menu'' te permite presentar una opción al jugador: La declaración ''menu'' te permite presentar una opción al jugador:
  
 <code python> <code python>
-    s "Surebut what's a \"visual novel?\""+    s "Seguropero ¿qué es una \"novela visual?\""
  
 menu: menu:
  
-    "It's a videogame.": +    "Es un videojuego.": 
-        jump game+        jump juego
  
-    "It's an interactive book.": +    "Es un libro interactivo.": 
-        jump book+        jump libro
  
-label game:+label juego:
  
-    m "It's a kind of videogame you can play on your computer or a console."+    m "Es como un videojuego que jugás en la computadora o en una consola."
  
-    jump marry+    jump casamiento
  
-label book:+label libro:
  
-    m "It's like an interactive book that you can read on a computer or a console."+    m "Es como un libro interactivo que leés en una computadora o una consola."
  
-    jump marry+    jump casamiento
  
-label marry:+label casamiento:
  
-    "And sowe become a visual novel creating duo."+    "Y de esta maneranos volvimos un dúo creador de novelas visuales."
 </code> </code>
  
 Este ejemplo presenta un menú que puede usarse con Ren'Py. La declaración ''menu'' introduce una selección dentro del juego. Requiere un bloque de líneas sangradas, cada una consiste en una cadena seguida por dos puntos ('':''). Estas serán las opciones del menú, que se le presentarán al jugador. Cada opción del menú requiere su propio bloque de líneas sangradas, que se ejecutan cuando se eligen dicha opción del menú. Este ejemplo presenta un menú que puede usarse con Ren'Py. La declaración ''menu'' introduce una selección dentro del juego. Requiere un bloque de líneas sangradas, cada una consiste en una cadena seguida por dos puntos ('':''). Estas serán las opciones del menú, que se le presentarán al jugador. Cada opción del menú requiere su propio bloque de líneas sangradas, que se ejecutan cuando se eligen dicha opción del menú.
  
-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 etiqueda 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.jpg?200 |}}
  
-En el ejemplo anterior, luego de que Silvie 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 ''marry''.+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.
  
-====Flags de apoyo usando las declaraciones Default, Python e If====+Ver manual: [[https://renpy.org/doc/html/menus.html|In-Game Menus]] y [[https://renpy.org/doc/html/label.html|Labels & Control Flow]]
  
-Main articles: Python Statements and Conditional Statements+==== Integración de Python====
  
-Si bien podés hacer algunos juegos simplemente usando las declaraciones ya indicadas, otros juegos requieren almacenar datos 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 guión, y actuar en la opción más adelante. Esta es una de las razones por la cual Ren'Py tiene 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.
  
-Aquí le mostraremos como almacenar un //flag// que contiene información sobre una opción que el jugador hizo. Para inicializar el flag, se usa la declaración ''default'', antes de la etiqueta ''label start''+===Flags de apoyo usando las declaraciones Default, Python e If=== 
 + 
 +Aprenderás aquí cómo almacenar un valor en un //flag//que contendrá información sobre una elección escogida por el jugador a lo largo de la trama. Para inicializar el flag, se usa la declaración ''default'', antes de la etiqueta ''label start'', por ejemplo:
  
 <code python> <code python>
-# True if the player has decided to compare a VN to a book+# True si el jugador ha decidido comparar las novelas visuales con un libro
-default book = False+default libro = False
  
 label start: label start:
  
-    s "Hi thereHow was class?"+    s "¡Como van¿Qué tal estuvo la clase?"
 </code> </code>
  
-El flag ''book'' comienza apagada inicializada al valor especial ''False'' (como  con el resto de Ren'Py, es importante el uso de la mayúscula), lo que significa que no está activada. Si se elige la senda ''book'', podemos ponerla en ''True'' usando una declaración de asignación de Python.+De esta forma, el flag ''libro'' comienza inicializado de forma apagada (con al valor especial ''False'', recuerda que como  con el resto de Ren'Py, es importante definirlo usando la primer letra en mayúscula). Esto significa que está desactivada. Si el jugador escoge la senda ''libro'', podemos poner el flag en ''True'' recurriendo una [[tutorial_de_python#variables|declaración de asignación de Python]], de la siguiente forma:
  
 <code python> <code python>
-label book:+label libro:
  
-    $ book = True+    $ libro = True
  
-    m "It's like an interactive book that you can read on a computer or a console."+    m "Es como un libro interactivo que leés en una computadora o un celular."
  
-    jump marry+    jump casamiento
 </code> </code>
  
-Las líneas que comienzan con ''$'' son interpretadas como declaraciones de Python. La declaración de asignación utilizada aquí asigna un valor a una variable. Ren'Py soporta otras formas de incluir Python, tales como las declaraciones multilíneas de Python, que se discuten en otras secciones del manual. Ren'Py soporta Python 2.7, aunque recomendamos escribir Python que corra en Python 2 y Phyton 3.+Fijate que __todas las líneas que comienzan con el caracter ''$'' son interpretadas como declaraciones de Python en lugar de declaraciones de Ren'Py__. La declaración de asignación de Python que utilizamos aquí asigna un valor a una variable. 
  
-Para revisar el flag, isamos la declaración ''if'':+>Ren'Py soporta otras formas para incluir Python, tales como las [[tutorial_de_python#tuplas|declaraciones multilíneas (tuplas) de Python]], que se discuten en otras secciones del manual. Ren'Py soporta Python 2.7, aunque recomendamos escribir Python que corra en Python 2 y Phyton 3. 
 + 
 +Para revisar el valor que tiene almacenado el flag, recurrimos la [[tutorial_de_python#if|declaración ''if'']]:
  
 <code python> <code python>
-if book:+if libro:
  
-    "Our first game is based on one of Sylvie'ideas, but afterwards I get to come up with stories of my own, too."+    "Nuestro primer juego se basó en las ideas de Silvanapero luego se me ocurrieron historias propias también."
 </code> </code>
  
-Si la condición es verdadera, se ejecutará el bloque del guión. Si no lo es, se lo salteará. La declaración ''if'' también puede recibir una cláusula ''else'' que introduce un bloque de guion que se ejecuta si la condición es falsa.+Si la condición es ''True'' (verdadera), se ejecuta el bloque del guión. Si no lo es, se la salteará. La declaración ''if'' puede recibir una cláusula ''else'' opcional, la cual introduce un bloque de guion alternativo que se ejecuta si la condición es ''False'' (falsa).
  
 <code python> <code python>
-if book:+if libro:
  
-    "Our first game is based on one of Sylvie'ideas, but afterwards I get to come up with stories of my own, too."+    "Nuestro primer juego se basó en las ideas de Silvanapero luego se me ocurrieron historias propias también."
  
 else: else:
  
-    "Sylvie helped with the script on our first video game."+    "Silvana ayudó con el guion de nuestro primer videojuego."
 </code> </code>
  
-Las variables de Python no necesitan ser valores simples ''True''/''False''Podés usar variables para almacenar el nombre del jugador, los puntajes, o para cualquier otro propósito. Ya que Ren'Py incluye la habilidad de usar todo el lenguaje de programación Python, es posible hacer muchas cosas.+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 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]] 
 + 
 +====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.
  
 ====Ficheros en Plantilla==== ====Ficheros en Plantilla====
  
-La carpeta ''game'' en el proyecto creado incluirá las siguientes carpetas y ficheros:+En la carpeta ''game'' del tus proyectos creados, se incluirá las siguientes carpetas y ficheros:
  
 +|''script.rpy'' |Este es el archivo pensado para incluir otros guiones que incluyen un escenario. También podeés agregar o borrar cualquier .rpy. |
 +|''*.rpyc'' | Estos ficheros son resultados de la compilación de cada fichero .rpy para reducir el tiempo de carga. No necesitás editar estos archivos sin borrar el fichero .rpy correspondiente. |
 +|''gui.rpy'' |Las variables de GUI se definen acá. |
 +|''options.rpy'' |Variables Config y Build, una parte de preferencias y una parte de la GUI de definen acá. |
 +|''screens.rpy'' |Las pantallas se definen en este fichero. Deberías editar esto para customizar la GUI en un sentido mas avanzado. |
 +|''audio/'' |Este directorio está pensado para incluir los ficheros de audio. |
 +|''cache/'' |Este directorio incluye los ficheros de caché. No necesitas editar estos ficheros. |
 +|''gui/'' |Este directorio incluye imágenes usadas por la GUI. |
 +|''images/'' |Esta carpeta está pensada para incluir ficheros de imágenes. |
 +|''tl/'' |Este directorio incluye archivos de traducción. |
  
-| ''audio/'' | This folder is intended to include audio files. See Audio for more details. | 
-| ''cache/'' | This folder includes cache files. You don't need to edit those files. | 
-| ''gui/'' | This folder includes images which are used by the gui. See the GUI Customization Guide for more details. | 
-| ''images/'' | This folder is intended to include images files. See Displaying Images for more details. | 
-| ''tl/'' | This folder includes translation files. See Translation for more details. | 
-| ''gui.rpy'' | The gui variables are defined in this file. See the GUI Customization Guide for more details. | 
-| ''options.rpy'' | Config and Build variables, a part of preferences and a part of gui variables are defined in this file. See Configuration Variables, Preference Variables, Building Distributions and the GUI Customization Guide for more details. | 
-| ''screens.rpy'' | Screens are defined in this file. You should edit this for more advanced gui customization. Also see Styles, Style Properties, Screens and Screen Language, Screen Actions, Values, and Functions, Special Screen Names and Screen Language Optimization for more details. | 
-| ''script.rpy'' | This file is intended to include other scripts which include a scenario. You can also add or delete any .rpy. See Language Basics for more details. | 
-| ''*.rpyc'' | Those files are result of compiling each .rpy files to reduce loading time. You don't need to edit those files without deleting the corresonding .rpy file. See Language Basics for more details. | 
  
  
-====Lanzando tu juego====+====Crear tu propio juego====
  
-Una vez que hiciste un juegoexisten varias cosas que podés hacer antes de publicarlo:+Como vesel ambiente Ren'Py es lo suficientemente sencillo como para poder recurrir a hacer tus propios personajes, historias, senderos de aventura, retruécanos y relatos. 
  
 +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!
  
-Check for a new version of Ren'Py.+Una vez que hiciste un juego, existen varias cosas que podés hacer antes de publicarlo:
  
-    New versions of Ren'Py are released on a regular basis to fix bugs and add new features. Before releasing, you'll want to click update in the launcher to update Ren'Py to the latest version. You can also download new versions and view a list of changes at https://www.renpy.org/latest.html.+==Revisar tu guion==
  
-    Rarelychanges to Ren'Py will require you to make a change to your game's scriptIncompatible Changes has a list of these changes. +Desde la primer página del Lanzadorelegi "Revisar guion (Lint)"Esto depurará tu juego en busca de errores potencialesYa 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.
-Check the Script.+
  
-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.+==Revisar versiones nuevas de Ren'Py==
  
-====Compilar distribuciones====+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.
  
-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.+Raramente los cambios a Ren'Py requieren que hagas cambios en el guion de tu juego. Los cambios incompatibles se listan allí.
  
-===Probarlo===+==Compilar distribuciones==
  
-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.+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. 
 + 
 +==Probar el juego compilado== 
 + 
 +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.
          
 ===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!
- 
-====Guion de The Question==== 
- 
- 
-Podés ver el guion completo de ''[[script.rpy|The Question]]'' aqui. 
  
 ====Conclusión==== ====Conclusión====
Línea 516: Línea 551:
 Este Tutorial apenas cubre lo básico de lo que es capaz de hacer Ren'Py. Para hacerlo fácil y breve, omitimos muchas funcionalidades que soporta Ren'Py y simplificamos otras, enfocándonos en un conjunto mínimo de funcionalidades necesarias para emprender una novela visual. Este Tutorial apenas cubre lo básico de lo que es capaz de hacer Ren'Py. Para hacerlo fácil y breve, omitimos muchas funcionalidades que soporta Ren'Py y simplificamos otras, enfocándonos en un conjunto mínimo de funcionalidades necesarias para emprender una novela visual.
  
-Si te interesa aprender mas, aprovechá para leer el [[|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!
  

Este sitio web utiliza cookies para guardar datos esenciales de su actividad, como su autenticación. Al entrar acepta el uso de cookies.

Más información