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