Tutorial de programación Ren'Py

lunes, 18 de mayo de 2015
Antes de empezar:

Sólo hay 2 requerimientos para comenzar con este tutorial:

Tienes que descargar Ren'Py e instalarlo.
2. Tener al menos una idea de lo que quieres contar. No hace falta que tengas un esquema completo, o que tengas todos los personajes hechos. Pero al menos deberías tener una idea básica de al menos dos personajes, un escenario y algo con que comenzar la trama.

Eso es. Ahora estás listo para comenzar.


Pensando en Ren'Py:
Ren'Py es probablemente el método más sencillo para escribir una novela gráfica que existe. Aún así, mucha gente tiene miedo cuando mira el script de Ren'Py por primera vez. ¿Cómo es posible?
La respuesta es simple: Ren'Py está diseñado para crear novelas gráficas completas lo más sencillo posible. No está diseñado para crear novelas gráficas iniciales lo más sencillo posible. ¿Cuál es la diferencia? Una novela gráfica es una larga y compleja historia. Una herramienta sencilla para proyectos pequeños se interpone a la hora de hacer proyectos más grandes. Piensa en una paleta de mano y en una pala: Si quieres plantar una flor en una maceta, la paleta de mano servirá para el propósito. Pero si tú quieres plantar un árbol en un agujero en el jardín, con la pala terminarás mucho antes que con una paleta de mano. No es que uno de ellos sea más útil que el otro: Son útiles para los problemas a los que se enfrentan cada uno.
Y no nos engañemos: escribir una novela gráfica es como plantar un árbol. Una novela gráfica que transcurre en media hora puede contener sin problemas unas 10.000 palabras y varias ramas. Escribir una historia con 10.000 palabras y con múltiples ramas y que se recombinen es todo un trabajo. Muchos juegos hechos con Ren'Py tiene como 30.000 palabras. Novelas gráficas hechas por profesionales tienen más de 100.000 palabras. Eso sí que es trabajo de verdad.
El objetivo de Ren'Py es que se requiera el menor trabajo extra que sea posible. Por eso Ren'Py puede parecer complicado al principio. Las características de Ren'Py de poder encargarse sin dificultad de una novela gráfica de 50.000 palabras puede parecerte inútil cuando solamente llegues a las 50. Pero si continúas, verás que tarde o temprano te resultará incluso necesario.
Así que, a pesar de que Ren'Py pueda parecer complicado al principio, confía en que Ren'Py es la herramienta más sencilla para escribir una novela gráfica. Principalmente porque cuando comiences, vas a estar batallando con la trama, los personajes, las elecciones y sus ramas. Entonces es cuando te acostumbrarás al script de Ren'Py, tanto que ni siquiera lo notarás.

Espacios y bloques:

El mayor problema con los ordenadores y por consiguiente con Ren'Py, es que no son inteligentes. Los ordenadores no pueden comprender la comunicación humana, así que tenemos que hacer que el ordenador nos entienda. Sabemos que no es justo, pero en cualquier relación, el que menos tiene que perder, gana. Y como el ordenador es un objeto inanimado, no tiene nada que perder.

Así que tendremos que averiguar otros métodos para comunicarnos con el ordenador y que nos entienda. Realmente no es tan difícil. Por ejemplo, usaremos variables para mantener valores. Además estamos acostumbrados a darle nombres a cualquier cosa, así que no nos va a complicar mucho la tarea. Escribiendo algo así:

$ regalo = "traje de baño"

es un poco raro, pero es una manera formalizada de lo que vamos a hacer. En este caso, es como decir "Voy a regalarle un traje de baño a mi novia" exceptuando que más que español o inglés, es "ordenadorés".

Hasta ahí bien, pero el principal problema de comunicarnos con el ordenador es el contexto. Estamos tan acostumbrado a ello que casi ni le damos importancia. Es como cuando dices "Me he comido un dulce" y "Es una persona muy dulce", sabes que en el primer caso, con dulce, se refiere a un postre y en el segundo caso se refiere a que es una persona amable y cariñosa por ejemplo. Lo conoces gracias al contexto: Normalmente un Dulce te lo comes, y no es que comas amabilidad o cariño, mientras que en el segundo caso una persona no puede ser un postre. Los ordenadores no entienden de contexto, así que tendremos que buscar maneras de engañarle.


Ren'Py usa espacios para solucionar este problema. Estos espacios se colocan al principio de la frase. Por ejemplo:

"Esta línea no tiene espacios."
    "Esta línea tiene 4 espacios."
        "Esta línea tiene 8 espacios."
    "Esta línea tiene también 4 espacios."
            "Y Esta línea tiene 12 espacios."
"Finalmente esta línea no tiene espacios."


En Ren'Py, usamos esto para darle contexto al motor Ren'Py, y así puede saber a qué nos referimos. Todas las declaraciones dentro de un mismo (o mayor) número de espacios están en el mismo contexto. Nosotros le llamamos a esto "bloques". Por ejemplo, ahora hablaremos sobre el "bloque initi". Esto indica las líneas que están incluídas en la declaración init:

init:
    # Esta línea está en el bloque init
    # Esta línea también está en el bloque init
# Pero esta línea NO está en el bloque init


Los menú:

