# Cykl życia gry w PlayDrop: ładowanie, gotowość, pauza i dźwięk

Zainicjuj SDK, zgłoś gotowość przy pierwszej grywalnej klatce, wstrzymuj i wznawiaj grę, przestrzegaj zasad dźwięku i wstępnie ładuj pliki do gry offline.

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

PlayDrop wyświetla wokół twojej gry własny ekran ładowania, menu pauzy, wyciszenie i inne okna. API cyklu życia utrzymuje grę w zgodzie z nimi: gra zatrzymuje się, gdy PlayDrop ją wstrzymuje, i odtwarza dźwięk tylko wtedy, gdy pozwalają na to zasady dźwięku PlayDrop.

## Zainicjuj, a potem zgłoś gotowość

Załaduj SDK, odczytaj stan początkowy, zasubskrybuj zmiany, przygotuj pierwszy ekran i dopiero wtedy wywołaj `ready()`. Do tego momentu PlayDrop pokazuje swój ekran ładowania.

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

Wywołaj `ready()`, gdy zaprojektowany pierwszy ekran jest widoczny, a sterowanie działa, a nie przed załadowaniem zasobów. `sdk.host.error(message)` informuje PlayDrop, że gra nie może wystartować. `setLoadingState` i `firstFrameReady` to starsze nazwy tego samego kroku; używaj `ready()`.

## Fazy: podgląd, gra i edytor

`sdk.host.phase` ma wartość `preview`, `play` lub `editor`, a `onPhaseChange` zgłasza zmiany. Podglądy i przechwytywanie pokazują grę bez prawdziwej sesji: nigdy nie zapisuj postępów, wyników, osiągnięć ani zakupów poza fazą `play`. `sdk.host.mode` ma zwykle wartość `play`, a w lokalnej ramce Dev wartość `dev`.

## Pauza i wznowienie

`onPause(reason)` i `onResume(reason)` są wywoływane, gdy gracz otwiera menu pauzy, ukrywa kartę przeglądarki, loguje się lub coś kupuje albo gdy grę zasłania reklama lub okno PlayDrop. `reason` to jedna z wartości `tab_hidden`, `auth_prompt`, `purchase_flow`, `host_overlay`, `detail_hidden`, `route_change` lub `native_background`; `sdk.host.isPaused` podaje bieżący stan.

Podczas pauzy zatrzymaj symulację i liczniki czasu. Po wznowieniu zresetuj zegar klatek, aby gra nie przeskoczyła do przodu:

```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 i przycisk Menu kontrolera należą do menu pauzy PlayDrop; nie przypisuj ich w grze. W grze sieciowej utrzymuj połączenie z pokojem podczas pauzy: wstrzymanie gry jednego gracza nie może zatrzymać pozostałych.

## Dźwięk

Odczytaj `sdk.host.audioAllowed` raz po `init()`, a potem reaguj na `onAudioAllowedChange`. Ta wartość łączy wyciszenie przez gracza, fazę i pauzę, a podczas pauzy z powodu ukrytej karty pozostaje równa true, aby muzyka mogła zachować pozycję odtwarzania. `onAudioPolicyChange` zgłasza `{ enabled, reason, volume }`, gdy potrzebujesz też powodu lub głośności hosta.

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

Dźwięk jest wyciszony, dopóki host na niego nie pozwoli, a przeglądarki i tak wymagają gestu gracza przed odtworzeniem dźwięku. Ustawienie głośności w grze traktuj jako dodatkowy limit; wyciszenie hosta zawsze ma pierwszeństwo. Przechwytuj odrzucone obietnice `play()` i `resume()`.

## Wstępne ładowanie i gra offline w aplikacjach

Aplikacje natywne mogą pobrać pliki gry przed jej startem i zachować je do gry offline. Zadeklaruj je w [catalogue.json](https://www.playdrop.ai/pl/create/learn/catalogue-json):

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

Strona wejściowa jest zawsze dołączona. Pliki `required` są pobierane przed grą, a `optional` po jej starcie. `offlineSupported: true` pozwala aplikacjom oferować grę offline, gdy jej wymagane pliki są już zapisane. Nieprawidłowe wartości są ignorowane i nigdy nie blokują przesłania. Strona internetowa ładuje gry jak zwykle. W grach [Instant](https://www.playdrop.ai/pl/create/learn/instant-games) wymagane pliki stanowią rozmiar startowy.

Na hostach obsługujących dane na urządzeniu zapisy, wyniki i osiągnięcia zdobyte offline zostają na urządzeniu i synchronizują się po połączeniu z siecią; rankingi offline pokazują tylko najlepszy wynik samego gracza. W przeglądarce nie ma kolejki offline, więc obsłuż nieudany zapis. Wszystko, co gra ładuje z internetu, nadal wymaga połączenia.

## Wibracje

W aplikacjach natywnych `sdk.haptics.selection()`, `impact("light" | "medium" | "heavy")` i `notification("success" | "warning" | "error")` dają krótką informację zwrotną przez wibracje; `sdk.haptics.supported` mówi, czy host to potrafi. W sieci nic nie robią i nie zależą od wyciszenia.

## Powiązane poradniki

- [Pełny ekran i bezpieczne obszary](https://www.playdrop.ai/pl/create/learn/viewport): Spraw, by gra PlayDrop wypełniała ekran, a jej interfejs mieścił się w bezpiecznych obszarach CSS i omijał przyciski hosta dzięki reservedCorners z SDK.
- [Zapisy w chmurze](https://www.playdrop.ai/pl/create/learn/cloud-saves): Zapisuj i wczytuj postępy graczy przez sdk.me.appData i sdk.me.updateAppData, dla gości i zalogowanych, z zasadami zapisu, podglądów i gry offline.
- [Gry Instant](https://www.playdrop.ai/pl/create/learn/instant-games): Co sprawia, że gra PlayDrop jest Instant: tryb pionowy, dostęp dla gości, do 10 MiB plików startowych i start w 2 sekundy, oraz czym różni się od zwykłej gry.
- [SDK klienta](https://www.playdrop.ai/pl/create/learn/sdk): SDK PlayDrop w przeglądarce: cykl życia hosta, gracz i zapisy, kontrolery, funkcje społecznościowe, gra wieloosobowa, sklep, reklamy, rankingi, zasoby i AI.
