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