Mejorar diálogos con efectos, formatos y línea de tiempo en Ren'Py

¡Hola, creadores de novelas visuales! Bienvenidos a la quinta entrada de esta guía de Ren'Py en español. En el [post anterior] aprendimos a cortar sprite sheets en Photopea para preparar nuestros personajes. Hoy nos enfocaremos en hacer que los diálogos sean más dinámicos y expresivos usando **líneas de tiempo**, **formatos** y **efectos visuales** (como texto que tiembla para reflejar miedo). También te daré consejos para declarar estos efectos sin que Ren'Py falle. ¡Empecemos!

#### 1. Configurar la escena base
Vamos a usar el fondo de la playa y los personajes Perrito y Gatita que ya conocemos. Si no tienes los archivos, revisa los posts anteriores para descargarlos.

1. Abre tu archivo `script.rpy` y asegúrate de tener los personajes declarados:
   ```
   define perrito = Character("Perrito", color="#00B7EB")
   define gatita = Character("Gatita", color="#FF69B4")
   ```
2. Configura la escena inicial:
   ```
   label start:
       scene bg playa
       show perrito at left
       show gatita at right
   ```

#### 2. Línea de tiempo para diálogos (controlar el ritmo)
En Ren'Py, puedes controlar el ritmo de los diálogos usando pausas y mostrando el texto letra por letra. Esto se hace con las etiquetas `{p}` (pausa) y `{w}` (espera).

1. Añade pausas dentro del diálogo para crear suspenso:
   ```
   perrito "¡Mira, Gatita! {p=1.0} Creo que vi algo en el agua..."
   ```
   - `{p=1.0}` hace una pausa de 1 segundo antes de continuar el diálogo.
2. Controla la velocidad del texto con `{w}`:
   ```
   gatita "Espera... {w=0.5} ¿Eso es un tiburón?!"
   ```
   - `{w=0.5}` espera 0.5 segundos antes de mostrar el resto del texto.

#### 3. Formatos básicos para el texto
Puedes cambiar el estilo del texto dentro de un diálogo usando etiquetas de formato.

1. **Negritas** (para énfasis):
   ```
   perrito "¡{b}Cuidado{/b}, Gatita!"
   ```
2. **Cursivas** (para pensamientos o tono suave):
   ```
   gatita "{i}No puede ser un tiburón... ¿o sí?{/i}"
   ```
3. **Color en el texto** (para resaltar palabras):
   ```
   perrito "¡Es un {color=#FF0000}tiburón{/color} de verdad!"
   ```
   - `#FF0000` es rojo. Usa códigos hexadecimales para otros colores.

#### 4. Efectos visuales en el texto
Ren'Py permite añadir efectos al texto para que refleje emociones, como miedo o sorpresa. Uno de los más populares es el efecto de "temblor" (shaking), ideal para escenas de terror.

1. Usa la etiqueta `{shake}` para hacer que el texto tiemble:
   ```
   gatita "{shake=0.5}¡N-no quiero nadar ahora!"
   ```
   - `{shake=0.5}` hace que el texto tiemble durante 0.5 segundos. Puedes ajustar el valor para más o menos intensidad.
   Nota: El efecto `shake` no es nativo de Ren'Py, pero puedes implementarlo con un código personalizado. Más adelante te explico cómo declararlo.

2. Otro efecto útil es `{alpha}` para hacer que el texto aparezca o desaparezca gradualmente:
   ```
   perrito "{alpha=0}...{alpha=1}¡Corre, Gatita!"
   ```
   - `{alpha=0}` hace el texto invisible, y `{alpha=1}` lo hace visible. Esto crea un efecto de desvanecimiento.

#### 5. Declarar efectos personalizados (evitar fallas)
Algunos efectos, como `shake`, requieren código adicional para funcionar. Si no lo declaras correctamente, Ren'Py puede dar errores como "tag not found". Vamos a declarar el efecto `shake`.

1. Al inicio de tu `script.rpy`, añade el siguiente código para definir el efecto `shake`:
   ```
   init python:
       def shake_function(trans, st, at):
           trans.xoffset = int(5 * renpy.random.random() - 2.5)
           trans.yoffset = int(5 * renpy.random.random() - 2.5)
           return 0.05

       renpy.register_shader("shake", vertex_200="""
           uniform float u_time;
           attribute vec2 a_position;
           varying vec2 v_position;
           void main() {
               gl_Position = vec4(a_position, 0.0, 1.0);
               v_position = a_position;
           }
       """, fragment_200="""
           uniform float u_time;
           varying vec2 v_position;
           void main() {
               gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
           }
       """)

       def shake_tag(tag, argument, contents):
           return [(renpy.TEXT_TAG, "shake=" + str(argument))] + contents

       config.custom_text_tags["shake"] = shake_tag
   ```
2. Ahora puedes usar `{shake}` en tus diálogos sin que Ren'Py falle.

**Consejo**: Si el efecto no funciona, verifica que el código esté correctamente indentado (usa 4 espacios, no TAB). También asegúrate de que tu versión de Ren'Py sea reciente (8.2.0 o superior).

#### 6. Código completo de la escena
Aquí está el código completo con todos los efectos que vimos:
```
define perrito = Character("Perrito", color="#00B7EB")
define gatita = Character("Gatita", color="#FF69B4")

init python:
    def shake_function(trans, st, at):
        trans.xoffset = int(5 * renpy.random.random() - 2.5)
        trans.yoffset = int(5 * renpy.random.random() - 2.5)
        return 0.05

    renpy.register_shader("shake", vertex_200="""
        uniform float u_time;
        attribute vec2 a_position;
        varying vec2 v_position;
        void main() {
            gl_Position = vec4(a_position, 0.0, 1.0);
            v_position = a_position;
        }
    """, fragment_200="""
        uniform float u_time;
        varying vec2 v_position;
        void main() {
            gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
        }
    """)

    def shake_tag(tag, argument, contents):
        return [(renpy.TEXT_TAG, "shake=" + str(argument))] + contents

    config.custom_text_tags["shake"] = shake_tag

label start:
    scene bg playa
    show perrito at left
    show gatita at right
    perrito "¡Mira, Gatita! {p=1.0} Creo que vi algo en el agua..."
    gatita "Espera... {w=0.5} ¿Eso es un {color=#FF0000}tiburón{/color}?!"
    perrito "¡{b}Cuidado{/b}, Gatita!"
    gatita "{shake=0.5}¡N-no quiero nadar ahora!"
    perrito "{alpha=0}...{alpha=1}¡Corre, Gatita!"
    gatita "No sé qué hacer..."
    return
```

#### 7. ¡Tu turno!
Copia este código en tu proyecto de Ren'Py y prueba los efectos. ¿Lograste que el texto de Gatita tiemble de miedo? ¿Qué otros efectos te gustaría probar? Déjame un comentario con tus resultados. En la próxima entrada, aprenderemos a posicionar personajes en diferentes lugares de la pantalla. ¡Nos leemos el 6 de abril!

Comentarios

Entradas más populares de este blog

Introducción a Ren'Py - Tu primer paso para crear novelas visuales

Importar un segundo personaje y hacer que interactúen en Ren'Py

Crear rutas alternas con el comando `if` en Ren'Py