# Groupes locaux, manettes et manettes téléphone dans les jeux PlayDrop

Lisez manettes physiques et manettes téléphone PlayDrop avec sdk.device, suivez les emplacements locaux, déclarez manettes et tailles de groupe local.

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

Un groupe local, ce sont plusieurs personnes qui jouent sur un même écran, chacune avec une manette : une manette physique ou un téléphone que PlayDrop transforme en manette grâce à un code à scanner. Votre jeu lit toutes les manettes de la même façon avec le SDK, sur le site web comme dans les apps.

## Déclarez les manettes et les tailles de groupe

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

- `controller.support` vaut `off`, `optional` ou `required`. Déclarez-le pour chaque jeu, y compris `off`.
- `controller.type` indique les commandes minimales dont le jeu a besoin : `any` (directions, Valider et Annuler), `simpler` (un stick, quatre boutons d’action et Menu ; les manettes téléphone conviennent) ou `standard` (croix directionnelle, deux sticks cliquables, quatre boutons d’action, deux boutons de tranche, deux gâchettes et Menu).
- `party.local` liste les nombres exacts de joueurs sur un même écran ; un `1` exige le type `solo`. Avec la prise en charge des manettes, chaque nombre listé doit être jouable avec des manettes.

## Lisez les manettes

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

- Appelez `enableControllerInput()` une fois après `init()`. La promesse est rejetée avec `controller_input_unavailable` ou `controller_input_timeout` quand l’hôte ne peut pas fournir les commandes ; le jeu continue de tourner.
- `gamepad(playerIndex)` renvoie un état ponctuel au format standard du navigateur : `axes` (x/y gauche, x/y droite, de -1 à 1), dix-sept `buttons`, `source` (`physical` ou `virtual`) et `id`. Le `playerIndex` 0 correspond au joueur 1.
- Les boutons portent des noms de position comme `south` et `east`. `pad.label("south")` donne l’intitulé à afficher : « A », « Cross » ou « B » selon la manette. `pad.has("dpad")` indique si une commande existe.
- Les boutons Menu et Accueil appartiennent à PlayDrop et sont toujours lus comme relâchés.
- N’appelez jamais `navigator.getGamepads()` : les manettes téléphone n’atteignent les jeux qu’à travers le SDK, et PlayDrop journalise un avertissement.

## Emplacements des joueurs locaux

`sdk.device.localPlayers` liste les emplacements choisis par les joueurs, `{ playerIndex, gamepadKey }`, et `onLocalPlayersChange(callback)` signale les changements. Une manette déconnectée conserve son emplacement. Quand la liste des joueurs change ou se vide, revenez à un menu adapté au lieu de planter. Une manette seule est une simple commande de jeu, pas un groupe.

Depuis un bouton, `sdk.social.openParty({ mode: "local" })` ouvre la fenêtre d’appairage de PlayDrop, avec le QR code pour les téléphones et les manettes connectées. Ne proposez que les modes que vous avez déclarés.

## En local ou en ligne, pas les deux

L’hôte démarre un jeu soit en groupe local, soit en groupe en ligne, jamais les deux : les joueurs en local ne peuvent pas rejoindre de salles en ligne. Pour jouer en ligne avec des amis, consultez [groupes en ligne et voix](https://www.playdrop.ai/fr/create/learn/online-party).

## Pensez au canapé

Affichez la couleur et l’intitulé de bouton de chaque joueur, laissez chacun appuyer sur un bouton pour rejoindre la partie et gardez l’interface du jeu lisible depuis un canapé. Conservez les commandes tactiles et clavier pour le jeu en solo.

## Guides associés

- [Groupes en ligne et voix](https://www.playdrop.ai/fr/create/learn/online-party): Faites jouer des amis ensemble en ligne : tailles de groupe, fenêtre de groupe PlayDrop, salles réservées avec sdk.multiplayer.join et voix de salle.
- [Plein écran et zones sûres](https://www.playdrop.ai/fr/create/learn/viewport): Un jeu PlayDrop en plein écran, avec une interface dans les zones sûres CSS et loin des commandes de l’hôte grâce aux reservedCorners mesurés par le SDK.
- [catalogue.json](https://www.playdrop.ai/fr/create/learn/catalogue-json): Les champs catalogue.json des jeux PlayDrop : identité, fiche, modes de jeu, surfaces, connexion, Instantané, préchargement, médias, traductions, scores et serveurs.
