# Spillets livssyklus på PlayDrop: lasting, klar, pause og lyd

Initialiser PlayDrop-SDK-en, meld klar ved første spillbare bilde, sett på pause og gjenoppta ryddig, følg lydreglene og forhåndslast filer for spill uten nett.

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

PlayDrop viser sin egen lasteskjerm, pausemeny, lydkontroll og andre vinduer rundt spillet ditt. Livssyklus-API-et holder spillet i takt med dem: det stopper mens PlayDrop setter det på pause, og spiller bare lyd når PlayDrops lydregler tillater det.

## Initialiser, og meld deretter klar

Last SDK-en, les starttilstanden, abonner på endringer, klargjør den første skjermen og kall først da `ready()`. PlayDrop viser lasteskjermen sin frem til da.

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

Kall `ready()` når den planlagte første skjermen er synlig og inndata fungerer, ikke før ressursene er lastet. `sdk.host.error(message)` forteller PlayDrop at spillet ikke kan starte. `setLoadingState` og `firstFrameReady` er eldre navn på det samme trinnet; bruk `ready()`.

## Faser: forhåndsvisning, spill og editor

`sdk.host.phase` er `preview`, `play` eller `editor`, og `onPhaseChange` rapporterer bytter. Forhåndsvisninger og opptak viser spillet uten en ekte økt: skriv aldri lagringer, poengsummer, prestasjoner eller kjøp utenfor `play`. `sdk.host.mode` er `play` til vanlig og `dev` i den lokale Dev-rammen.

## Pause og gjenoppta

`onPause(reason)` og `onResume(reason)` utløses når spilleren åpner pausemenyen, skjuler fanen, logger inn, kjøper noe, eller når en annonse eller et PlayDrop-vindu dekker spillet. `reason` er en av `tab_hidden`, `auth_prompt`, `purchase_flow`, `host_overlay`, `detail_hidden`, `route_change` eller `native_background`; `sdk.host.isPaused` er den nåværende tilstanden.

Mens spillet står på pause, stopper du simulering og tidtakere. Når det gjenopptas, nullstiller du tidsmålingen mellom bildene slik at spillet ikke hopper fremover:

```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 og Meny-knappen på en kontroller hører til PlayDrops pausemeny; ikke knytt dem til noe i spillet ditt. I et nettverksspill holder du romtilkoblingen i live under pause: at én spiller setter på pause, må ikke stoppe de andre.

## Lyd

Les `sdk.host.audioAllowed` én gang etter `init()`, og følg deretter `onAudioAllowedChange`. Verdien kombinerer spillerens demping, fasen og pausen, og forblir sann under en pause med skjult fane, slik at musikken kan beholde posisjonen sin. `onAudioPolicyChange` rapporterer `{ enabled, reason, volume }` når du også trenger årsaken eller vertens volum.

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

Lyden starter dempet til verten tillater den, og nettlesere krever fortsatt en handling fra spilleren før lyd spilles av. Behold en eventuell voluminnstilling i spillet som en ekstra grense; vertens demping vinner alltid. Fang opp avviste `play()`- og `resume()`-promiser.

## Forhåndslast og spill uten nett i appene

De native appene kan laste ned et spills filer før det starter, og beholde dem for spill uten nett. Deklarer dem i [catalogue.json](https://www.playdrop.ai/nb/create/learn/catalogue-json):

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

Inngangssiden er alltid med. `required`-filer hentes før spillet starter, `optional`-filer etterpå. `offlineSupported: true` lar appene tilby spillet uten nett når de påkrevde filene er lagret. Ugyldige verdier ignoreres og blokkerer aldri en opplasting. Nettstedet laster spill som vanlig. For [Instant](https://www.playdrop.ai/nb/create/learn/instant-games)-spill utgjør de påkrevde filene oppstartsstørrelsen.

På verter som oppgir støtte for enhetsdata, blir lagringer, poengsummer og prestasjoner oppnådd uten nett liggende på enheten og synkroniseres når den er på nett igjen; topplister uten nett viser bare spillerens egen rekord. I en nettleser finnes det ingen kø for lagringer uten nett, så håndter en mislykket lagring. Alt spillet laster fra internett, krever fortsatt tilkobling.

## Haptikk

I de native appene gir `sdk.haptics.selection()`, `impact("light" | "medium" | "heavy")` og `notification("success" | "warning" | "error")` kort tilbakemelding; `sdk.haptics.supported` forteller om verten støtter det. De gjør ingenting på nettet og er uavhengige av demping.

## Relaterte veiledninger

- [Fullskjerm og trygge områder](https://www.playdrop.ai/nb/create/learn/viewport): Få et PlayDrop-spill til å fylle skjermen, og hold HUD-en innenfor CSS-trygge områder og unna vertens kontroller med SDK-ens målte reservedCorners.
- [Skylagring](https://www.playdrop.ai/nb/create/learn/cloud-saves): Lagre og hent fremgang med sdk.me.appData og updateAppData for gjester og innloggede spillere, med regler for skriving, forhåndsvisninger og spill uten nett.
- [Instant-spill](https://www.playdrop.ai/nb/create/learn/instant-games): Hva som gjør et PlayDrop-spill Instant: stående format, gjestetilgang, høyst 10 MiB oppstartsfiler, start på to sekunder, og forskjellen fra vanlige spill.
- [Klient-SDK](https://www.playdrop.ai/nb/create/learn/sdk): Referanse for PlayDrops nettleser-SDK: livssyklus, identitet og lagring, kontrollere, sosialt, flerspiller, butikk, annonser, topplister, ressurser og KI.
