GameMaker
GameMaker · GML (struct_get / struct_exists)
Beginne mit einem sichtbaren Satz. Dieses kleine Beispiel liest direkt den echten Harbour-Export; es ist kein vollständiger Dialogplayer. Anschließend verbindest du die Daten mit deiner Spieloberfläche.
1 · Dateien und Szene vorbereiten
Füge story.json als Included File hinzu. Erstelle obj_dialogue und platziere eine Instanz im ersten Raum. Füge den Code in Create ein. Lege zusätzlich ein Draw GUI Event mit draw_text_ext(24, 24, dialogue_text, -1, 700); an. Der Einstieg verwendet den Desktop-Dateizugriff.
story.json · Exportdateien erklärt
2 · Den ersten Text anzeigen
// 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);Erwartet: „Welcome to the harbour. I am Mira.“ Mit locale = "de" beziehungsweise dem Sprachparameter de: „Willkommen im Hafen. Ich bin Mira.“ Fehlt die Sprache, wird der Quelltext verwendet. Das Beispiel unterstützt Textsegmente; Platzhalter werden absichtlich nicht stillschweigend übersprungen.
3 · Von einem Satz zum Gespräch
Die feste Text-ID oben dient dem ersten Test. Im Spiel wählst du flowRef/entryRef aus story-index.json, liest execution.entries[entryRef].nodeRef und dann execution.nodes[nodeRef]. Der aktuelle Dialog liefert text.textRef und speakerRef. Fortsetzungen hängen vom Knotentyp ab.
Name/Dialog im Draw GUI Event zeichnen. Für Antworten Button-Instanzen mit gespeicherter Options-ID verwenden. Ende: eine dialogue_open-Variable auf false setzen und Zeichnen/Eingabe daran koppeln. Kein game_end() aufrufen.
- Weiter und Ende: Verbindungen verfolgen, Textbox schließen
- Choices: Antwort-ID, Reihenfolge und ausgewählter Ausgang
- Conditions und Variablen: zehn oder zwei Goldstücke
- Sprache: dieselben IDs, neu aufgelöste Inhalte
- Command: Gegenstand geben oder einen Shop öffnen
- Call/Return: Untergeschichte und zurückkehren
Antworten und Goldprüfung in dieser Sprache nachvollziehen
Die Daten einer Entscheidung lesen
Füge diesen Ausschnitt dort ein, wo story nach erfolgreichem Laden verfügbar ist (bei RPG Maker: const story = $gameTemp.vnleExample.story;). Er gibt IDs zum Nachvollziehen aus. Die Anzeige ersetzt du durch deine Antwortbuttons. Er ist auf die zwei Harbour-Antworten und deren nachfolgende Goldprüfung begrenzt, kein allgemeiner Interpreter.
// 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);Mit 10 Gold verweist next auf „Pay five gold“, mit 2 auf „Not enough gold“. Beim tatsächlichen Spielen führst du die Prüfung erst aus, wenn der gewählte Pfad diesen Knoten erreicht. Jede ausgewählte Antwort liefert dafür ihre eigene continuation.
4 · Eigene Bilder zuordnen
Dieses Ergänzungsstück setzt einen aktuellen dialogue-Knoten namens node und die im Kommentar genannten UI-Elemente voraus. Bei C++ und MonoGame ist speakerRef bereits als SpeakerId beziehungsweise speakerId ausgelesen. Der Schlüssel ist Miras tatsächliche Charakter-ID; der Bildname und sein Ablageort gehören deinem Spiel. Füge die Zeilen an den angegebenen Stellen ein.
// 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);
}Sprechernamen über content.characters[speakerRef].nameTextRef genauso wie Dialogtexte auflösen. Eine fehlende Zuordnung soll das alte Porträt ausblenden oder ein Ersatzbild zeigen. Bilder werden nicht nach Sprache gewählt.
Bildverweise aus dem vollständigen Export verwenden
5 · Dateien mit dem Spiel ausliefern
Die Included File muss für das gewählte Ziel mitgeliefert werden. GML liest ID-Schlüssel über struct_get; Namen mit Bindestrichen sind keine Punkt-Eigenschaften. Für Browserziele den Dateiladeweg gesondert anpassen und prüfen.
Dein Ergebnis prüfen
- Der englische und deutsche Begrüßungstext erscheinen korrekt; eine nicht vorhandene Sprache fällt auf Englisch zurück.
- Beim Ergänzen des Ablaufs: beide Antworten, Gold 10/2, Rückkehr aus der Untergeschichte und Ende ausprobieren.
- Den gebauten Spielordner außerhalb deines Projekts starten. JSON, Schriften und Porträts müssen dort ebenfalls vorhanden sein.
Offizielle Dokumentation
API- und Einrichtungsreferenzen für diesen Weg: