게임 준비
부모 크기에 맞는 16:9 반응형 웹 게임을 만듭니다.
게임 페이지에 작은 메시지 브리지만 넣으면 WhileAI가 시작, 일시정지, 점수와 게임 종료를 안전한 iframe 안에서 연결합니다.
5 MINUTE START
첫 클릭으로 점수를 만들고 자동 pause/resume 검사 뒤 한 번 더 클릭하면 gameOver를 보내는 최소 게임입니다. 현재 WhileAI 주소에 아래 경로를 붙여 게임 추가 화면에서 검사하세요.
/examples/game-sdk-starter/
부모 크기에 맞는 16:9 반응형 웹 게임을 만듭니다.
전용 MessagePort로 명령을 받고 이벤트를 보냅니다.
여섯 단계의 실제 왕복을 통과한 HTTPS URL을 등록합니다.
http://localhost와 http://127.0.0.1은 개발 중 연결 검사에만 쓸 수 있습니다. 공개할 때는 localhost와 사설·링크 로컬 주소가 아닌 공개 호스트에 HTTPS로 배포하세요.
MESSAGE CONTRACT
게임은 최초 한 번만 전역 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"],
});
});
연결 때 받은 값을 모든 메시지에 그대로 넣습니다.
보낼 때마다 1씩 증가시키고, 이전 번호는 무시합니다.
start에서 받은 현재 실행 ID만 허용합니다.
명령 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");
}
}
pause ACK를 보내기 전에 requestAnimationFrame, 타이머, 물리 계산과 점수 변화를 모두 멈춰야 합니다.
GAME EVENTS
점수가 바뀔 때 현재 실행의 runId와 정수를 보냅니다. 초당 10회 이하를 권장합니다.
send("score", {
runId,
score: 1200,
});
목숨 소진이나 제한 시간 종료 시 1–100,000,000 범위의 최종 점수를 한 실행에 한 번만 보냅니다.
send("gameOver", {
runId,
score: finalScore,
});
score는 0–100,000,000 사이의 안전한 정수gameOver 점수는 랭킹 저장을 위해 1 이상score를 전송하지 않음CONNECTION CHECK
이름, slug, 소개, 실행 URL과 랭킹 정렬을 입력합니다.
미리보기 안에서 직접 플레이해 첫 점수와 게임 종료를 발생시킵니다.
ready → start → score → pause → resume → 새 score → gameOver 순서와 1점 이상의 최종 점수를 검사합니다. 플레이 입력을 기다리는 각 단계는 60초 안에 완료하세요.
모든 항목을 통과하면 공개 버튼이 활성화되고 게임 목록과 랭킹에 추가됩니다.
복사 가능한 전체 구현은 프로젝트의 examples/game-sdk-starter/game.js, 저장용 상세 문서는 docs/ADDING_A_GAME.md에 있습니다.
BEFORE PUBLISH
외부 게임의 점수는 게임 클라이언트가 보고하므로 서버가 플레이 자체를 검증하지는 않습니다. 계정당 게임은 20개까지 등록되고 공개 목록에는 최신 100개가 표시됩니다. 금전성 보상이나 공식 대회에는 별도의 서버 검증이 필요합니다.
URL 검사는 입력된 호스트명과 IP 주소만 확인하며 DNS 해석 결과와 이후 리다이렉트까지 보증하지 않습니다. 공개 운영 시에는 신고·삭제 또는 승인 절차를 추가하세요.