# Lokale groepen, gamepads en telefooncontrollers in PlayDrop-games

Lees fysieke gamepads en PlayDrop-telefooncontrollers via sdk.device, volg lokale spelersplaatsen en geef controllerondersteuning en lokale groepsgroottes op.

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

Een lokale groep bestaat uit meerdere mensen die op één scherm spelen, elk met een controller: een fysieke gamepad of een telefoon die PlayDrop met het scannen van een code in een controller verandert. Je game leest elke controller op dezelfde manier via de SDK, op de website en in de apps.

## Controllers en groepsgroottes opgeven

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

- `controller.support` is `off`, `optional` of `required`. Geef het op bij elke game, ook `off`.
- `controller.type` noemt de minimale besturing die de game nodig heeft: `any` (richtingen, Bevestigen en Annuleren), `simpler` (één stick, vier frontknoppen en Menu; telefooncontrollers voldoen) of `standard` (D-pad, twee indrukbare sticks, vier frontknoppen, twee schouderknoppen, twee triggers en Menu).
- `party.local` somt de exacte aantallen spelers op één scherm op; een `1` vereist het type `solo`. Met controllerondersteuning aan moet elk genoemd aantal met controllers speelbaar zijn.

## Controllers lezen

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

- Roep `enableControllerInput()` één keer aan na `init()`. Het weigert met `controller_input_unavailable` of `controller_input_timeout` als de host geen invoer kan leveren; de game blijft draaien.
- `gamepad(playerIndex)` geeft een momentopname in de standaardindeling van de browser: `axes` (links x/y, rechts x/y van -1 tot 1), zeventien `buttons`, `source` (`physical` of `virtual`) en `id`. `playerIndex` 0 is speler 1.
- Knoppen hebben positienamen zoals `south` en `east`. `pad.label("south")` geeft de aanduiding om te tonen: "A", "Cross" of "B", afhankelijk van de controller. `pad.has("dpad")` laat weten of een besturingselement bestaat.
- Menu en Home zijn van PlayDrop en lezen altijd als losgelaten.
- Roep nooit `navigator.getGamepads()` aan: telefooncontrollers bereiken games alleen via de SDK, en PlayDrop logt een waarschuwing.

## Lokale spelersplaatsen

`sdk.device.localPlayers` somt de plaatsen op die spelers hebben gekozen, `{ playerIndex, gamepadKey }`, en `onLocalPlayersChange(callback)` meldt wijzigingen. Een losgekoppelde controller behoudt zijn plaats. Als de bezetting verandert of leeg raakt, ga dan terug naar een logisch menu in plaats van te crashen. Eén controller op zichzelf is gewone invoer, geen groep.

Vanuit een knop opent `sdk.social.openParty({ mode: "local" })` het koppelvenster van PlayDrop met de QR-code voor telefoons en de verbonden gamepads. Bied alleen de modi aan die je hebt opgegeven.

## Lokaal of online, niet allebei

De host start een game als lokale groep of als onlinegroep, nooit allebei: lokale spelers kunnen niet meedoen in onlinekamers. Voor online spelen met vrienden, zie [onlinegroepen en spraak](https://www.playdrop.ai/nl/create/learn/online-party).

## Ontwerp voor de bank

Toon de kleur en de knopaanduiding van elke speler, laat iedereen met een druk op een knop meedoen en houd de HUD leesbaar vanaf de bank. Behoud aanraak- en toetsenbordbesturing voor solo spelen.

## Gerelateerde gidsen

- [Onlinegroepen en spraak](https://www.playdrop.ai/nl/create/learn/online-party): Laat vrienden je game samen online spelen: geef groepsgroottes op, open het groepsvenster van PlayDrop, neem gereserveerde plaatsen in kamers in en regel kamerspraak.
- [Schermvullend en veilige zones](https://www.playdrop.ai/nl/create/learn/viewport): Laat een PlayDrop-game het scherm vullen en houd de HUD binnen de CSS-veilige zones en vrij van de hostknoppen met de gemeten reservedCorners van de SDK.
- [catalogue.json](https://www.playdrop.ai/nl/create/learn/catalogue-json): De catalogue.json-velden die games gebruiken: identiteit, gamepagina, speelwijzen, weergaven, inloggen, Instant, vooraf laden, media, vertalingen, scores en servers.
