# Levenscyclus van een PlayDrop-game: laden, klaar, pauze en audio

Initialiseer de PlayDrop-SDK, meld klaar bij het eerste speelbare frame, pauzeer en hervat netjes, volg het audiobeleid en laad vooraf voor apps en offline.

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

PlayDrop toont rond je game een eigen laadscherm, pauzemenu, dempknop en andere vensters. De levenscyclus-API houdt de game daarmee in de pas: hij stopt zolang PlayDrop hem pauzeert en speelt alleen geluid af als het audiobeleid van PlayDrop dat toestaat.

## Initialiseer en meld daarna klaar

Laad de SDK, lees de begintoestand, abonneer je op wijzigingen, maak het eerste scherm klaar en roep pas dan `ready()` aan. Tot dat moment laat PlayDrop zijn laadscherm staan.

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

Roep `ready()` aan zodra het ontworpen eerste scherm zichtbaar is en de invoer werkt, niet voordat de assets geladen zijn. `sdk.host.error(message)` laat PlayDrop weten dat de game niet kan starten. `setLoadingState` en `firstFrameReady` zijn oudere namen voor dezelfde stap; gebruik `ready()`.

## Fasen: voorbeeld, spelen en editor

`sdk.host.phase` is `preview`, `play` of `editor`, en `onPhaseChange` meldt wisselingen. Voorbeelden en opnames tonen de game zonder echte sessie: schrijf buiten `play` nooit saves, scores, prestaties of aankopen weg. `sdk.host.mode` is normaal `play` en `dev` in het lokale Dev-frame.

## Pauzeren en hervatten

`onPause(reason)` en `onResume(reason)` worden geactiveerd wanneer de speler het pauzemenu opent, het tabblad verbergt, inlogt of iets koopt, of wanneer een advertentie of een PlayDrop-venster de game bedekt. `reason` is een van `tab_hidden`, `auth_prompt`, `purchase_flow`, `host_overlay`, `detail_hidden`, `route_change` of `native_background`; `sdk.host.isPaused` is de huidige toestand.

Stop tijdens de pauze de simulatie en de timers. Zet bij het hervatten je frameklok terug, zodat de game niet vooruitspringt:

```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);
```

Escape en de Menu-knop van een controller horen bij het pauzemenu van PlayDrop; koppel ze niet aan acties in je game. Houd in een netwerkgame de verbinding met de kamer actief tijdens de pauze: als één speler pauzeert, mogen de anderen niet stilvallen.

## Audio

Lees `sdk.host.audioAllowed` één keer na `init()` en volg daarna `onAudioAllowedChange`. Het combineert het dempen door de speler, de fase en de pauze, en blijft true tijdens een pauze door een verborgen tabblad, zodat muziek haar positie kan behouden. `onAudioPolicyChange` meldt `{ enabled, reason, volume }` als je ook de reden of het volume van de host nodig hebt.

```js
const audio = new AudioContext();
function setAudio(allowed) {
  (allowed ? audio.resume() : audio.suspend()).catch(() => {});
}
```

Audio begint gedempt tot de host het toestaat, en browsers hebben nog steeds een actie van de speler nodig voordat er geluid klinkt. Houd een volume-instelling in de game aan als extra limiet; het dempen door de host wint altijd. Vang geweigerde promises van `play()` en `resume()` af.

## Vooraf laden en offline spelen in de apps

De native apps kunnen de bestanden van een game downloaden voordat hij start en ze bewaren om offline te spelen. Declareer ze in [catalogue.json](https://www.playdrop.ai/nl/create/learn/catalogue-json):

```json
{
  "prefetch": { "required": ["game.js", "assets/level-1.png"], "optional": ["assets/music.mp3"] },
  "offlineSupported": true
}
```

De startpagina hoort er altijd bij. Bestanden in `required` worden vóór het spelen opgehaald, die in `optional` daarna. Met `offlineSupported: true` kunnen de apps de game offline aanbieden zodra de vereiste bestanden zijn opgeslagen. Ongeldige waarden worden genegeerd en blokkeren nooit een upload. De website laadt games zoals gewoonlijk. Voor [Instantgames](https://www.playdrop.ai/nl/create/learn/instant-games) bepalen de vereiste bestanden de startgrootte.

Op hosts die ondersteuning voor apparaatgegevens aangeven, blijven saves, scores en prestaties die offline zijn behaald op het apparaat en worden ze gesynchroniseerd zodra er verbinding is; offline tonen ranglijsten alleen het eigen record van de speler. In een browser is er geen offlinewachtrij, dus vang een mislukte save af. Alles wat de game van internet laadt, heeft nog steeds een verbinding nodig.

## Haptische feedback

In de native apps geven `sdk.haptics.selection()`, `impact("light" | "medium" | "heavy")` en `notification("success" | "warning" | "error")` korte feedback; `sdk.haptics.supported` meldt of de host dat kan. Op het web doen ze niets, en ze staan los van dempen.

## Gerelateerde gidsen

- [Schermvullend en veilige zones](https://www.playdrop.ai/nl/create/learn/viewport): Laat een PlayDrop-game het scherm vullen en houd de HUD binnen de CSS-veilige zones en vrij van de hostknoppen met de gemeten reservedCorners van de SDK.
- [Cloudsaves](https://www.playdrop.ai/nl/create/learn/cloud-saves): Sla voortgang op en laad die met sdk.me.appData en sdk.me.updateAppData, voor gasten en ingelogde spelers, met regels voor opslaan, voorbeelden en offline.
- [Instantgames](https://www.playdrop.ai/nl/create/learn/instant-games): Wat een PlayDrop-game Instant maakt: staand spelen, gasttoegang, maximaal 10 MiB startbestanden, start binnen twee seconden, en het verschil met een gewone game.
- [Client-SDK](https://www.playdrop.ai/nl/create/learn/sdk): De PlayDrop-browser-SDK: init, host, speler en saves, controllers, sociaal, multiplayer, winkel, advertenties, ranglijsten, prestaties, assets en AI.
