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