# Grup lokal, gamepad, dan pengontrol ponsel di game PlayDrop

Baca gamepad fisik dan pengontrol ponsel PlayDrop lewat sdk.device, ikuti slot pemain lokal, serta deklarasikan dukungan pengontrol dan ukuran grup lokal.

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

Grup lokal adalah beberapa orang yang bermain di satu layar, masing-masing dengan pengontrol: gamepad fisik atau ponsel yang diubah PlayDrop menjadi pengontrol dengan memindai kode. Game Anda membaca setiap pengontrol dengan cara yang sama lewat SDK, di situs web maupun di aplikasi.

## Deklarasikan pengontrol dan ukuran grup

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

- `controller.support` bernilai `off`, `optional`, atau `required`. Deklarasikan di setiap game, termasuk `off`.
- `controller.type` menyebutkan kontrol minimum yang dibutuhkan game: `any` (arah, Konfirmasi, dan Batal), `simpler` (satu stik, empat tombol muka, dan Menu; pengontrol ponsel memenuhi syarat), atau `standard` (D-pad, dua stik yang bisa diklik, empat tombol muka, dua tombol bahu, dua pelatuk, dan Menu).
- `party.local` mencantumkan jumlah pemain persis di satu layar; nilai `1` memerlukan tipe `solo`. Jika dukungan pengontrol aktif, setiap jumlah yang dicantumkan harus bisa dimainkan dengan pengontrol.

## Baca pengontrol

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

- Panggil `enableControllerInput()` sekali setelah `init()`. Panggilan ini ditolak dengan `controller_input_unavailable` atau `controller_input_timeout` saat host tidak bisa menyediakan input; game tetap berjalan.
- `gamepad(playerIndex)` mengembalikan snapshot dalam tata letak standar browser: `axes` (x/y kiri, x/y kanan dari -1 sampai 1), tujuh belas `buttons`, `source` (`physical` atau `virtual`), dan `id`. `playerIndex` 0 adalah pemain 1.
- Tombol memiliki nama posisi seperti `south` dan `east`. `pad.label("south")` memberikan petunjuk tombol yang perlu ditampilkan: "A", "Cross", atau "B", tergantung pengontrolnya. `pad.has("dpad")` menunjukkan apakah sebuah kontrol tersedia.
- Menu dan Home adalah milik PlayDrop dan selalu terbaca sebagai dilepas.
- Jangan pernah memanggil `navigator.getGamepads()`: pengontrol ponsel hanya sampai ke game lewat SDK, dan PlayDrop mencatat peringatan.

## Slot pemain lokal

`sdk.device.localPlayers` mencantumkan slot yang dipilih pemain, `{ playerIndex, gamepadKey }`, dan `onLocalPlayersChange(callback)` melaporkan perubahannya. Pengontrol yang terputus tetap memegang slotnya. Saat daftar pemain berubah atau menjadi kosong, kembali ke menu yang masuk akal alih-alih membuat game crash. Satu pengontrol saja hanyalah input biasa, bukan grup.

Dari sebuah tombol, `sdk.social.openParty({ mode: "local" })` membuka jendela pemasangan PlayDrop dengan kode QR ponsel dan gamepad yang terhubung. Tawarkan hanya mode yang sudah Anda deklarasikan.

## Lokal atau online, bukan keduanya

Host memulai game sebagai grup lokal atau grup online, tidak pernah keduanya: pemain lokal tidak bisa bergabung ke room online. Untuk bermain online bersama teman, lihat [grup online dan suara](https://www.playdrop.ai/id/create/learn/online-party).

## Rancang untuk bermain bersama di sofa

Tampilkan warna dan petunjuk tombol pengontrol setiap pemain, biarkan siapa pun menekan tombol untuk bergabung, dan buat HUD tetap terbaca dari sofa. Pertahankan kontrol sentuh dan keyboard untuk bermain solo.

## Panduan terkait

- [Grup online dan suara](https://www.playdrop.ai/id/create/learn/online-party): Ajak teman bermain online bersama: deklarasikan ukuran grup, buka jendela grup PlayDrop, gabung ke room lewat sdk.multiplayer.join, dan atur suara ruang.
- [Layar penuh dan area aman](https://www.playdrop.ai/id/create/learn/viewport): Buat game PlayDrop memenuhi layar, jaga HUD di dalam area aman CSS dan jauh dari kontrol host dengan memakai reservedCorners yang diukur SDK.
- [catalogue.json](https://www.playdrop.ai/id/create/learn/catalogue-json): Field catalogue.json yang dipakai game PlayDrop: identitas, listingan, mode bermain, permukaan, login, Instan, pramuat, media, terjemahan, skor, dan server.
