# 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.

Source: https://www.playdrop.ai/fr/create/learn/lifecycle

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à.

```html
<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 :

```js
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.

```js
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](https://www.playdrop.ai/fr/create/learn/catalogue-json) :

```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](https://www.playdrop.ai/fr/create/learn/instant-games), 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.

## Guides associés

- [Plein écran et zones sûres](https://www.playdrop.ai/fr/create/learn/viewport): Un jeu PlayDrop en plein écran, avec une interface dans les zones sûres CSS et loin des commandes de l’hôte grâce aux reservedCorners mesurés par le SDK.
- [Sauvegardes cloud](https://www.playdrop.ai/fr/create/learn/cloud-saves): Enregistrez et chargez la progression avec sdk.me.appData et sdk.me.updateAppData, pour invités et joueurs connectés : écritures, aperçus et hors ligne.
- [Jeux instantanés](https://www.playdrop.ai/fr/create/learn/instant-games): Ce qui rend un jeu PlayDrop instantané : portrait, invités, au plus 10 MiB de fichiers de démarrage, lancement en deux secondes, et la différence avec un jeu classique.
- [SDK client](https://www.playdrop.ai/fr/create/learn/sdk): SDK navigateur de PlayDrop : init, hôte, joueur et sauvegardes, manettes, social, multijoueur, boutique, publicités, classements, succès, ressources et IA.
