# Ciclo de vida del juego en PlayDrop: carga, arranque, pausa y audio

Inicia el SDK, llama a ready en el primer fotograma jugable, pausa y reanuda sin fallos, respeta el audio del host y precarga para jugar sin conexión.

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

PlayDrop muestra su propia pantalla de carga, su menú de pausa, su control de silencio y otras ventanas alrededor de tu juego. La API del ciclo de vida mantiene el juego sincronizado con ellos: se detiene mientras PlayDrop lo pausa y solo reproduce sonido cuando la política de audio de PlayDrop lo permite.

## Inicializa y después avisa de que está listo

Carga el SDK, lee el estado inicial, suscríbete a los cambios, prepara la primera pantalla y solo entonces llama a `ready()`. PlayDrop mantiene su pantalla de carga hasta ese momento.

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

Llama a `ready()` cuando la primera pantalla diseñada se vea y los controles respondan, no antes de que carguen los recursos. `sdk.host.error(message)` indica a PlayDrop que el juego no puede arrancar. `setLoadingState` y `firstFrameReady` son nombres antiguos para el mismo paso; usa `ready()`.

## Fases: vista previa, partida y editor

`sdk.host.phase` es `preview`, `play` o `editor`, y `onPhaseChange` informa de los cambios. Las vistas previas y las capturas muestran el juego sin una sesión real: nunca escribas partidas guardadas, puntuaciones, logros ni compras fuera de `play`. `sdk.host.mode` es `play` normalmente y `dev` en el marco Dev local.

## Pausa y reanudación

`onPause(reason)` y `onResume(reason)` se activan cuando el jugador abre el menú de pausa, oculta la pestaña, inicia sesión o compra algo, o cuando un anuncio o una ventana de PlayDrop cubre el juego. `reason` es uno de `tab_hidden`, `auth_prompt`, `purchase_flow`, `host_overlay`, `detail_hidden`, `route_change` o `native_background`; `sdk.host.isPaused` es el estado actual.

Durante la pausa, detén la simulación y los temporizadores. Al reanudar, reinicia el reloj de fotogramas para que el juego no dé un salto hacia delante:

```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 y el botón Menú de un mando pertenecen al menú de pausa de PlayDrop; no los asignes en tu juego. En un juego en red, mantén activa la conexión con la sala durante la pausa: que un jugador pause no debe detener a los demás.

## Audio

Lee `sdk.host.audioAllowed` una vez después de `init()` y luego sigue `onAudioAllowedChange`. Combina el silencio del jugador, la fase y la pausa, y sigue siendo true durante una pausa por pestaña oculta para que la música conserve su posición. `onAudioPolicyChange` informa de `{ enabled, reason, volume }` cuando además necesitas el motivo o el volumen del host.

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

El audio empieza silenciado hasta que el host lo permite, y los navegadores siguen necesitando un gesto del jugador antes de reproducir sonido. Mantén cualquier ajuste de volumen del juego como un límite adicional; el silencio del host siempre tiene prioridad. Captura las promesas rechazadas de `play()` y `resume()`.

## Precarga y juego sin conexión en las apps

Las apps nativas pueden descargar los archivos de un juego antes de que arranque y conservarlos para jugar sin conexión. Decláralos en [catalogue.json](https://www.playdrop.ai/es/create/learn/catalogue-json):

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

La página de entrada siempre se incluye. Los archivos `required` se descargan antes de jugar; los `optional`, después. `offlineSupported: true` permite que las apps ofrezcan el juego sin conexión una vez guardados sus archivos obligatorios. Los valores no válidos se ignoran y nunca bloquean una subida. La web carga los juegos como siempre. En los juegos [instantáneos](https://www.playdrop.ai/es/create/learn/instant-games), los archivos obligatorios son el tamaño de inicio.

En los hosts que anuncian compatibilidad con datos en el dispositivo, las partidas guardadas, las puntuaciones y los logros conseguidos sin conexión se quedan en el dispositivo y se sincronizan cuando vuelve la conexión; las clasificaciones sin conexión muestran solo el récord del propio jugador. En un navegador no hay cola sin conexión, así que gestiona los guardados fallidos. Todo lo que el juego cargue desde internet sigue necesitando conexión.

## Vibración

En las apps nativas, `sdk.haptics.selection()`, `impact("light" | "medium" | "heavy")` y `notification("success" | "warning" | "error")` dan una respuesta táctil breve; `sdk.haptics.supported` indica si el host puede hacerlo. No hacen nada en la web y son independientes del silencio.

## Guías relacionadas

- [Pantalla completa y zonas seguras](https://www.playdrop.ai/es/create/learn/viewport): Haz que tu juego llene la pantalla y mantén el HUD dentro de las zonas seguras CSS y lejos de los controles del host con las reservedCorners del SDK.
- [Partidas guardadas en la nube](https://www.playdrop.ai/es/create/learn/cloud-saves): Guarda y carga el progreso con sdk.me.appData y sdk.me.updateAppData, para invitados y jugadores con sesión: escrituras, vistas previas y juego sin conexión.
- [Juegos instantáneos](https://www.playdrop.ai/es/create/learn/instant-games): Qué hace instantáneo un juego: formato vertical, acceso de invitados, hasta 10 MiB de archivos de inicio y arranque en 2 segundos, frente a un juego normal.
- [SDK de cliente](https://www.playdrop.ai/es/create/learn/sdk): SDK de navegador de PlayDrop: init, host, jugador, partidas guardadas, mandos, social, multijugador, tienda, anuncios, clasificaciones, logros, recursos e IA.
