GameMaker
← Intégrer le contenu à votre jeu
GameMaker · GML (struct_get / struct_exists)
Commencez par afficher une seule phrase. Ce petit exemple lit directement les données exportées de La clé du port ; il ne constitue pas un système de dialogue complet. Reliez ensuite ces données à l’interface de votre jeu.
1 · Préparer les fichiers et la scène
Ajoutez story.json comme Included File. Créez obj_dialogue et placez une instance dans la première room. Collez le code dans Create. Ajoutez un événement Draw GUI contenant draw_text_ext(24, 24, dialogue_text, -1, 700);. Ce guide utilise l’accès aux fichiers sur ordinateur.
story.json · Comprendre les fichiers exportés
2 · Afficher le premier texte
// obj_dialogue: Create event. story.json is an Included File.
dialogue_text = "Cannot read story.json";
var file = buffer_load(working_directory + "story.json");
if (file >= 0) {
var raw = buffer_read(file, buffer_text);
buffer_delete(file);
try {
story = json_parse(raw);
var locale = "en";
var id = "fd7b61a3-8233-4ba7-8f77-b88b119a91bf";
var record = struct_get(story.content.texts, id);
var message = record.sourceMessage;
if (struct_exists(story.content.translations, locale)) {
var translations = struct_get(story.content.translations, locale);
if (struct_exists(translations, id)) message = struct_get(translations, id).message;
}
dialogue_text = "";
for (var i = 0; i < array_length(message.segments); i++) {
var segment = message.segments[i];
if (segment.kind != "text") throw "Text-only example";
dialogue_text += segment.text;
}
} catch (error) { dialogue_text = "Cannot read this story text"; }
}
// Put the following line in the same object's Draw GUI event, not Create:
// draw_text_ext(24, 24, dialogue_text, -1, 700);Résultat attendu : « Welcome to the harbour. I am Mira. » Avec locale = "de" ou le paramètre de langue de : « Willkommen im Hafen. Ich bin Mira. » Une langue absente utilise le texte source. Cet exemple prend en charge les segments de texte ; il ne supprime pas silencieusement les paramètres de substitution.
3 · D'une phrase à une conversation
L’identifiant de texte fixe ci-dessus sert au premier test. Dans votre jeu, choisissez flowRef/entryRef dans story-index.json, puis lisez execution.entries[entryRef].nodeRef et execution.nodes[nodeRef]. Le dialogue courant fournit text.textRef et speakerRef. La suite dépend du champ kind du nœud.
Affichez le nom et le dialogue dans Draw GUI. Pour les réponses, utilisez des instances de bouton qui conservent l’identifiant de l’option. End : passez la variable dialogue_open à false et conditionnez l’affichage et les entrées à cette variable. N’appelez pas game_end().
- Continue et End : suivre les connexions et fermer la boîte de dialogue
- Choix : identifiant, ordre et suite de la réponse sélectionnée
- Conditions et variables : dix ou deux pièces d’or
- Langue : mêmes identifiants, contenu relu dans la langue choisie
- Command : donner un objet ou ouvrir une boutique
- Call/Return : appeler une sous-histoire puis revenir
Examiner les réponses et la vérification de l’or dans ce langage
Lire les données pour un choix
Insérez cet extrait là où story est disponible après le chargement. Pour RPG Maker, utilisez const story = $gameTemp.vnleExample.story;. Il affiche les identifiants pour vérification ; remplacez cet affichage par vos boutons de réponse. Il couvre les deux réponses du port et la vérification de l’or qui suit, pas l’ensemble des types de nœuds.
// After story was loaded successfully.
var choice = struct_get(story.execution.nodes, "42edfff8-b8fe-46bf-ae0d-9e2347b6e726");
for (var i = 0; i < array_length(choice.optionOrder); i++) {
var option_id = choice.optionOrder[i];
var option = struct_get(choice.options, option_id);
show_debug_message(option_id + " " + option.text.textRef);
// Resolve text; keep option_id on your answer button instance.
}
var branch = struct_get(story.execution.nodes, "c1c3c372-0a73-4cd0-851d-ede59d5709bb");
var gold = 10; // Repeat with 2.
var next_step = gold >= branch.condition.right.value.value ? branch.whenTrue : branch.whenFalse;
show_debug_message(next_step.nodeRef);Avec 10 pièces d’or, next désigne Pay five gold ; avec 2, Not enough gold. Dans le jeu, effectuez cette vérification uniquement lorsque le parcours choisi atteint ce nœud. Chaque réponse possède sa propre suite.
4 · Associer vos propres images
Cet extrait complémentaire suppose que le dialogue courant se trouve dans un objet nommé node et que les éléments d’interface cités en commentaire existent. En C++ et MonoGame, speakerRef a déjà été lu dans SpeakerId ou speakerId. La clé est le véritable identifiant de Mira ; le nom et l’emplacement de l’image dépendent de votre jeu. Insérez les lignes aux endroits indiqués.
// Import mira.png as sprite spr_mira. In Create:
portraits = {};
struct_set(portraits, "807b2957-7bab-4a28-83a4-1f3d1589bbc2", spr_mira);
// In Draw GUI, with node holding the current dialogue struct:
if (struct_exists(portraits, node.speakerRef)) {
draw_sprite(struct_get(portraits, node.speakerRef), 0, 96, 180);
}Retrouvez le nom du personnage avec content.characters[speakerRef].nameTextRef, comme pour un texte de dialogue. Si aucune image n’est associée, masquez l’ancien portrait ou affichez une image de remplacement. Les images ne sont pas choisies selon la langue.
Utiliser les références d'image de l'exportation complète
5 · Inclure les fichiers dans le jeu distribué
Incluez le fichier pour la plateforme de compilation choisie. Lisez les clés d’identifiant avec struct_get : les noms contenant des tirets ne sont pas des propriétés accessibles par un point. Pour une version navigateur, adaptez et testez séparément le chemin de chargement.
Vérifiez votre résultat
- Les salutations en anglais et en allemand s'affichent correctement; une langue non disponible revient à l'anglais.
- Après avoir ajouté la progression, testez les deux réponses, 10 puis 2 pièces d’or, le retour de la sous-histoire et End.
- Lancez le jeu compilé en dehors du dossier du projet. Les fichiers JSON, les polices et les portraits doivent y être accessibles aussi.
Documentation officielle
Documentation des API et de la configuration utilisées :