Lingara Lingara Dokumentation Ratgeber API Bibliotheken Apps Erstellen Einbetten Web-App
Sprache: Deutsch

JVM und Android

Diese Seite ist aus dem Englischen übersetzt. Wenn die beiden voneinander abweichen, ist die englische Seite maßgeblich. Englische Seite lesen

Das Kotlin-Spieler-Kit läuft auf der JVM, auf dem Desktop und unter Android. Java-Spiele verwenden dasselbe Kit über seine Java-Fassade. Die Beispiele folgen einem libGDX-Spiel, dessen Render-Schleife ein natürlicher Ort zum Leeren der Events ist, und dieselben Aufrufe passen in jede Spielschleife.

Das Kit und seine nativen Bibliotheken hinzufügen

Das Kit und seine nativen Bibliotheken sind getrennte Artefakte auf Maven Central, fügen Sie also beide hinzu. Ein Desktop-Spiel fügt lingara-embed-natives-desktop hinzu, das die Bibliotheken für Windows, macOS und Linux enthält. Ein Android-Modul fügt stattdessen lingara-embed-natives-android hinzu, ein AAR. In einem libGDX-Projekt kommen die Desktop-Bibliotheken in das Desktop-Modul und die Android-Bibliotheken in das Android-Modul.

Ein Kotlin-Spiel hängt von lingara-embed-kotlin ab, ein Java-Spiel von lingara-embed-java, der Fassade.

Tokens von Ihrem Server erhalten

Das Kit hält nie ein Secret. Geben Sie ihm die Token-Route Ihres eigenen Servers und den Header, der die Sitzung des Spielers trägt, und das Kit sendet immer dann einen POST an sie, wenn es ein Token braucht. Ihr Server stellt mit einem Server-Kit aus und antwortet mit dem Token und seinem Ablaufzeitpunkt.

Events in Ihrer Render-Schleife leeren

Der Kern führt seine Netzwerk-I/O in einem eigenen Thread aus und ruft nie Ihren Code auf. Leeren Sie in Ihrer Render-Schleife, im Spiel-Thread, was angekommen ist, höchstens 256 Events auf einmal, und behandeln Sie jedes: eine Übungsaktualisierung, eine gestreamte NPC-Antwort, einen Fehler. In Java geht jedes Event an die passende Methode Ihres Visitors. Schließen Sie das Kit im Dispose-Schritt Ihres Spiels, der den Kern stoppt und freigibt.

Unter NPC-Dialoge und Übungsergebnisse steht, was diese Events tragen.

Sprache des Codebeispiels

Kotlin

// The kit, and the natives for the platform: natives-desktop in a libGDX lwjgl3 module, natives-android in its android module.
implementation("com.getlingara:lingara-embed-kotlin:0.1.0-alpha.6")
implementation("com.getlingara:lingara-embed-natives-desktop:0.1.0-alpha.6")

Java

<!-- The kit, and the natives for the platform (lingara-embed-natives-android in an Android module). -->
<dependency>
  <groupId>com.getlingara</groupId>
  <artifactId>lingara-embed-java</artifactId>
  <version>0.1.0-alpha.6</version>
</dependency>
<dependency>
  <groupId>com.getlingara</groupId>
  <artifactId>lingara-embed-natives-desktop</artifactId>
  <version>0.1.0-alpha.6</version>
</dependency>
Sprache des Codebeispiels

Kotlin

// Your server mints the embed token; the kit POSTs {} here whenever it needs one.
private val lingara =
    LingaraEmbed.start(
        EmbedConfig(
            tokenSource =
                TokenSourceConfig.Http(
                    url = "https://my-game.example/lingara/token",
                    headers = listOf(Header("Authorization", Secret("Bearer $session"))),
                ),
            userAgentSuffix = "my-game/1.4",
        ),
    )

Java

// Your server mints the embed token; the kit POSTs {} here whenever it needs one.
lingara =
    LingaraEmbedJava.builder()
        .httpTokenSource(
            "https://my-game.example/lingara/token",
            Map.of("Authorization", "Bearer " + session))
        .userAgentSuffix("my-game/1.4")
        .build();
Sprache des Codebeispiels

Kotlin

// In render(), on the game thread: one crossing, at most 256 events.
fun render() {
    lingara.drain(256) { event ->
        when (event) {
            is EmbedEvent.Practice -> showPractice(event.snapshot.question?.prompt)
            is EmbedEvent.NpcTurn -> onNpcTurn(event.update)
            is EmbedEvent.Error -> println("Lingara error: ${event.error.message}")
            else -> Unit
        }
    }
}

// In dispose(): stops the core and frees it.
fun dispose() {
    lingara.close()
}

Java

// In render(), on the game thread: one crossing, at most 256 events, each to its visitor method.
void render() {
  lingara.drain(256, event -> LingaraEmbedJava.visit(event, visitor));
}

// In dispose(), or let try-with-resources do it.
@Override
public void close() {
  lingara.close();
}