Herramientas de usuario

¡Esta es una revisión vieja del documento!


Tutorial de Ren'Py

Bienvenid@ al Tutorial de Ren'Py. El propósito de este tutorial es demostrar como hacer un juego en Ren'py en unos pocos pasos.

El lanzador de Ren'Py

Antes de empezar a hacer 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.

Empezar

Para empezar tendrás que instalar Ren'Py.

Lanzador Renpy

El lanzador está traducido a varios idiomas. Para elegir uno, elegí preferencias en la esquina inferior derecha, y elegí Español.

Elegir y lanzar un Proyecto

Primero deberías ver que apariencia tiene el juego The Question. Para hacer esto, empezá con el lanzador renpy, y elegí The Question desde la primer pantalla. Elegí Lanzar Proyecto para ejecutar The Question.

Podés volver a la demo de Ren'Py haciendo lo mismo, pero eligiendo “Tutorial” en lugar de “The Question”.

Iniciar un Proyecto Nuevo

Crea un nuevo proyecto

Podés crear un nuevo proyecto eligiendo “Crear Nuevo Proyecto” en el lanzador de RenPy.

Si esta esa tu primera vez creando un proyecto, Ren'Py puede pedirte que elijas el directorio de proyectos. Este será el directorio (también llamado carpeta) donde se crean los nuevos proyectos, y se lo revisará para buscar proyectos ya existentes. El Selector de directorios puede apracer debajo de RenPy, de modo que asegurate de revisarlo por si está allí.

El lanzador pedirá un nombre de proyecto. Elegiremos algo como “Mi Opción”, y apretamos Enter.

Acto seguido el lanzador preguntará la resolución del proyecto. 1280×720 es un buen compromiso entre tamaño de juego y calidad de imagen. Para el proósito de este tutorial, le elegimos 1280×720 para que coincida con el arte del juego “The Question”, y apretamos Continuar.

El lanzador pedirpa que elijamos un esquema cromático (un color de fondo y de acentos para la interfaz de usuario). No importa en este momento, así que elegí algún color lindo, y dale “Continuar”.

En este momento RenPy procesará lo indicado, y te dará una plantilla simple de juego. La plantilla usa arte y texto “de quita y pon”, pero funcionará, y soporta las funcionalidades esperadas como retroceder, cargar, y guardar jugadas. Elegí “lanzar proyecto” para ejecutarlo.

Un juego simple

label start:
 
    "Sylvie" "Hi there! How was class?"
 
    "Me" "Good..."
 
    "I can't bring myself to admit that it all went in one ear and out the other."
 
    "Me" "Are you going home now? Wanna walk back with me?"
 
    "Sylvie" "Sure!"

Este es un juego de renpy muy simple. No incluye ninguna imagen ni música, pero muestra una conversación entre dos personajes, y una línea de narración.

Para probarlo, desde la parte superior de la pantalla selcciona “My Question”, y lueego elegí “script.rpy” desde Editar Archivo. Si es tu primera vez, RenPy pedirá que selecciones un Editor (recomendamos Editra para los creadores iniciales) y descargará el editor que elijas). Luego abrirá el archivo de gion en el editor.

Una vez que se abra el editor, borra todo en script.rpy. Vamos a empezar de cero, de modo que no necesitamos nada de lo que tiene escrito. Copiá el ejemplo de arriba en script.rpy y grabalo.

Ahora estamos listos para correr este ejemplo. Volvemos al lanzador y elegimos “Lanzar Proyecto”. RenPy comenzará. Fijate como - sin ningún trabajo extra - Renpy te da los menús que te dejan cargar y grabar la partida, y cambiar varias preferencias. Cuando estamos listos, apretamos “Lanzar Proyecto” y jugamos este juego de ejemplo.

Este ejemplo muestras algunas declaraciones comunes del lenguaje Ren'Py.

La primer línea es una declaración label. La declaración label se usa para dar etiquetar un lugar en el programa. En este caso, creamos una etiqueta llamada start. La etiqueta start es especial, porque determina donde empiezan los guiones de RenPy al presionar Empezar Juego en el menú principal.

