Cocos Creator
← Integre o conteúdo ao seu jogo
Cocos Creator 3.8 LTS · TypeScript
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
Este exemplo usa Cocos Creator 3.8, não Cocos2d-x. Coloque story.json em assets/resources/story/story.json. Crie um Label dentro de um Canvas. Adicione FirstText.ts a um nó e atribua o Label ao campo dialogue. Execute Preview.
story.json · Entenda os arquivos exportados
2 · Exiba o primeiro texto
import { _decorator, Component, JsonAsset, Label, resources } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('FirstText')
export class FirstText extends Component {
@property(Label) dialogue: Label | null = null;
start() {
resources.load('story/story', JsonAsset, (error, asset) => {
if (!this.dialogue) return;
if (error || !asset) { this.dialogue.string = 'Cannot load story.json'; return; }
try {
// A data-only sample: validate the complete contract in your integration.
const story = asset.json as any;
const locale = 'en';
const id = 'fd7b61a3-8233-4ba7-8f77-b88b119a91bf';
const translation = story.content.translations[locale]?.[id];
const message = translation ? translation.message : story.content.texts[id].sourceMessage;
this.dialogue.string = message.segments.map((segment: any) => {
if (segment.kind !== 'text') throw new Error('Text-only example');
return segment.text;
}).join('');
} catch (error) { this.dialogue.string = 'Cannot read this story text'; }
});
}
}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.string. Respostas: eventos de Button ou Node.EventType.TOUCH_END, preservando o ID da opção. End: defina node.active = false no nó pai do diálogo. Ao trocar o idioma, resolva o texto novamente, mantendo o ID do nó atual.
- 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 already loaded. Keep each optionId on its answer button.
const choice = story.execution.nodes['42edfff8-b8fe-46bf-ae0d-9e2347b6e726'];
for (const optionId of choice.optionOrder) {
const option = choice.options[optionId];
console.log(optionId, option.text.textRef); // Resolve text, then create your button.
}
// Inspect the actual purchase check. This particular node is Gold >= 5.
const branch = story.execution.nodes['c1c3c372-0a73-4cd0-851d-ede59d5709bb'];
const gold = 10; // Repeat with 2, using your current game value.
const next = gold >= branch.condition.right.value.value ? branch.whenTrue : branch.whenFalse;
console.log(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.
// Add Sprite and SpriteFrame to the imports from cc.
// Import mira.png at assets/resources/portraits/mira.png as a sprite-frame image.
const portraits: Record<string, string> = {'807b2957-7bab-4a28-83a4-1f3d1589bbc2': 'portraits/mira/spriteFrame'};
const path = portraits[node.speakerRef];
// portrait is the Sprite component assigned by your game.
portrait.spriteFrame = null;
if (path) resources.load(path, SpriteFrame, (error, frame) => {
if (!error) portrait.spriteFrame = frame;
});
// If the dialogue can advance during loading, discard callbacks from older lines.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
resources.load usa o caminho dentro de resources, sem a extensão. Aguarde o callback. Inclua os SpriteFrames ou as imagens referenciadas em resources e confira os caminhos, incluindo maiúsculas e minúsculas, também na versão compilada.
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: