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.
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.
<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:
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.
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:
{
"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 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.