Las otras líneas son declaraciones say. Existen dos formas de declaración say:

  • una cadena (comienza con comillas , contiene caracteres, y termina con comillas , todo en una sola línea. Esta se usa para narración o énsamientos del personaje principal.
  • dos cadenas, usadas para diálogos, donde la primer cadena es un nombre de personaje y la segunda es lo que dice dicho personaje.

Tené en cuenta que todas las declaraciones say están sangradas 4 espacios. Esto es porque hay un bloque debajo de la declaración label. En Ren'Py, los bloques deben estar sangrados en relación a la declaración anterior, y todas las declaraciones en un bloque deben estar indentadas por la misma cantidad.

Cuando las cadenas contienen caracteres de en sí, estos caracteres tienen que ser escapados con una barra invertida /. Por ejemplo:

    "Sylvie" "Did you ever hear Lincon's famous saying, \"The problem with Internet quotations is that many of them are not genuine.\""

Si bien este juego simple no tiene mucho para ver, es un ejemplo de cuán fácil es lograr algo funcional en Ren'Py. Agregaremos las imágenes en breve pero primero, veamos cómo definir los personajes.

Personajes

Main article: Defining Character Objects

Un problema del primer ejemplo es que necesita que ingresemos repetidamente el nombre de un personaje cada vez que el tipo habla. En un juego con mucho diálogo, esto se hace muy pesado. También, se presentan ambos nombres del personaje de la misma manera, con el color de acento elegido al iniciar el juego. Para solucionarlo, Ren'Py te deja definir los personajes por adelantado. Esto permite asociar un nombre corto con el personaje, y cambiar el color del nombre del personaje.

define s = Character('Sylvie', color="#c8ffc8")
define m = Character('Me', color="#c8c8ff")
 
label start:
 
    s "Hi there! How was class?"
 
    m "Good..."
 
    "I can't bring myself to admit that it all went in one ear and out the other."
 
    s "Are you going home now? Wanna walk back with me?"
 
    m "Sure!"

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 “Sylvie”, con un nombre de color verdoso (los colores son representados en triples hexadecimales rojo-verde-azul, como en las páginas web).

La segunda línea crea un personaje con el nombre corto ”m“ y el nombre largo ”Me“. con el nombre indicado en color rojizo. Podés crear otros personajes copiando una de las líneas del personaje, y cambiando su nombre corto, nombre largo y su color.

También cambiamos las declaraciones say para usar objetos personaje en lugar de una cadena de nombre de un personaje. Esto le dirá a Ren'Py usar los personajes que definimos.

Imagenes

Main article: Displaying Images

No tendremos 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.

define s = Character('Sylvie', color="#c8ffc8")
define m = Character('Me', color="#c8c8ff")
 
label start:
 
    scene bg meadow
 
    "After a short while, we reach the meadows just outside the neighborhood where we both live."
 
    "It's a scenic view I've grown used to. Autumn is especially beautiful here."
 
    "When we were children, we played in these meadows a lot, so they're full of memories."
 
    m "Hey... Umm..."
 
    show sylvie green smile
 
    "She turns to me and smiles. She looks so welcoming that I feel my nervousness melt away."
 
    "I'll ask her...!"
 
    m "Ummm... Will you..."
 
    m "Will you be my artist for a visual novel?"
 
    show sylvie green surprised
 
    "Silence."

Este segmento de guion introduce dos nuevas declaraciones. La declaración scene en la línea 6 borra todas las imágenes y muestra solamente una imagen de fondo. Las declaraciones show de las líneas 16 y 26 hacen aparecer en pantalla un sprite (una gráfica activable) encima del fondo, y modifican este sprite, respectivamente.

En Ren'Py, cada imagen tiene un nombre. El nombre consiste de una etiqueta, y opcionalmente de uno o más atributos. Tanto la etiqueta como los atributos deben comenzar con una letra, y contener letras, números y guiones bajos. Por ejemplo.

  En la declaración ''scene'' de la línea 6, la etiqueta es "''bg''" y el atributo es "''meadow''". Por convención, las imágenes de fondo usan la etiqueta "''bg''" (por "background", o "fondo" en inglés).
  En la primer declaración ''show'' en la línea 16, la etiqueta es "''sylvie''", y los atributos son "''green''" y "''smile''".
  En la segunda declaración ''show'' de la línea 26, la etiqueta es "''sylvie''" y los atributos son "''green''" y "''surprised''".

En cada momento dado, sólo puede aparecer una imagen con una etiqueta dada. Al presentarse una segunda imagen del mismo nombre, esta reemplaza a la primera (tal como sucede en la línea 26 del guión).

Ren'Py buscará el fichero de imagen en el directorio de imágenes, que puede localizarse seleccionando “Imagenes” en la sección “Abrir Directorio” del lanzador. Ren'Py espera que el arte de personajes se encuentre en formato PNG, WEBP, o AVIF, mientras que el arte de fondo de estar en JPG, JPEG, PNG, WEBP, o AVIF. También están soportados los archivos SVG, pero fundamentalmente se los utiliza para personalizar la interfaz. Es muy importante el nombre de archivo - ya que la extensión no se usa, el nombre de archivos se convierte forzadamente a minúsculas, y eso se usa como nombre de la imagen.

Por ejemplo, los siguientes archivos - localizados en el directorio de imágenes - definen las siguientes imágenes:

  "bg meadow.jpg" -> bg meadow
  "sylvie green smile.png" -> sylvie green smile
  "sylvie green surprised.png" -> sylvie green surprised

Ya que los nombres de archivo están en minúscula, también se mantiene lo siguiente:

  "Sylvie Green Surprised.png" -> sylvie green surprised

Las imágenes también pueden ser puestas en subdirectorios (subcarpetas) contenidas en el directorio de imágenes. El nombre de directorio se ignorará y sólo el nombre de archivo se usa para definir el nombre de imágenes.

Declaración Hide

Ren'Py también soporta una declaración hide, que oculta una imagen dada.

label leaving:
 
    s "I'll get right on it!"
 
    hide sylvie
 
    "..."
 
    m "That wasn't what I meant!"

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.

Declaracion 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

image logo = "renpy logo.png"
image eileen happy = "eileen_happy_blue_dress.png"

La declaración image se ejecuta al tiempo de inicio, antes que label start y el resto del gion del juego que interactúa con el jugador.

La declaración image también puede ser utilizada para llevar a cabo tareas mas complejas, pero esto se tratará aparte.

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.

Las transiciones cambian lo que se muestra, desde lo que sucedía al final de la última interacción (diálogo, menú o transición - entre otras declaraciones) a la apariencia luego de que se han ejecutado las declaraciones scene, show y hide.

label start:
 
    scene bg meadow
    with fade
 
    "After a short while, we reach the meadows just outside the neighborhood where we both live."
 
    "It's a scenic view I've grown used to. Autumn is especially beautiful here."
 
    "When we were children, we played in these meadows a lot, so they're full of memories."
 
    m "Hey... Umm..."
 
    show sylvie green smile
    with dissolve
 
    "She turns to me and smiles. She looks so welcoming that I feel my nervousness melt away."
 
    "I'll ask her...!"
 
    m "Ummm... Will you..."
 
    m "Will you be my artist for a visual novel?"

La declaración with recibe el nombre de la transición que 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.

Cuando se coloca una transición después de múltiples declaraciones scene, show o hide, se aplicará a todas ellas a la vez. Si escribís:

    scene bg meadow
    show sylvie green smile
    with dissolve

Tanto las imagenes ”bg meadow“ y ”sylvie green smile“ se disolverán al mismo tiempo. Para disolver una por vez, tenés que programarlo usando dos declaraciones with:

    scene bg meadow
    with dissolve
    show sylvie green smile
    with dissolve

Esto primero disuelve el fondo del río, y luego disuelve a sylvie. Si quería mostrar el río instantáneamente, y luego presentar a sylvie, podías programarlo así:

    scene bg meadow
    with None
    show sylvie smile
    with dissolve

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

Main article: Transforms

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.

     show sylvie green smile at right

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: 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

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.

Por ejemplo:

    play music "audio/illurock.ogg"

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).

    play music "audio/illurock.ogg" fadeout 1.0 fadein 1.0

