# Pelin elinkaari PlayDropissa: lataus, valmius, tauko ja ääni

Alusta SDK, ilmoita valmiudesta ensimmäisellä pelattavalla ruudulla, hoida tauko ja jatko, noudata äänikäytäntöä ja esilataa tiedostot offline-käyttöön.

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

PlayDrop näyttää pelisi ympärillä oman latausruutunsa, taukovalikkonsa, mykistyssäätimensä ja muita ikkunoita. Elinkaarirajapinta pitää pelin tahdissa niiden kanssa: peli pysähtyy, kun PlayDrop keskeyttää sen, ja soittaa ääntä vain, kun PlayDropin äänikäytäntö sallii.

## Alusta ja ilmoita sitten valmiudesta

Lataa SDK, lue alkutila, tilaa muutokset, valmistele ensimmäinen ruutu ja kutsu vasta sitten `ready()`. PlayDrop pitää latausruutunsa näkyvissä siihen asti.

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

Kutsu `ready()`, kun suunniteltu ensimmäinen ruutu näkyy ja syöte toimii, älä ennen kuin resurssit ovat latautuneet. `sdk.host.error(message)` kertoo PlayDropille, ettei peli voi käynnistyä. `setLoadingState` ja `firstFrameReady` ovat saman vaiheen vanhempia nimiä; käytä `ready()`-kutsua.

## Vaiheet: esikatselu, pelaaminen ja editori

`sdk.host.phase` on `preview`, `play` tai `editor`, ja `onPhaseChange` ilmoittaa vaihdoksista. Esikatselut ja kaappaukset näyttävät pelin ilman oikeaa istuntoa: älä koskaan kirjoita tallennuksia, pisteitä, saavutuksia tai ostoja `play`-vaiheen ulkopuolella. `sdk.host.mode` on tavallisesti `play` ja paikallisessa Dev-kehyksessä `dev`.

## Tauko ja jatkaminen

`onPause(reason)` ja `onResume(reason)` laukeavat, kun pelaaja avaa taukovalikon, piilottaa välilehden, kirjautuu sisään tai ostaa jotain, tai kun mainos tai PlayDropin ikkuna peittää pelin. `reason` on jokin arvoista `tab_hidden`, `auth_prompt`, `purchase_flow`, `host_overlay`, `detail_hidden`, `route_change` tai `native_background`; `sdk.host.isPaused` kertoo nykyisen tilan.

Pysäytä tauon ajaksi simulaatio ja ajastimet. Kun peli jatkuu, nollaa ruutukellosi, jotta peli ei hyppää eteenpäin:

```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 ja ohjaimen Menu-painike kuuluvat PlayDropin taukovalikolle; älä sido niitä pelissäsi. Verkkopelissä pidä huoneyhteys auki tauon aikana: yhden pelaajan tauko ei saa pysäyttää muita.

## Ääni

Lue `sdk.host.audioAllowed` kerran `init()`-kutsun jälkeen ja seuraa sitten `onAudioAllowedChange`-tapahtumaa. Arvo yhdistää pelaajan mykistyksen, vaiheen ja tauon, ja se pysyy tosena piilotetun välilehden tauon aikana, jotta musiikki voi säilyttää kohtansa. `onAudioPolicyChange` ilmoittaa `{ enabled, reason, volume }`, kun tarvitset myös syyn tai isännän äänenvoimakkuuden.

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

Ääni on aluksi mykistetty, kunnes isäntä sallii sen, ja selaimet vaativat silti pelaajan eleen ennen kuin ääntä kuuluu. Pidä pelin oma äänenvoimakkuusasetus lisärajana; isännän mykistys voittaa aina. Ota kiinni hylätyt `play()`- ja `resume()`-lupaukset.

## Esilataus ja offline-pelaaminen sovelluksissa

Natiivisovellukset voivat ladata pelin tiedostot ennen sen käynnistymistä ja säilyttää ne offline-pelaamista varten. Ilmoita ne tiedostossa [catalogue.json](https://www.playdrop.ai/fi/create/learn/catalogue-json):

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

Aloitussivu on aina mukana. `required`-tiedostot haetaan ennen pelaamista, `optional`-tiedostot sen jälkeen. `offlineSupported: true` antaa sovellusten tarjota pelin offline-tilassa, kun sen pakolliset tiedostot on tallennettu. Virheelliset arvot ohitetaan, eivätkä ne koskaan estä latausta. Verkkosivusto lataa pelit tavalliseen tapaan. [Instant](https://www.playdrop.ai/fi/create/learn/instant-games)-peleissä pakolliset tiedostot muodostavat aloituskoon.

Isännissä, jotka ilmoittavat tukevansa laitedataa, offline-tilassa tehdyt tallennukset, pisteet ja saavutukset pysyvät laitteella ja synkronoituvat, kun yhteys palaa; offline-tulostaulut näyttävät vain pelaajan oman ennätyksen. Selaimessa offline-jonoa ei ole, joten käsittele epäonnistunut tallennus. Kaikki, mitä peli lataa internetistä, vaatii yhä yhteyden.

## Haptiikka

Natiivisovelluksissa `sdk.haptics.selection()`, `impact("light" | "medium" | "heavy")` ja `notification("success" | "warning" | "error")` antavat lyhyen tuntopalautteen; `sdk.haptics.supported` kertoo, pystyykö isäntä siihen. Verkossa ne eivät tee mitään, eivätkä ne riipu mykistyksestä.

## Liittyvät oppaat

- [Koko näyttö ja turva-alueet](https://www.playdrop.ai/fi/create/learn/viewport): Täytä näyttö PlayDrop-pelillä ja pidä HUD CSS-turva-alueiden sisällä ja erillään isännän säätimistä SDK:n mittaamien reservedCorners-arvojen avulla.
- [Pilvitallennukset](https://www.playdrop.ai/fi/create/learn/cloud-saves): Tallenna ja lataa edistyminen sdk.me.appData- ja updateAppData-rajapinnoilla vieraille ja kirjautuneille sekä kirjoitus-, esikatselu- ja offline-säännöt.
- [Instant-pelit](https://www.playdrop.ai/fi/create/learn/instant-games): Mikä tekee PlayDrop-pelistä Instant-pelin: pystysuunta, vieraspääsy, enintään 10 MiB aloitustiedostoja, kahden sekunnin käynnistys ja ero tavallisiin peleihin.
- [Client SDK](https://www.playdrop.ai/fi/create/learn/sdk): Selain-SDK:n viite: elinkaari, identiteetti ja tallennukset, ohjaimet, sosiaaliset toiminnot, moninpeli, kauppa, mainokset, tulostaulut, resurssit ja tekoäly.
