# Spiel-Lebenszyklus auf PlayDrop: Laden, Bereit, Pause und Audio

PlayDrop-SDK initialisieren, beim ersten spielbaren Frame „bereit“ melden, sauber pausieren, der Audiorichtlinie folgen, Dateien für Apps und offline vorladen.

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

PlayDrop zeigt rund um dein Spiel einen eigenen Ladebildschirm, ein Pausenmenü, eine Stummschaltung und weitere Fenster. Die Lebenszyklus-API hält das Spiel damit im Gleichschritt: Es hält an, solange PlayDrop es pausiert, und spielt nur dann Ton ab, wenn die Audiorichtlinie von PlayDrop es erlaubt.

## Initialisieren, dann „bereit“ melden

Lade das SDK, lies den Anfangszustand, abonniere Änderungen, bereite den ersten Bildschirm vor und rufe erst dann `ready()` auf. Bis dahin lässt PlayDrop seinen Ladebildschirm stehen.

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

Rufe `ready()` auf, sobald der vorgesehene erste Bildschirm sichtbar ist und die Eingabe funktioniert, nicht schon bevor die Assets geladen sind. `sdk.host.error(message)` teilt PlayDrop mit, dass das Spiel nicht starten kann. `setLoadingState` und `firstFrameReady` sind ältere Namen für denselben Schritt; verwende `ready()`.

## Phasen: Vorschau, Spielen und Editor

`sdk.host.phase` ist `preview`, `play` oder `editor`, und `onPhaseChange` meldet Wechsel. Vorschauen und Aufnahmen zeigen das Spiel ohne echte Sitzung: Schreibe außerhalb von `play` niemals Spielstände, Punktwerte, Erfolge oder Käufe. `sdk.host.mode` ist normalerweise `play` und im lokalen Dev-Rahmen `dev`.

## Pausieren und fortsetzen

`onPause(reason)` und `onResume(reason)` werden ausgelöst, wenn der Spieler das Pausenmenü öffnet, den Tab ausblendet, sich anmeldet oder etwas kauft oder wenn Werbung oder ein PlayDrop-Fenster das Spiel verdeckt. `reason` ist einer der Werte `tab_hidden`, `auth_prompt`, `purchase_flow`, `host_overlay`, `detail_hidden`, `route_change` oder `native_background`; `sdk.host.isPaused` ist der aktuelle Zustand.

Halte während der Pause Simulation und Timer an. Setze beim Fortsetzen deine Frame-Uhr zurück, damit das Spiel nicht nach vorn springt:

```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 und die Menütaste eines Controllers gehören zum Pausenmenü von PlayDrop; belege sie in deinem Spiel nicht. Halte in einem Netzwerkspiel die Verbindung zum Raum während der Pause aufrecht: Wenn ein Spieler pausiert, dürfen die anderen nicht angehalten werden.

## Audio

Lies `sdk.host.audioAllowed` einmal nach `init()` und folge dann `onAudioAllowedChange`. Der Wert vereint die Stummschaltung des Spielers, die Phase und die Pause und bleibt während einer Pause durch einen ausgeblendeten Tab true, damit die Musik ihre Position behalten kann. `onAudioPolicyChange` meldet `{ enabled, reason, volume }`, wenn du zusätzlich den Grund oder die Lautstärke des Hosts brauchst.

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

Audio startet stumm, bis der Host es erlaubt, und Browser brauchen trotzdem eine Geste des Spielers, bevor Ton abgespielt wird. Behalte eine Lautstärkeeinstellung im Spiel als zusätzliche Begrenzung; die Stummschaltung des Hosts hat immer Vorrang. Fange abgelehnte Promises von `play()` und `resume()` ab.

## Vorladen und offline spielen in den Apps

Die nativen Apps können die Dateien eines Spiels vor dem Start herunterladen und sie zum Offline-Spielen behalten. Deklariere sie in der [catalogue.json](https://www.playdrop.ai/de/create/learn/catalogue-json):

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

Die Einstiegsseite ist immer dabei. `required`-Dateien werden vor dem Spielen geladen, `optional`-Dateien danach. `offlineSupported: true` erlaubt den Apps, das Spiel offline anzubieten, sobald seine benötigten Dateien gespeichert sind. Ungültige Werte werden ignoriert und blockieren nie einen Upload. Die Website lädt Spiele wie gewohnt. Bei [Sofortspielen](https://www.playdrop.ai/de/create/learn/instant-games) bilden die benötigten Dateien die Startgröße.

Auf Hosts, die Unterstützung für Gerätedaten angeben, bleiben offline erzielte Spielstände, Punktwerte und Erfolge auf dem Gerät und werden synchronisiert, sobald eine Verbindung besteht; Bestenlisten zeigen offline nur den eigenen Bestwert des Spielers. Im Browser gibt es keine Offline-Warteschlange, also behandle einen fehlgeschlagenen Speichervorgang. Alles, was das Spiel aus dem Internet lädt, braucht weiterhin eine Verbindung.

## Haptisches Feedback

In den nativen Apps geben `sdk.haptics.selection()`, `impact("light" | "medium" | "heavy")` und `notification("success" | "warning" | "error")` kurzes Feedback; `sdk.haptics.supported` sagt, ob der Host das kann. Im Web tun sie nichts, und sie sind unabhängig von der Stummschaltung.

## Verwandte Anleitungen

- [Vollbild und sichere Bereiche](https://www.playdrop.ai/de/create/learn/viewport): PlayDrop-Spiel bildschirmfüllend machen, HUD in sicheren Bereichen und mit den gemessenen reservedCorners des SDK frei von Host-Bedienelementen halten.
- [Cloud-Spielstände](https://www.playdrop.ai/de/create/learn/cloud-saves): Spielerfortschritt mit sdk.me.appData und sdk.me.updateAppData speichern und laden, für Gäste und Angemeldete; Regeln für Schreiben, Vorschau und Offline.
- [Sofortspiele](https://www.playdrop.ai/de/create/learn/instant-games): Was ein Spiel zum Sofortspiel macht: Hochformat, Gastzugang, höchstens 10 MiB Startdateien, Start in zwei Sekunden, und der Unterschied zu regulären Spielen.
- [Client-SDK](https://www.playdrop.ai/de/create/learn/sdk): Referenz zum PlayDrop-Browser-SDK: init, Lebenszyklus, Spieler und Spielstände, Geräte, Soziales, Multiplayer, Shop, Werbung, Bestenlisten, Erfolge, Assets, KI.