La declaración queue music reproduce un fichero de audio después que el fichero de audio actual terminal

    queue music "audio/next_track.opus"

Podés parar la música con la declaración stop music, que también puede recibir una cláusula fadeout opcional.

    stop music

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).

    play sound "audio/effect.ogg"

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.

Por ejemplo, si tenés el archivo de audio game/audio/illurock.ogg, podés programar:

    play music illurock

Declaración pause

La declaración pause hace que Ren'Py haga una pausa hasta hacer clic con el mouse.

    pause

Si le indicás un número, la pausa finalizará sola cuando transcurran dicho número de segundos.

    pause 3.0

Finalizar el juego

Podés finalizar el juego con la declaración return, sin tener que llamar a nada. Antes de hacere esto, es mejor poner algo en el juego que indique que el juego terminó, y tal vez dando un número de finalización o un nombre de finalización al usuario.

    ".:. Good Ending."
 
    return

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.

Main articles: In-Game Menus and Labels & Control Flow

La declaración menu te permite presentar una opción al jugador:

    s "Sure, but what's a \"visual novel?\""
 
menu:
 
    "It's a videogame.":
        jump game
 
    "It's an interactive book.":
        jump book
 
label game:
 
    m "It's a kind of videogame you can play on your computer or a console."
 
    jump marry
 
label book:
 
    m "It's like an interactive book that you can read on a computer or a console."
 
    jump marry
 
label marry:
 
    "And so, we become a visual novel creating duo."

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 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.

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.

Flags de apoyo usando las declaraciones Default, Python e If

Main articles: Python Statements and Conditional Statements

Si bien podés hacer algunos juegos simplemente usando las declaraciones ya indicadas, otros juegos requieren almacenar datos y 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.

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

# True if the player has decided to compare a VN to a book.
default book = False
 
label start:
 
    s "Hi there! How was class?"

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.

label book:
 
    $ book = True
 
    m "It's like an interactive book that you can read on a computer or a console."
 
    jump marry

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.

Para revisar el flag, isamos la declaración if:

if book:
 
    "Our first game is based on one of Sylvie's ideas, but afterwards I get to come up with stories of my own, too."

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.

if book:
 
    "Our first game is based on one of Sylvie's ideas, but afterwards I get to come up with stories of my own, too."
 
else:
 
    "Sylvie helped with the script on our first video game."

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.

Ficheros en Plantilla

La carpeta game en el proyecto creado incluirá las siguientes carpetas y ficheros:

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

Una vez que hiciste un juego, existen varias cosas que podés hacer antes de publicarlo:

Check for a new version of Ren'Py.

  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.
  Rarely, changes to Ren'Py will require you to make a change to your game's script. Incompatible Changes has a list of these changes.

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.

Compilar distribuciones

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.

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

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)

¡Felicitaciones! ¡Publicaste tu primer novela visual!

Guion de The Question

Podés ver el guion completo de The Question aqui.

Conclusión

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

¡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