Ir al contenido

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.

  1. Descarga ss-gameforge-dialogue desde la página de releases.
  2. Copia addons/ss-gameforge-dialogue/ dentro de res://addons/.
  3. Activa ss-gameforge-dialogue en Project Settings → Plugins.
ClaseDescripción
DialogueResourceContiene las líneas de diálogo, tiempos y configuración de comportamiento.
DialogueViewNodo de UI que renderiza y anima el diálogo.
DialogueThemeRecurso de tema visual para el cuadro de diálogo.

Crea un nuevo DialogueResource via New Resource en el inspector.

PropiedadTipoValor por defectoDescripción
dialoguesArray[String][]Líneas de diálogo (texto o claves de traducción).
use_translationbooltrueSi es true, los valores se usan como claves de traducción con tr().
auto_startboolfalseInicia automáticamente cuando la vista está lista.
allow_skipbooltruePermite saltar la animación de escritura.
advance_modeAdvanceModeHYBRIDCómo avanza el jugador entre líneas.
text_speedfloat0.075Segundos por carácter en el efecto de escritura.
time_to_startfloat0.25Retraso antes de la primera línea.
hold_after_linefloat0.75Pausa tras terminar una línea antes de avanzar automáticamente.
open_timefloat0.55Duración de la animación de apertura.
open_transitionTween.TransitionTypeTRANS_ELASTICTipo de easing para la apertura.
close_timefloat0.20Duración de la animación de cierre.
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)
}

Añade un nodo DialogueView a tu escena (o instancia la escena incluida).

PropiedadTipoDescripción
resourceDialogueResourceDiálogo a reproducir. Puede asignarse antes de llamar play().
dialogue_themeDialogueThemeTema visual.
skip_actionStringNameAcción de input que avanza el diálogo (por defecto: "ui_accept").
signal dialogue_started
signal line_changed(index: int) # Se emite al iniciar una nueva línea (índice 0-based)
signal dialogue_finished
func play(res: DialogueResource) -> void # Inicia una secuencia de diálogo
func stop() -> void # Cancela inmediatamente
func apply_theme() -> void # Re-aplica el tema tras cambios en tiempo de ejecución

Crea via New ResourceDialogueTheme.

PropiedadTipoDescripción
background_colorColorColor de relleno del cuadro.
border_colorColorColor del borde.
border_widthintAncho del borde en píxeles.
corner_radiusfloatRadio de las esquinas.
paddingVector2Espaciado horizontal y vertical.
font_colorColorColor del texto.
font_sizeintTamaño de fuente.
fontFontFuente personalizada. Dejar null usa la fuente del proyecto.
position_marginVector2Distancia desde los bordes de pantalla.

Clic derecho en el FileSystem → New ResourceDialogueResource.

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

Instancia addons/ss-gameforge-dialogue/scenes/dialogue_view.tscn, o añade un nodo Control y asígnale un script DialogueView.

@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")

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.

Con use_translation = true, cada string en dialogues se trata como clave de traducción:

# En el DialogueResource
dialogues = ["INTRO_LINEA_1", "INTRO_LINEA_2"]
use_translation = true

La 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")