whileAI GAME SDK / v1 ← 아케이드로
COMMUNITY GAME GUIDE

WhileAI에
내 게임 연결하기

게임 페이지에 작은 메시지 브리지만 넣으면 WhileAI가 시작, 일시정지, 점수와 게임 종료를 안전한 iframe 안에서 연결합니다.

SDK CHECK
  1. readyconnected
  2. startack
  3. scorereceived
  4. pausequiet 1.5s
  5. resumeack
  6. gameOverwaiting…
01

5 MINUTE START

빠르게 시작하기

RUNNABLE EXAMPLE

먼저 작동하는 스타터를 열어보세요.

첫 클릭으로 점수를 만들고 자동 pause/resume 검사 뒤 한 번 더 클릭하면 gameOver를 보내는 최소 게임입니다. 현재 WhileAI 주소에 아래 경로를 붙여 게임 추가 화면에서 검사하세요.

/examples/game-sdk-starter/
1

게임 준비

부모 크기에 맞는 16:9 반응형 웹 게임을 만듭니다.

2

브리지 연결

전용 MessagePort로 명령을 받고 이벤트를 보냅니다.

3

검사 후 공개

여섯 단계의 실제 왕복을 통과한 HTTPS URL을 등록합니다.

로컬과 공개 URL

http://localhosthttp://127.0.0.1은 개발 중 연결 검사에만 쓸 수 있습니다. 공개할 때는 localhost와 사설·링크 로컬 주소가 아닌 공개 호스트에 HTTPS로 배포하세요.

02

MESSAGE CONTRACT

SDK 연결 규칙

게임은 최초 한 번만 전역 message에서 연결을 받고, 이후에는 넘겨받은 전용 MessagePort로만 통신합니다.

window.addEventListener("message", (event) => {
  const message = event.data;
  if (
    port || event.source !== window.parent ||
    event.ports.length !== 1 ||
    message?.source !== "whileai.host" ||
    message?.protocol !== "whileai.game" ||
    message?.version !== 1 || message?.type !== "connect"
  ) return;

  channel = message.channel;
  port = event.ports[0];
  port.onmessage = ({ data }) => handleCommand(data);
  port.start();
  send("ready", {
    sdkVersion: "1.0.0",
    capabilities: ["pause", "resume"],
  });
});
channel

연결 때 받은 값을 모든 메시지에 그대로 넣습니다.

seq

보낼 때마다 1씩 증가시키고, 이전 번호는 무시합니다.

runId

start에서 받은 현재 실행 ID만 허용합니다.

replyTo

명령 ACK에는 요청의 requestId를 담습니다.

호스트 명령 처리

function handleCommand(message) {
  if (!validHostMessage(message)) return;
  receivedSeq = message.seq;

  if (message.type === "start") {
    runId = message.payload.runId;
    game.start();
    acknowledge(message, "running");
  } else if (message.payload?.runId !== runId) {
    return;
  } else if (message.type === "pause" && state === "running") {
    game.pause();
    acknowledge(message, "paused");
  } else if (message.type === "resume" && state === "paused") {
    game.resume();
    acknowledge(message, "running");
  }
}
일시정지는 ACK보다 먼저

pause ACK를 보내기 전에 requestAnimationFrame, 타이머, 물리 계산과 점수 변화를 모두 멈춰야 합니다.

03

GAME EVENTS

점수와 게임 종료

scoreRUNNING ONLY

점수가 바뀔 때 현재 실행의 runId와 정수를 보냅니다. 초당 10회 이하를 권장합니다.

send("score", {
  runId,
  score: 1200,
});
gameOverONCE PER RUN

목숨 소진이나 제한 시간 종료 시 1100,000,000 범위의 최종 점수를 한 실행에 한 번만 보냅니다.

send("gameOver", {
  runId,
  score: finalScore,
});
  • 진행 중 score0100,000,000 사이의 안전한 정수
  • 최종 gameOver 점수는 랭킹 저장을 위해 1 이상
  • 일시정지 중에는 score를 전송하지 않음
  • 새 게임 시작 시 이전 오브젝트와 점수를 완전히 초기화
04

CONNECTION CHECK

WhileAI에서 검사하기

  1. 01
    로그인 후 + 게임 추가

    이름, slug, 소개, 실행 URL과 랭킹 정렬을 입력합니다.

  2. 02
    연결 검사 실행

    미리보기 안에서 직접 플레이해 첫 점수와 게임 종료를 발생시킵니다.

  3. 03
    여섯 단계 확인

    ready → start → score → pause → resume → 새 score → gameOver 순서와 1점 이상의 최종 점수를 검사합니다. 플레이 입력을 기다리는 각 단계는 60초 안에 완료하세요.

  4. 04
    HTTPS URL 공개

    모든 항목을 통과하면 공개 버튼이 활성화되고 게임 목록과 랭킹에 추가됩니다.

복사 가능한 전체 구현은 프로젝트의 examples/game-sdk-starter/game.js, 저장용 상세 문서는 docs/ADDING_A_GAME.md에 있습니다.

05

BEFORE PUBLISH

제출 전 확인

랭킹의 신뢰 범위

외부 게임의 점수는 게임 클라이언트가 보고하므로 서버가 플레이 자체를 검증하지는 않습니다. 계정당 게임은 20개까지 등록되고 공개 목록에는 최신 100개가 표시됩니다. 금전성 보상이나 공식 대회에는 별도의 서버 검증이 필요합니다.

URL 검사는 입력된 호스트명과 IP 주소만 확인하며 DNS 해석 결과와 이후 리다이렉트까지 보증하지 않습니다. 공개 운영 시에는 신고·삭제 또는 승인 절차를 추가하세요.

← WhileAI로 돌아가 게임 추가