Cycle de vie d’un jeu PlayDrop : chargement, prêt, pause et audio
Initialisez le SDK, signalez ready dès la première image jouable, gérez pause, reprise et audio de l’hôte, et préchargez pour les apps et le jeu hors ligne.
PlayDrop affiche autour de votre jeu son propre écran de chargement, son menu pause, sa commande de sourdine et d’autres fenêtres. L’API de cycle de vie garde le jeu synchronisé avec eux : il s’arrête pendant que PlayDrop le met en pause et ne joue du son que lorsque la politique audio de PlayDrop l’autorise.
Initialisez, puis signalez que le jeu est prêt
Chargez le SDK, lisez l’état initial, abonnez-vous aux changements, préparez le premier écran, et seulement ensuite appelez ready(). PlayDrop garde son écran de chargement affiché jusque-là.
<script src="https://assets.playdrop.ai/sdk/playdrop.js"></script>
<script type="module">
const sdk = await playdrop.init();
let paused = sdk.host.isPaused;
setAudio(sdk.host.audioAllowed);
sdk.host.onAudioAllowedChange(setAudio);
sdk.host.onPause(() => { paused = true; });
sdk.host.onResume(() => { paused = false; last = performance.now(); });
try {
await loadFirstLevel();
} catch (error) {
sdk.host.error("Could not load the first level");
throw error;
}
drawFirstFrame();
sdk.host.ready();
</script>Appelez ready() une fois que le premier écran prévu est visible et que les commandes répondent, et pas avant le chargement des ressources. sdk.host.error(message) indique à PlayDrop que le jeu ne peut pas démarrer. setLoadingState et firstFrameReady sont d’anciens noms de cette même étape ; utilisez ready().
Phases : aperçu, jeu et éditeur
sdk.host.phase vaut preview, play ou editor, et onPhaseChange signale les changements. Les aperçus et les captures montrent le jeu sans véritable session : n’écrivez jamais de sauvegardes, de scores, de succès ni d’achats en dehors de play. sdk.host.mode vaut normalement play, et dev dans le cadre Dev local.
Pause et reprise
onPause(reason) et onResume(reason) se déclenchent quand le joueur ouvre le menu pause, masque l’onglet, se connecte, achète quelque chose, ou quand une publicité ou une fenêtre PlayDrop recouvre le jeu. reason vaut tab_hidden, auth_prompt, purchase_flow, host_overlay, detail_hidden, route_change ou native_background ; sdk.host.isPaused donne l’état actuel.
Pendant la pause, arrêtez la simulation et les minuteurs. À la reprise, réinitialisez votre horloge d’images pour que le jeu ne fasse pas un bond en avant :
let last = performance.now();
function frame(now) {
const dt = paused ? 0 : Math.min((now - last) / 1000, 0.05);
last = now;
if (!paused) update(dt);
render();
requestAnimationFrame(frame);
}
requestAnimationFrame(frame);Échap et le bouton Menu d’une manette appartiennent au menu pause de PlayDrop ; ne leur associez aucune action dans votre jeu. Dans un jeu en réseau, maintenez la connexion à la salle pendant la pause : la pause d’un joueur ne doit pas arrêter les autres.
Audio
Lisez sdk.host.audioAllowed une fois après init(), puis suivez onAudioAllowedChange. Cette valeur combine la sourdine du joueur, la phase et la pause, et reste vraie pendant une pause due à un onglet masqué, pour que la musique garde sa position. onAudioPolicyChange transmet { enabled, reason, volume } quand vous avez aussi besoin de la raison ou du volume de l’hôte.
const audio = new AudioContext();
function setAudio(allowed) {
(allowed ? audio.resume() : audio.suspend()).catch(() => {});
}L’audio démarre coupé jusqu’à ce que l’hôte l’autorise, et les navigateurs exigent toujours un geste du joueur avant de jouer du son. Gardez un éventuel réglage de volume propre au jeu comme limite supplémentaire ; la sourdine de l’hôte l’emporte toujours. Interceptez les promesses play() et resume() rejetées.
Préchargement et jeu hors ligne dans les apps
Les apps natives peuvent télécharger les fichiers d’un jeu avant son démarrage et les conserver pour jouer hors ligne. Déclarez-les dans catalogue.json :
{
"prefetch": { "required": ["game.js", "assets/level-1.png"], "optional": ["assets/music.mp3"] },
"offlineSupported": true
}La page d’entrée est toujours incluse. Les fichiers required sont récupérés avant de jouer, les fichiers optional après. offlineSupported: true permet aux apps de proposer le jeu hors ligne une fois ses fichiers requis enregistrés. Les valeurs non valides sont ignorées et ne bloquent jamais un envoi. Le site web charge les jeux comme d’habitude. Pour les jeux instantanés, les fichiers requis constituent la taille de démarrage.
Sur les hôtes qui annoncent la prise en charge des données sur l’appareil, les sauvegardes, scores et succès réalisés hors ligne restent sur l’appareil et se synchronisent une fois en ligne ; hors ligne, les classements n’affichent que le record du joueur. Dans un navigateur, il n’existe pas de file d’attente hors ligne : gérez donc l’échec d’une sauvegarde. Tout ce que le jeu charge depuis Internet nécessite toujours une connexion.
Retours haptiques
Dans les apps natives, sdk.haptics.selection(), impact("light" | "medium" | "heavy") et notification("success" | "warning" | "error") produisent une courte vibration ; sdk.haptics.supported indique si l’hôte en est capable. Ces appels sont sans effet sur le Web et indépendants de la sourdine.