Grupos locales, mandos y mandos de teléfono en juegos de PlayDrop
Lee mandos físicos y mandos de teléfono de PlayDrop con sdk.device, sigue las posiciones de los jugadores locales y declara mandos y tamaños de grupo local.
Un grupo local son varias personas jugando en una misma pantalla, cada una con un mando: un mando físico o un teléfono que PlayDrop convierte en mando al escanear un código. Tu juego lee todos los mandos de la misma forma a través del SDK, en la web y en las apps.
Declara los mandos y los tamaños de grupo
{
"types": ["solo", "party"],
"party": { "local": [1, 2, 3, 4] },
"controller": { "support": "optional", "type": "simpler" }
}controller.supportesoff,optionalorequired. Decláralo en todos los juegos, incluidooff.controller.typeindica los controles mínimos que necesita el juego:any(direcciones, Confirmar y Cancelar),simpler(un joystick, cuatro botones frontales y Menú; los mandos de teléfono cumplen) ostandard(cruceta, dos joysticks pulsables, cuatro botones frontales, dos botones laterales, dos gatillos y Menú).party.localenumera el número exacto de jugadores en una misma pantalla; un1requiere el tiposolo. Con la compatibilidad con mandos activada, cada número indicado debe poder jugarse con mandos.
Lee los mandos
await sdk.device.enableControllerInput().catch(() => { /* keep keyboard and touch */ });
const stop = sdk.device.onButton(({ playerIndex, button, pressed }) => {
if (button === "south" && pressed) jump(playerIndex);
});
function update() {
for (const slot of sdk.device.localPlayers) {
const pad = sdk.device.gamepad(slot.playerIndex);
if (pad?.connected) move(slot.playerIndex, pad.axes[0], pad.axes[1]);
}
requestAnimationFrame(update);
}
update();- Llama a
enableControllerInput()una vez después deinit(). Se rechaza concontroller_input_unavailableocontroller_input_timeoutcuando el host no puede proporcionar la entrada; el juego sigue funcionando. gamepad(playerIndex)devuelve una instantánea con la disposición estándar del navegador:axes(x/y izquierdo y x/y derecho, de -1 a 1), diecisietebuttons,source(physicalovirtual) eid. ElplayerIndex0 es el jugador 1.- Los botones tienen nombres por posición, como
southyeast.pad.label("south")da la indicación que hay que mostrar: «A», «Cross» o «B» según el mando.pad.has("dpad")indica si un control existe. - Menú e Inicio pertenecen a PlayDrop y siempre se leen como no pulsados.
- No llames nunca a
navigator.getGamepads(): los mandos de teléfono solo llegan a los juegos a través del SDK, y PlayDrop registra una advertencia.
Posiciones de los jugadores locales
sdk.device.localPlayers enumera las posiciones que eligieron los jugadores, { playerIndex, gamepadKey }, y onLocalPlayersChange(callback) informa de los cambios. Un mando desconectado conserva su posición. Cuando la lista de jugadores cambie o se quede vacía, vuelve a un menú adecuado en lugar de fallar. Un solo mando es una entrada normal, no un grupo.
Desde un botón, sdk.social.openParty({ mode: "local" }) abre la ventana de emparejamiento de PlayDrop con el código QR para el teléfono y los mandos conectados. Ofrece solo los modos que hayas declarado.
Local o en línea, no ambos
El host inicia un juego como grupo local o como grupo en línea, nunca ambos: los jugadores locales no pueden entrar en salas en línea. Para jugar en línea con amigos, consulta grupos en línea y voz.
Diseña para el sofá
Muestra el color y la indicación del mando de cada jugador, deja que cualquiera se una pulsando un botón y mantén el HUD legible desde el sofá. Conserva los controles táctiles y de teclado para jugar en solitario.