# 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.

Source: https://www.playdrop.ai/es/create/learn/local-party

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

```json
{
  "types": ["solo", "party"],
  "party": { "local": [1, 2, 3, 4] },
  "controller": { "support": "optional", "type": "simpler" }
}
```

- `controller.support` es `off`, `optional` o `required`. Decláralo en todos los juegos, incluido `off`.
- `controller.type` indica 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) o `standard` (cruceta, dos joysticks pulsables, cuatro botones frontales, dos botones laterales, dos gatillos y Menú).
- `party.local` enumera el número exacto de jugadores en una misma pantalla; un `1` requiere el tipo `solo`. Con la compatibilidad con mandos activada, cada número indicado debe poder jugarse con mandos.

## Lee los mandos

```js
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 de `init()`. Se rechaza con `controller_input_unavailable` o `controller_input_timeout` cuando 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), diecisiete `buttons`, `source` (`physical` o `virtual`) e `id`. El `playerIndex` 0 es el jugador 1.
- Los botones tienen nombres por posición, como `south` y `east`. `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](https://www.playdrop.ai/es/create/learn/online-party).

## 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.

## Guías relacionadas

- [Grupos en línea y voz](https://www.playdrop.ai/es/create/learn/online-party): Deja que tus amigos jueguen en línea: declara tamaños de grupo, abre la ventana de grupo, entra en salas reservadas con sdk.multiplayer.join y gestiona la voz.
- [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.
- [catalogue.json](https://www.playdrop.ai/es/create/learn/catalogue-json): Campos de catalogue.json que usan los juegos: identidad, ficha, modos, pantallas, sesión, instantáneo, precarga, medios, idiomas, puntuaciones y servidores.