menu:
    "Elección 1":
        "Éste es el resultado de escoger la Elección 1"
        bob "Hola Sarah."
        sarah "Hola Bob."
    "Segnda elección":
        "Éste es el resultado de escoger la segunda elección."
    "La tercera opción":
        "Este es el resultado de escoger la tercera elección"
        bob "¿Qué pasa, Sarah?"
        sarah "Yo yo yo."
    "La cuarta opción no hace nada si la escoges":
        pass
    "La quinta opción es un poco diferente":
        bob "Hola Sarah. ¿Podrías dejarme el número de teléfono de tu hermana?"
        sarah "Mmm, ella no tiene teléfono."

Las elecciones a base de menús pueden ser tan largas como quisieras, mientras quepan en la pantalla. También las consecuencias de cada una de ellas pueden ser tan largas como quisieras sin restricción ninguna. Cada línea con la consecuencia de la acción debe tener el número de espacios necesarios para que entren en la elección.

Definir personajes:

Los personajes en Ren'Py son objetos muy poderosos. Y aún así, son muy sencillos de dominar. La forma más básica de definir un personaje es:

init:
    $ jane = Character("Jane")

En la práctica, es extremadamente simple. Por eso deberías elegir un color para el nombre del personaje. Lo puedes conseguir con el típico color hexadecimal: #rrggbb. Para hacer que el nombre de Jane aparezca en verde, haremos esto:

init:
    $ jane = Character("Jane", color="#009900")

Otra cosa común es que quizás quieras que lo que digan en el texto también aparezca con otro color. Esto hace que tanto su etiqueta como lo que dice Jane aparezca en verde:

init:
    $ jane = Character("Jane", color="#009900", what_color="#009900")

Cuando tengamos que definir personajes con más de una línea, es buena idea hacer que el nombre del personaje sea lo más corto posible. Así que en vez de:

init:
    $ jane = Character("Jane")

Sería mejor poner:

init:
    $ j = Character("Jane")

Te ahorrará tiempo a la hora de escribir, y seguirá siendo legible a la hora de editar tu historia.

Cuando vayas a definir a más de un personaje, no olvides que sólo pueden estar en el bloque init, así que no hace falta que hagas un bloque init por cada personaje:

init:
    $ j = Character("Jane")
    $ a = Character("Adam")
    $ s = Character("Sara")


Label o etiquetas:

Ahora mismo necesitas saber que cada script de Ren'Py debe tener un label llamado "start". Así es como Ren'Py comienza a ejecutar tu historia. Es algo como esto:

label start:

Generalmente, el comienzo de un script sencillo de Ren'Py podría ser:

init:
    $ j = Character("John")

label start:
    j "¡Hola mundo!"


Imágenes:

Puedes crear una imagen en Ren'Py a partir de un color sólido o una imagen.

init:
    image negro = "#000000"
    image bg parque = "parque.jpg"
    image eileen alegre = "eileen1.png"
    image eileen triste = "eileen2.png"
    image eileen sorprendida = "eileen3.png"

Como puedes observar, los nombres de las imágenes pueden ser varias palabras. Ya hablaremos de por qué es tan útil cuando lleguemos a la sección de esconder imágenes. Los nombres de las imágenes y los personajes no tienen nada que ver, así que puedes reutilizar los nombres de los personajes como imágenes

Scene y Show:

El comando scene statement quita en la pantalla de lo que hay y opcionalmente coloca un nuevo fondo en la pantalla:

scene bg parque

(Ten en cuenta que "bg parque" es el nombre de la imagen; bg no s una palabra clave.)

Los gráficos de los personajes y otros objetos se muestran con show statement:

show eileen alegre

La declaración show sin ningún modificador coloca la imagen en el centro. También puedes mostrar imágenes en los lados:

show eileen alegre at right

show eileen alegre at left

Primero, puedes ocultar explícitamente un gráfico:

hide eileen


Ejemplo:

scene bg parque with fade
show eileen alegre with dissolve
show ted alegre at left with dissolve


Adornando el texto:

Puedes añadir adornos al texto usando etiquetas de texto:

"Las etiquetas de texto te permiten añadir un efecto al texto, como 
{i}cursiva{/i} o {b}negrita{/b}."


Recordar las elecciones del jugador:

Se puede recordar las elecciones de los usuarios asignando variables. Por ejemplo:

menu:
    "Comprar una Iguana":
        $ regalo = "iguana"
        b "¡Me llevaré una iguana!"
    "Comprar una Serpiente Cascabel":
        $ regalo = "serpiente cascabel"
        b "Me llevaré una Serpiente Cascabel!"
    "Comprar una Tortuga":
        $ regalo = "tortuga"
        b "¡Déjeme la tortuga más lenta que tenga, por favor!"



Fíjate en que solamente hay un "=" para asignar una variable.

Más tarde en el juego, puedes usar if statement para cambiar el guión basado en la elección anterior:

b "Ábrelo, Mary."
if regalo == "iguana":
    m "¡Oh Bob, siempre he querido una iguana!"
if regalo == "serpiente cascabel":
    m "¡Oh Bob, siempre me han encantado las serpientes cascabeles! ¡Muchísimas gracias!"
if regalo == "tortuga"
    m "¡Bob! ¡Es tan lenta...! ¡Te quiero!"

Ahora fíjate que se usa "==" para reflejar igualdad.

Puedes llamar como quieras a las variables, siempre y cuando no creen conflicto con alguna palabra clave o con un personaje. La única regla es que debes asignar primero la variable antes de usarla en una condicional.

2 comentarios: