# Siklus hidup game di PlayDrop: pemuatan, siap, jeda, dan audio

Inisialisasi SDK PlayDrop, beri sinyal siap di frame pertama, jeda dan lanjutkan dengan rapi, ikuti kebijakan audio host, dan pramuat berkas untuk main offline.

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

PlayDrop menampilkan layar pemuatan, menu jeda, kontrol bisu, dan jendela lain miliknya sendiri di sekitar game Anda. API siklus hidup menjaga game tetap selaras dengan semua itu: game berhenti saat PlayDrop menjedanya dan hanya memutar suara saat kebijakan audio PlayDrop mengizinkan.

## Inisialisasi, lalu beri sinyal siap

Muat SDK, baca status awal, berlangganan perubahan, siapkan layar pertama, dan baru setelah itu panggil `ready()`. PlayDrop terus menampilkan layar pemuatannya sampai saat itu.

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

Panggil `ready()` setelah layar pertama yang dirancang terlihat dan input berfungsi, bukan sebelum aset dimuat. `sdk.host.error(message)` memberi tahu PlayDrop bahwa game tidak bisa dimulai. `setLoadingState` dan `firstFrameReady` adalah nama lama untuk langkah yang sama; gunakan `ready()`.

## Fase: pratinjau, bermain, dan editor

`sdk.host.phase` bernilai `preview`, `play`, atau `editor`, dan `onPhaseChange` melaporkan perpindahannya. Pratinjau dan rekaman menampilkan game tanpa sesi sungguhan: jangan pernah menulis simpanan, skor, pencapaian, atau pembelian di luar `play`. `sdk.host.mode` bernilai `play` dalam kondisi normal dan `dev` di frame Dev lokal.

## Jeda dan lanjutkan

`onPause(reason)` dan `onResume(reason)` terpicu saat pemain membuka menu jeda, menyembunyikan tab, masuk, membeli sesuatu, atau saat iklan atau jendela PlayDrop menutupi game. `reason` adalah salah satu dari `tab_hidden`, `auth_prompt`, `purchase_flow`, `host_overlay`, `detail_hidden`, `route_change`, atau `native_background`; `sdk.host.isPaused` adalah status saat ini.

Selama dijeda, hentikan simulasi dan timer. Saat dilanjutkan, reset jam frame Anda agar game tidak melompat maju:

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

Tombol Escape dan tombol Menu pada pengontrol adalah milik menu jeda PlayDrop; jangan memetakannya di game Anda. Di game berjaringan, pertahankan koneksi room selama dijeda: menjeda satu pemain tidak boleh menghentikan pemain lain.

## Audio

Baca `sdk.host.audioAllowed` sekali setelah `init()`, lalu ikuti `onAudioAllowedChange`. Nilai ini menggabungkan status bisu pemain, fase, dan jeda, serta tetap bernilai true selama jeda karena tab disembunyikan agar musik bisa mempertahankan posisinya. `onAudioPolicyChange` melaporkan `{ enabled, reason, volume }` jika Anda juga memerlukan alasannya atau volume host.

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

Audio dimulai dalam keadaan bisu sampai host mengizinkannya, dan browser tetap memerlukan gestur pemain sebelum suara diputar. Pertahankan pengaturan volume di dalam game sebagai batas tambahan; bisu dari host selalu menang. Tangkap promise `play()` dan `resume()` yang ditolak.

## Pramuat dan main offline di aplikasi

Aplikasi native bisa mengunduh berkas game sebelum game dimulai dan menyimpannya untuk dimainkan secara offline. Deklarasikan berkas itu di [catalogue.json](https://www.playdrop.ai/id/create/learn/catalogue-json):

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

Halaman masuk selalu disertakan. Berkas `required` diunduh sebelum bermain; berkas `optional` sesudahnya. `offlineSupported: true` memungkinkan aplikasi menawarkan game secara offline setelah berkas wajibnya tersimpan. Nilai yang tidak valid diabaikan dan tidak pernah memblokir unggahan. Situs web memuat game seperti biasa. Untuk game [Instan](https://www.playdrop.ai/id/create/learn/instant-games), berkas wajib menjadi ukuran berkas awal.

Di host yang menyatakan dukungan data perangkat, simpanan, skor, dan pencapaian yang dibuat secara offline tetap berada di perangkat dan disinkronkan setelah online; papan peringkat offline hanya menampilkan skor terbaik pemain itu sendiri. Di browser tidak ada antrean offline, jadi tangani simpanan yang gagal. Apa pun yang dimuat game dari internet tetap memerlukan koneksi.

## Haptik

Di aplikasi native, `sdk.haptics.selection()`, `impact("light" | "medium" | "heavy")`, dan `notification("success" | "warning" | "error")` memberikan umpan balik singkat; `sdk.haptics.supported` menunjukkan apakah host mendukungnya. Panggilan ini tidak berpengaruh apa pun di web dan tidak bergantung pada status bisu.

## Panduan terkait

- [Layar penuh dan area aman](https://www.playdrop.ai/id/create/learn/viewport): Buat game PlayDrop memenuhi layar, jaga HUD di dalam area aman CSS dan jauh dari kontrol host dengan memakai reservedCorners yang diukur SDK.
- [Simpanan cloud](https://www.playdrop.ai/id/create/learn/cloud-saves): Simpan dan muat progres dengan sdk.me.appData dan sdk.me.updateAppData untuk tamu dan pemain yang sudah masuk, plus aturan penulisan, pratinjau, dan offline.
- [Game Instan](https://www.playdrop.ai/id/create/learn/instant-games): Syarat game Instan PlayDrop: potret, akses tamu, berkas awal maksimal 10 MiB, mulai dalam dua detik, dan bedanya dengan game reguler.
- [SDK klien](https://www.playdrop.ai/id/create/learn/sdk): Referensi SDK browser: init, siklus hidup host, identitas, simpanan, perangkat, sosial, multiplayer, toko, iklan, papan peringkat, pencapaian, aset, dan AI.
