# Vòng đời game trên PlayDrop: tải, sẵn sàng, tạm dừng và âm thanh

Khởi tạo SDK PlayDrop, báo sẵn sàng ở khung hình chơi được đầu tiên, tạm dừng và tiếp tục gọn gàng, theo chính sách âm thanh và tải trước tệp để chơi ngoại tuyến.

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

PlayDrop hiển thị màn hình tải, menu tạm dừng, nút tắt tiếng và các cửa sổ khác của riêng nó quanh game của bạn. API vòng đời giữ game đồng bộ với chúng: game dừng lại khi PlayDrop tạm dừng nó và chỉ phát âm thanh khi chính sách âm thanh của PlayDrop cho phép.

## Khởi tạo, rồi báo sẵn sàng

Tải SDK, đọc trạng thái ban đầu, đăng ký theo dõi thay đổi, chuẩn bị màn hình đầu tiên và chỉ khi đó mới gọi `ready()`. PlayDrop giữ màn hình tải cho đến lúc đó.

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

Hãy gọi `ready()` khi màn hình đầu tiên đúng như thiết kế đã hiện ra và đầu vào đã hoạt động, không gọi trước khi tài nguyên tải xong. `sdk.host.error(message)` báo cho PlayDrop rằng game không thể khởi động. `setLoadingState` và `firstFrameReady` là tên cũ của cùng bước này; hãy dùng `ready()`.

## Các giai đoạn: xem trước, chơi và trình chỉnh sửa

`sdk.host.phase` là `preview`, `play` hoặc `editor`, và `onPhaseChange` báo khi giai đoạn chuyển đổi. Bản xem trước và bản ghi hình hiển thị game mà không có phiên chơi thật: không bao giờ ghi dữ liệu lưu, điểm, thành tích hay giao dịch mua ngoài giai đoạn `play`. `sdk.host.mode` bình thường là `play` và là `dev` trong khung Dev cục bộ.

## Tạm dừng và tiếp tục

`onPause(reason)` và `onResume(reason)` được kích hoạt khi người chơi mở menu tạm dừng, ẩn tab, đăng nhập, mua thứ gì đó, hoặc khi một quảng cáo hay một cửa sổ PlayDrop che game. `reason` là một trong các giá trị `tab_hidden`, `auth_prompt`, `purchase_flow`, `host_overlay`, `detail_hidden`, `route_change` hoặc `native_background`; `sdk.host.isPaused` là trạng thái hiện tại.

Trong lúc tạm dừng, hãy dừng mô phỏng và bộ đếm giờ. Khi tiếp tục, hãy đặt lại đồng hồ khung hình để game không nhảy cóc về phía trước:

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

Phím Escape và nút Menu của tay cầm thuộc về menu tạm dừng của PlayDrop; đừng gán chúng trong game của bạn. Trong game có kết nối mạng, hãy giữ kết nối phòng trong lúc tạm dừng: việc một người chơi tạm dừng không được làm dừng những người khác.

## Âm thanh

Đọc `sdk.host.audioAllowed` một lần sau `init()`, rồi theo dõi `onAudioAllowedChange`. Giá trị này kết hợp trạng thái tắt tiếng của người chơi, giai đoạn và trạng thái tạm dừng, và vẫn là true khi tạm dừng do ẩn tab để nhạc giữ được vị trí đang phát. `onAudioPolicyChange` báo `{ enabled, reason, volume }` khi bạn cần thêm lý do hoặc âm lượng của host.

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

Âm thanh bắt đầu ở trạng thái tắt cho đến khi host cho phép, và trình duyệt vẫn cần một thao tác của người chơi trước khi phát âm thanh. Hãy giữ mọi cài đặt âm lượng trong game như một giới hạn bổ sung; nút tắt tiếng của host luôn được ưu tiên. Hãy bắt lỗi khi các promise `play()` và `resume()` bị từ chối.

## Tải trước và chơi ngoại tuyến trong ứng dụng

Các ứng dụng gốc có thể tải tệp của game về trước khi game bắt đầu và giữ lại để chơi ngoại tuyến. Hãy khai báo chúng trong [catalogue.json](https://www.playdrop.ai/vi/create/learn/catalogue-json):

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

Trang vào luôn được bao gồm. Các tệp `required` được tải về trước khi chơi; các tệp `optional` được tải sau. `offlineSupported: true` cho phép ứng dụng cung cấp game ngoại tuyến khi các tệp bắt buộc của nó đã được lưu. Giá trị không hợp lệ sẽ bị bỏ qua và không bao giờ chặn việc tải lên. Trang web vẫn tải game như bình thường. Với game [Instant](https://www.playdrop.ai/vi/create/learn/instant-games), các tệp bắt buộc chính là kích thước khởi động.

Trên các host có hỗ trợ dữ liệu trên thiết bị, dữ liệu lưu, điểm và thành tích tạo ra khi ngoại tuyến được giữ trên thiết bị và đồng bộ khi có mạng; bảng xếp hạng ngoại tuyến chỉ hiển thị kỷ lục của chính người chơi. Trong trình duyệt không có hàng đợi ngoại tuyến, vì vậy hãy xử lý trường hợp lưu thất bại. Mọi thứ game tải từ internet vẫn cần kết nối mạng.

## Phản hồi rung

Trong các ứng dụng gốc, `sdk.haptics.selection()`, `impact("light" | "medium" | "heavy")` và `notification("success" | "warning" | "error")` tạo phản hồi rung ngắn; `sdk.haptics.supported` cho biết host có hỗ trợ hay không. Chúng không có tác dụng trên web và không phụ thuộc vào trạng thái tắt tiếng.

## Hướng dẫn liên quan

- [Toàn màn hình và vùng an toàn](https://www.playdrop.ai/vi/create/learn/viewport): Cho game PlayDrop lấp đầy màn hình, giữ HUD trong vùng an toàn CSS và tránh nút điều khiển của host bằng reservedCorners do SDK đo.
- [Lưu đám mây](https://www.playdrop.ai/vi/create/learn/cloud-saves): Lưu và tải tiến trình người chơi bằng sdk.me.appData và updateAppData, cho khách và người chơi đã đăng nhập, kèm quy tắc ghi, xem trước và chơi ngoại tuyến.
- [Game Instant](https://www.playdrop.ai/vi/create/learn/instant-games): Điều gì làm nên một game PlayDrop Instant: chơi dọc, cho khách chơi, tệp khởi động tối đa 10 MiB và vào game trong hai giây, cùng khác biệt với game thường.
- [SDK client](https://www.playdrop.ai/vi/create/learn/sdk): Tài liệu tham khảo SDK trình duyệt PlayDrop: vòng đời host, danh tính và lưu game, tay cầm, xã hội, nhiều người chơi, cửa hàng, quảng cáo, bảng xếp hạng, tài nguyên, AI.
