VNLEWIKITwórz historie. Łącz światy.
Polski
Podręcznik VNLE

Godot

← Połącz treść ze swoją grą

Godot 4.x · GDScript

Zacznij od jednego widocznego zdania. Ten krótki przykład odczytuje bezpośrednio rzeczywisty eksport The Harbour Key; nie jest kompletnym systemem odtwarzania dialogów. Następnie połącz dane z interfejsem swojej gry.

1 · Przygotowanie plików i sceny

Utwórz i zapisz scenę z głównym węzłem Label. Umieść pełny eksport Harbour w res://story/. Dodaj FirstText.gd do Label i uruchom scenę klawiszem F6.

story.json · Opis plików eksportu

2 · Pokaż pierwszy tekst

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

Oczekiwany wynik: „Welcome to the harbour. I am Mira.” Przy locale = "de" lub parametrze języka de: „Willkommen im Hafen. Ich bin Mira.” Jeśli język jest niedostępny, zostanie użyty tekst źródłowy. Przykład obsługuje segmenty tekstowe; celowo nie pomija po cichu znaczników podstawianych wartości.

3 · Od jednego zdania do rozmowy

Stały identyfikator tekstu powyżej służy do pierwszego testu. W grze wybierz flowRef/entryRef z story-index.json, odczytaj execution.entries[entryRef].nodeRef, a następnie execution.nodes[nodeRef]. Bieżący dialog udostępnia text.textRef i speakerRef. Dalszy przebieg zależy od typu węzła.

Imię i dialog: Label.text. Odpowiedzi: Button.text i sygnał pressed z zachowaniem ID opcji. Zakończenie: hide() na wspólnym kontenerze Control. W przykładzie show_language("de") zmienia język tego samego tekstu bez przechodzenia do kolejnego węzła.

  1. Continue i End: przechodzenie po połączeniach i zamykanie okna tekstu
  2. Wybory: ID odpowiedzi, kolejność i dalsza ścieżka
  3. Warunki i zmienne: dziesięć lub dwie sztuki złota
  4. Język: te same ID, treść odczytana w innym języku
  5. Polecenie: wydanie przedmiotu lub otwarcie sklepu
  6. Call/Return: wywołanie pobocznej sekwencji i powrót
Sprawdź odpowiedzi i warunek ilości złota w tym języku programowania

Odczyt danych wyboru

Wstaw ten fragment tam, gdzie po wczytaniu dostępny jest obiekt story (w RPG Maker: const story = $gameTemp.vnleExample.story;). Wypisuje on ID do sprawdzenia. Zastąp wypisywanie przyciskami odpowiedzi. Kod obsługuje dwie odpowiedzi ze sceny Harbour i następujący po nich warunek ilości złota; nie jest uniwersalnym interpreterem.

# 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"])

Przy 10 sztukach złota next wskazuje „Pay five gold”, a przy 2 — „Not enough gold”. W grze sprawdzaj warunek dopiero wtedy, gdy wybrana ścieżka dotrze do tego węzła. Każda odpowiedź wskazuje własną dalszą ścieżkę.

4 · Przypisz własne obrazy

Ten dodatkowy fragment zakłada dostępność bieżącego obiektu dialogu o nazwie node i elementów interfejsu wymienionych w komentarzach. W C++ i MonoGame speakerRef został już odczytany jako SpeakerId lub speakerId. Klucz to rzeczywisty identyfikator postaci Mira; nazwę i lokalizację obrazu ustalasz w swojej grze. Wstaw linie we wskazanych miejscach.

# 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", ""))

Odczytuj imiona przez content.characters[speakerRef].nameTextRef tak samo jak tekst dialogu. Jeśli brakuje przypisanego obrazu, ukryj poprzedni portret lub pokaż obraz zastępczy. Wybór obrazu nie zależy od języka.

Użyj odwołań do obrazów z pełnego eksportu

5 · Dołącz pliki do gry

Dla FileAccess zachowaj surowy JSON w eksporcie: użyj Keep File, jeśli ta opcja jest dostępna, albo odpowiedniego filtra eksportu plików niebędących zasobami. Do obrazów użyj importowanych zasobów Texture2D lub jawnie dołącz oryginalne pliki PNG. Uruchom także wyeksportowaną wersję gry.

Sprawdź wynik

  1. Powitania po angielsku i niemiecku wyświetlają się poprawnie; dla niedostępnego języka pojawia się tekst angielski.
  2. Po dodaniu obsługi przebiegu sprawdź obie odpowiedzi, 10 i 2 sztuki złota, powrót z pobocznej sekwencji oraz End.
  3. Uruchom zbudowaną grę poza folderem projektu. Pliki JSON, czcionki i portrety muszą być dostępne także tam.

Oficjalna dokumentacja

Dokumentacja API i konfiguracji użytych w tej instrukcji: