Lingara Lingara ドキュメント 学習ガイド API ライブラリ アプリ 作成 埋め込み ウェブ版
言語: 日本語

JVM と Android

このページは英語から翻訳されています。内容に相違がある場合は、英語のページが正しい内容です。 英語のページを読む

Kotlin のプレイヤーキットは JVM 上で、デスクトップと Android の両方で動作します。Java のゲームは、Java ファサードを通じて同じキットを使います。サンプルは libGDX のゲームに沿っています。そのレンダーループはイベントを取り出すのに自然な場所ですが、同じ呼び出しはどのゲームループにも適合します。

キットとそのネイティブライブラリを追加する

キットとそのネイティブライブラリは Maven Central 上の別々のアーティファクトなので、両方を追加してください。デスクトップのゲームは、Windows、macOS、Linux 用のライブラリを含む lingara-embed-natives-desktop を追加します。Android モジュールでは、代わりに AAR である lingara-embed-natives-android を追加します。libGDX プロジェクトでは、デスクトップ用のネイティブライブラリはデスクトップモジュールに、Android 用のネイティブライブラリは Android モジュールに入れます。

Kotlin のゲームは lingara-embed-kotlin に依存し、Java のゲームはファサードである lingara-embed-java に依存します。

サーバーからトークンを取得する

キットはシークレットを保持しません。あなた自身のサーバーのトークンルートと、プレイヤーのセッションを運ぶヘッダーをキットに渡すと、キットはトークンが必要になるたびにそこへ POST します。あなたのサーバーは サーバーキット で発行し、トークンとその有効期限を返します。

レンダーループでイベントを取り出す

コアはネットワーク I/O を専用のスレッドで実行し、あなたのコードを呼び出すことはありません。レンダーループの中で、ゲームスレッド上で、届いたものを一度に最大 256 イベントまで取り出し、練習の更新、ストリーミングされる NPC の返答、エラーなど、それぞれを処理します。Java では、各イベントはビジターの対応するメソッドに渡されます。ゲームの dispose ステップでキットを閉じてください。これによりコアが停止し、解放されます。

これらのイベントの内容については、NPC との会話 と 練習の結果 を参照してください。

コード例の言語

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>
コード例の言語

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();
コード例の言語

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();
}