PlayDrop ゲームの共有、フレンド、招待
画像やクリップを添えてゲームを共有し、起動ペイロードを読み取り、フレンドを選んで PlayDrop Chat で招待カードや挑戦カードを送り、ほかのゲームをおすすめします。
共有シート、フレンドリスト、チャットは PlayDrop が担当し、ゲームはちょうどいいタイミングでそれらを呼び出します。プレイヤーが友達を連れてきて、その友達があなたのゲームにやって来ます。
ゲームを共有する
タップやクリックから sdk.host.share() を呼び出します。ゲームの公開ページを、任意のテキスト、画像または短い動画、任意の起動ペイロードを添えて共有します。
shareButton.addEventListener("click", async () => {
try {
await sdk.host.share({ text: `I reached level ${level} in Moon Jump`, image: scoreCardBlob, payload: "level-7" });
} catch (error) {
console.warn("Share failed", error);
}
});image:最大 8 MiB の GIF、JPEG、PNG、WebP の Blob。画像を添付できないホストでは、リンクだけが共有されます。video:画像の代わりに使う、最大15秒、20,000,000 バイトの MP4 の Blob。16:9、9:16、1:1 の 1080p、H.264/AAC がいちばん適しています。動画に対応していないホストは、普通のリンクを共有するのではなく、host_share_video_unsupportedで拒否します。- Blob はタップの前に用意しておいてください。タップのあとで生成すると、ブラウザの共有の許可が失われることがあります。
- 独自の URL やほかのファイルは共有できません。リンクは常にゲームのページです。
画像のエラーは invalid_host_share_image、host_share_image_type、host_share_image_too_large です。
起動ペイロードを読み取る
payload は最大256文字の base64url です。共有リンクを開いたプレイヤーがゲームを始めると、sdk.host.launchPayload にその値が入ります。ない場合は null です。信頼できない入力として扱ってください。内容を検証し、ペイロードが指すルームにそのプレイヤーが参加してよいかをサーバーで確認します。認証情報は絶対に入れないでください。
フレンドを選んでゲームカードを送る
sdk.social.selectFriends({ max }) は PlayDrop のフレンド選択画面(1〜10人、既定は1人)を開き、プレイヤーが選んだフレンドだけを返します。キャンセルした場合は [] を返します。そのあと、PlayDrop Chat に表示されるカードを送ります。
const [friend] = await sdk.social.selectFriends({ max: 1 });
if (friend) {
await sdk.social.sendMessage({
recipientUserId: friend.id,
type: "challenge",
title: "Beat my time: 42.3 s",
subtitle: "Moon Jump, level 7",
payload: "level-7",
clientMessageId: `challenge-${runId}-${friend.id}`,
});
}typeはinvite、request、gift、challenge、turnのいずれかです。titleは最大80文字、subtitleは最大160文字です。expiresInSecondsは60秒から30日(既定値)までです。clientMessageIdがあると安全に再試行できます。同じ値を再利用すると、元のメッセージが返されます。- メッセージを送れる相手は、プレイヤーが選んだフレンド、このゲームを遊んでいるフレンド、すでにゲームのメッセージをやり取りしているプレイヤーです。マッチメイキングで出会った知らない人にはメッセージを送れません。
届いたカードは getMessages({ limit }) で古い順に読み取り、それぞれ consumeMessage(message.id) で処理済みにします。送信者は message.from.id です。
const page = await sdk.social.getMessages({ limit: 20 });
for (const message of page.messages) {
await applyCard(message.type, message.from.id, message.payload);
await sdk.social.consumeMessage(message.id);
}null になるまで、cursor: page.nextCursor で続きを読み取ります。
このゲームを遊んでいるフレンド
sdk.social.listGameFriends() は、このゲームで最近セッションがあったフレンドを返します。「一緒に遊ぶ」ボタンにちょうどいいリストです。フレンドリスト全体やオンライン状態は公開されません。openProfile(userId) はプレイヤーのプロフィールを開き、openChat({ recipientUserId, draftMessage }) は、編集できる下書き付きでチャットを開きます。送信するのはプレイヤー自身です。
友達経由でやって来た新しいプレイヤーには、sdk.host.launchFriend が設定されていることがあります。その友達と一緒に遊ぶことを提案し、selectFriends({ max: 1 }) で確認してください。何かを自動で始めるのは絶対にやめてください。
ほかのゲームをおすすめする
ゲームオーバーなどの自然な区切りで sdk.host.showGames({ games: ["@creator/name"] }) を呼び出すと、ほかの公開ゲーム1〜3本の PlayDrop カードを表示し、あなたのゲームを一時停止します。結果は played(PlayDrop がそのゲームに切り替えます)か dismissed です。sdk.host.preloadGame(ref) は、プレイヤーが次に開きそうなゲームを PlayDrop に伝えます。