# Spelets livscykel på PlayDrop: inläsning, ready, paus och ljud

Initiera PlayDrop-SDK:t, signalera ready vid den första spelbara bildrutan, pausa och återuppta snyggt, följ ljudpolicyn och förladda filer för offlinespel.

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

PlayDrop visar en egen inläsningsskärm, pausmeny, ljudavstängning och andra fönster runt ditt spel. Livscykel-API:et håller spelet i takt med dem: det stannar medan PlayDrop pausar det och spelar bara ljud när PlayDrops ljudpolicy tillåter det.

## Initiera och signalera sedan ready

Läs in SDK:t, läs det första tillståndet, prenumerera på ändringar, förbered den första skärmen och anropa först då `ready()`. PlayDrop visar sin inläsningsskärm fram till dess.

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

Anropa `ready()` när den planerade första skärmen syns och inmatningen fungerar, inte innan dina assets har lästs in. `sdk.host.error(message)` talar om för PlayDrop att spelet inte kan starta. `setLoadingState` och `firstFrameReady` är äldre namn för samma steg; använd `ready()`.

## Faser: förhandsvisning, spel och editor

`sdk.host.phase` är `preview`, `play` eller `editor`, och `onPhaseChange` rapporterar byten. Förhandsvisningar och inspelningar visar spelet utan en riktig session: skriv aldrig sparningar, poäng, prestationer eller köp utanför `play`. `sdk.host.mode` är normalt `play` och `dev` i den lokala Dev-ramen.

## Pausa och återuppta

`onPause(reason)` och `onResume(reason)` utlöses när spelaren öppnar pausmenyn, döljer fliken, loggar in eller köper något, eller när en annons eller ett PlayDrop-fönster täcker spelet. `reason` är någon av `tab_hidden`, `auth_prompt`, `purchase_flow`, `host_overlay`, `detail_hidden`, `route_change` eller `native_background`; `sdk.host.isPaused` är det aktuella tillståndet.

Stoppa simulering och timers medan spelet är pausat. När det återupptas nollställer du bildruteklockan så att spelet inte hoppar framåt:

```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 och handkontrollens Menu-knapp hör till PlayDrops pausmeny; bind dem inte i ditt spel. I ett nätverksspel håller du rumsanslutningen vid liv under pausen: att en spelare pausar får inte stoppa de andra.

## Ljud

Läs `sdk.host.audioAllowed` en gång efter `init()` och följ sedan `onAudioAllowedChange`. Värdet kombinerar spelarens ljudavstängning, fasen och pausen, och förblir true under en paus med dold flik så att musiken kan behålla sin position. `onAudioPolicyChange` rapporterar `{ enabled, reason, volume }` när du också behöver orsaken eller värdens volym.

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

Ljudet är avstängt tills värden tillåter det, och webbläsare kräver fortfarande en spelarhandling innan ljud spelas. Behåll en eventuell volyminställning i spelet som en extra begränsning; värdens ljudavstängning vinner alltid. Fånga avvisade promise-objekt från `play()` och `resume()`.

## Förladda och spela offline i apparna

De inbyggda apparna kan ladda ner ett spels filer innan det startar och behålla dem för offlinespel. Deklarera dem i [catalogue.json](https://www.playdrop.ai/sv/create/learn/catalogue-json):

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

Startsidan ingår alltid. Filer i `required` hämtas före spelstart och filer i `optional` efteråt. `offlineSupported: true` låter apparna erbjuda spelet offline när dess obligatoriska filer har sparats. Ogiltiga värden ignoreras och stoppar aldrig en uppladdning. Webbplatsen läser in spel som vanligt. För [Instant](https://www.playdrop.ai/sv/create/learn/instant-games)-spel utgör de obligatoriska filerna startstorleken.

På värdar som anger stöd för enhetsdata stannar sparningar, poäng och prestationer som görs offline på enheten och synkroniseras när den är online; topplistor offline visar bara spelarens eget rekord. I en webbläsare finns ingen offlinekö, så hantera en misslyckad sparning. Allt som spelet läser in från internet kräver fortfarande en anslutning.

## Haptik

I de inbyggda apparna ger `sdk.haptics.selection()`, `impact("light" | "medium" | "heavy")` och `notification("success" | "warning" | "error")` kort återkoppling; `sdk.haptics.supported` talar om ifall värden klarar det. De gör ingenting på webben och påverkas inte av ljudavstängningen.

## Relaterade guider

- [Helskärm och säkra områden](https://www.playdrop.ai/sv/create/learn/viewport): Låt ett PlayDrop-spel fylla skärmen och håll HUD:en inom CSS-säkra områden och fri från värdens kontroller med SDK:ts uppmätta reservedCorners.
- [Molnsparningar](https://www.playdrop.ai/sv/create/learn/cloud-saves): Spara och läs in spelarens framsteg med sdk.me.appData och updateAppData, för gäster och inloggade, med regler för skrivningar, förhandsvisningar och offline.
- [Instant-spel](https://www.playdrop.ai/sv/create/learn/instant-games): Det här gör ett PlayDrop-spel till Instant: stående format, gäståtkomst, högst 10 MiB startfiler och start på två sekunder, och skillnaden mot vanliga spel.
- [Klient-SDK](https://www.playdrop.ai/sv/create/learn/sdk): Referens för PlayDrops webbläsar-SDK: livscykel, identitet och sparningar, handkontroller, socialt, flerspelarläge, butik, annonser, topplistor, assets och AI.
