Godot
← Integre o conteúdo ao seu jogo
Godot 4.x · GDScript
Comece exibindo uma frase. Este pequeno exemplo lê diretamente a exportação real do porto; ele ainda não é um sistema completo de diálogos. Depois, conecte os dados à interface do seu jogo.
1 · Prepare os arquivos e a cena
Crie uma cena com Label como nó raiz e salve-a. Coloque a exportação completa do porto em res://story/. Adicione FirstText.gd ao Label e execute a cena com F6.
story.json · Entenda os arquivos exportados
2 · Exiba o primeiro texto
extends Label
const TEXT_ID = "fd7b61a3-8233-4ba7-8f77-b88b119a91bf"
var story: Dictionary
func _ready() -> void:
var parser = JSON.new()
var error = parser.parse(FileAccess.get_file_as_string("res://story/story.json"))
if error != OK or not parser.data is Dictionary:
text = "Cannot read story/story.json"
return
story = parser.data
show_language("en")
func show_language(locale: String) -> void:
var record: Dictionary = story["content"]["texts"][TEXT_ID]
var translation: Dictionary = story["content"]["translations"].get(locale, {}).get(TEXT_ID, {})
var message: Dictionary = translation.get("message", record["sourceMessage"])
var line := ""
for segment in message["segments"]:
if segment["kind"] != "text":
text = "This example needs text-only segments"
return
line += segment["text"]
text = line
Resultado esperado: “Welcome to the harbour. I am Mira.” Com locale = "de" ou o parâmetro de idioma de: “Willkommen im Hafen. Ich bin Mira.” Se o idioma não estiver disponível, será usado o texto original. Este exemplo aceita segmentos de texto e não descarta placeholders silenciosamente.
3 · De uma frase a uma conversa
O ID de texto fixo acima serve para o primeiro teste. No seu jogo, escolha flowRef/entryRef em story-index.json, leia execution.entries[entryRef].nodeRef e depois execution.nodes[nodeRef]. O diálogo atual fornece text.textRef e speakerRef. A continuação depende do tipo de nó.
Nome e diálogo: Label.text. Respostas: Button.text e o sinal pressed, preservando o ID da opção. End: use hide() no contêiner Control compartilhado. No exemplo, show_language("de") muda o idioma do mesmo texto sem avançar para outro nó.
- Continue e End: siga as conexões e feche a caixa de texto
- Escolhas: ID da resposta, ordem e continuação selecionada
- Condições e variáveis: dez ou duas moedas de ouro
- Idioma: mesmos IDs, conteúdo resolvido novamente
- Command: entregar um item ou abrir uma loja
- Call/Return: entrar em uma sub-história e voltar
Examine as respostas e a verificação de ouro nesta linguagem
Leia os dados de uma escolha
Insira este trecho onde story estiver disponível após o carregamento (no RPG Maker: const story = $gameTemp.vnleExample.story;). Ele exibe IDs para conferência. Substitua a saída pelos seus botões de resposta. O trecho cobre as duas respostas do porto e a verificação de ouro seguinte; não é um interpretador genérico.
# story is the Dictionary loaded above. These Harbour options have no conditions.
var choice: Dictionary = story["execution"]["nodes"]["42edfff8-b8fe-46bf-ae0d-9e2347b6e726"]
for option_id in choice["optionOrder"]:
var option: Dictionary = choice["options"][option_id]
print(option_id, " ", option["text"]["textRef"])
# Resolve each text and bind its option_id to a Button's pressed signal.
var branch: Dictionary = story["execution"]["nodes"]["c1c3c372-0a73-4cd0-851d-ede59d5709bb"]
var gold := 10 # Repeat with 2.
var next: Dictionary = branch["whenTrue"] if gold >= branch["condition"]["right"]["value"]["value"] else branch["whenFalse"]
print(next["nodeRef"])Com 10 moedas de ouro, next aponta para Pay five gold; com 2, para Not enough gold. No jogo, execute a verificação somente quando o caminho escolhido chegar a esse nó. Cada resposta tem sua própria continuação.
4 · Mapeie suas próprias imagens
Este trecho complementar espera um objeto de diálogo atual chamado node e os elementos de interface indicados nos comentários. Em C++ e MonoGame, speakerRef já foi lido como SpeakerId ou speakerId. A chave do mapeamento é o ID real da personagem Mira; o nome e a localização da imagem pertencem ao seu jogo. Insira as linhas nos locais indicados.
# Put mira.png at res://portraits/mira.png and add a TextureRect named Portrait.
var portraits = {"807b2957-7bab-4a28-83a4-1f3d1589bbc2": preload("res://portraits/mira.png")}
# node is the current dialogue dictionary, not a Godot scene node.
$Portrait.texture = portraits.get(node.get("speakerRef", ""))Resolva o nome do personagem por content.characters[speakerRef].nameTextRef, como faz com o texto do diálogo. Se faltar um mapeamento, o jogo deve ocultar o retrato anterior ou mostrar uma imagem substituta. As imagens não são selecionadas pelo idioma.
Use as referências de imagem da exportação completa
5 · Distribua os arquivos com o jogo
Para usar FileAccess, preserve o JSON bruto na exportação: use Keep File quando disponível ou o filtro apropriado de exportação de arquivos que não são recursos. Para imagens, use recursos Texture2D importados ou inclua explicitamente os PNG originais. Teste também a versão exportada.
Confira o resultado
- As saudações em inglês e alemão devem aparecer corretamente; um idioma indisponível deve usar o inglês.
- Ao implementar o fluxo, teste as duas respostas, 10 e 2 moedas de ouro, a volta da sub-história e End.
- Execute o jogo compilado fora da pasta do projeto. JSON, fontes e retratos também devem estar disponíveis ali.
Documentação oficial
Referências de API e configuração usadas nesta abordagem: