Diálogos
ss-gameforge-dialogue provee un sistema de orquestación de diálogos desacoplado de su presentación visual.
Configura el contenido y el comportamiento en un DialogueResource, muéstralo con un nodo DialogueView, y dale estilo con un recurso DialogueTheme.
Instalación
Sección titulada «Instalación»- Descarga
ss-gameforge-dialoguedesde la página de releases. - Copia
addons/ss-gameforge-dialogue/dentro deres://addons/. - Activa ss-gameforge-dialogue en Project Settings → Plugins.
Clases principales
Sección titulada «Clases principales»| Clase | Descripción |
|---|---|
DialogueResource | Contiene las líneas de diálogo, tiempos y configuración de comportamiento. |
DialogueView | Nodo de UI que renderiza y anima el diálogo. |
DialogueTheme | Recurso de tema visual para el cuadro de diálogo. |
DialogueResource
Sección titulada «DialogueResource»Crea un nuevo DialogueResource via New Resource en el inspector.
Propiedades
Sección titulada «Propiedades»| Propiedad | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
dialogues | Array[String] | [] | Líneas de diálogo (texto o claves de traducción). |
use_translation | bool | true | Si es true, los valores se usan como claves de traducción con tr(). |
auto_start | bool | false | Inicia automáticamente cuando la vista está lista. |
allow_skip | bool | true | Permite saltar la animación de escritura. |
advance_mode | AdvanceMode | HYBRID | Cómo avanza el jugador entre líneas. |
text_speed | float | 0.075 | Segundos por carácter en el efecto de escritura. |
time_to_start | float | 0.25 | Retraso antes de la primera línea. |
hold_after_line | float | 0.75 | Pausa tras terminar una línea antes de avanzar automáticamente. |
open_time | float | 0.55 | Duración de la animación de apertura. |
open_transition | Tween.TransitionType | TRANS_ELASTIC | Tipo de easing para la apertura. |
close_time | float | 0.20 | Duración de la animación de cierre. |
Modos de avance
Sección titulada «Modos de avance»enum AdvanceMode { AUTO, # Las líneas avanzan automáticamente tras hold_after_line MANUAL, # Espera input de ui_accept HYBRID, # Avanza con input o timer (lo primero que ocurra)}DialogueView
Sección titulada «DialogueView»Añade un nodo DialogueView a tu escena (o instancia la escena incluida).
Propiedades
Sección titulada «Propiedades»| Propiedad | Tipo | Descripción |
|---|---|---|
resource | DialogueResource | Diálogo a reproducir. Puede asignarse antes de llamar play(). |
dialogue_theme | DialogueTheme | Tema visual. |
skip_action | StringName | Acción de input que avanza el diálogo (por defecto: "ui_accept"). |
Señales
Sección titulada «Señales»signal dialogue_startedsignal line_changed(index: int) # Se emite al iniciar una nueva línea (índice 0-based)signal dialogue_finishedMétodos
Sección titulada «Métodos»func play(res: DialogueResource) -> void # Inicia una secuencia de diálogofunc stop() -> void # Cancela inmediatamentefunc apply_theme() -> void # Re-aplica el tema tras cambios en tiempo de ejecuciónDialogueTheme
Sección titulada «DialogueTheme»Crea via New Resource → DialogueTheme.
| Propiedad | Tipo | Descripción |
|---|---|---|
background_color | Color | Color de relleno del cuadro. |
border_color | Color | Color del borde. |
border_width | int | Ancho del borde en píxeles. |
corner_radius | float | Radio de las esquinas. |
padding | Vector2 | Espaciado horizontal y vertical. |
font_color | Color | Color del texto. |
font_size | int | Tamaño de fuente. |
font | Font | Fuente personalizada. Dejar null usa la fuente del proyecto. |
position_margin | Vector2 | Distancia desde los bordes de pantalla. |
Inicio rápido
Sección titulada «Inicio rápido»1. Crear un DialogueResource
Sección titulada «1. Crear un DialogueResource»Clic derecho en el FileSystem → New Resource → DialogueResource.
Define las líneas en dialogues:
["Bienvenido, viajero.", "El camino por delante es peligroso.", "¿Estás listo?"]Asigna advance_mode a HYBRID (el jugador avanza con input o el timer lo hace solo).
2. Añadir un DialogueView a tu escena
Sección titulada «2. Añadir un DialogueView a tu escena»Instancia addons/ss-gameforge-dialogue/scenes/dialogue_view.tscn, o añade un nodo Control y asígnale un script DialogueView.
3. Reproducir el diálogo
Sección titulada «3. Reproducir el diálogo»@onready var dialogue_view: DialogueView = $DialogueView
func _ready() -> void: dialogue_view.dialogue_finished.connect(_on_dialogue_done) dialogue_view.play(preload("res://dialogues/intro.tres"))
func _on_dialogue_done() -> void: print("Diálogo terminado")Soporte de BBCode
Sección titulada «Soporte de BBCode»Las líneas de diálogo soportan etiquetas BBCode de Godot. El efecto de escritura cuenta correctamente solo los caracteres visibles:
"El [b]dragón[/b] despierta...""Tu vida está [color=green]completa[/color].""[wave]Cargando...[/wave]"El utilitario BBCodeParser integrado gestiona el conteo de caracteres visibles para que el skip y el avance funcionen correctamente con texto formateado.
Integración con traducciones
Sección titulada «Integración con traducciones»Con use_translation = true, cada string en dialogues se trata como clave de traducción:
# En el DialogueResourcedialogues = ["INTRO_LINEA_1", "INTRO_LINEA_2"]use_translation = trueLa vista llama tr("INTRO_LINEA_1") automáticamente antes de mostrar cada línea.
Ejemplo avanzado — Trigger de diálogo de NPC
Sección titulada «Ejemplo avanzado — Trigger de diálogo de NPC»extends Area2D
@export var dialogue_resource: DialogueResource@onready var dialogue_view: DialogueView = $DialogueView
var _player_inside := false
func _ready() -> void: body_entered.connect(_on_body_entered) body_exited.connect(_on_body_exited) dialogue_view.dialogue_finished.connect(_on_dialogue_finished)
func _on_body_entered(body: Node) -> void: if body.is_in_group("player"): _player_inside = true
func _unhandled_input(event: InputEvent) -> void: if _player_inside and event.is_action_pressed("ui_accept"): dialogue_view.play(dialogue_resource)
func _on_body_exited(body: Node) -> void: if body.is_in_group("player"): _player_inside = false dialogue_view.stop()
func _on_dialogue_finished() -> void: print("Diálogo del NPC terminado")