# ปาร์ตี้ในเครื่อง เกมแพด และคอนโทรลเลอร์บนโทรศัพท์ในเกม PlayDrop

อ่านเกมแพดจริงและคอนโทรลเลอร์บนโทรศัพท์ของ PlayDrop ผ่าน sdk.device ติดตามช่องผู้เล่นในเครื่อง ประกาศการรองรับคอนโทรลเลอร์และขนาดปาร์ตี้ในเครื่อง

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

ปาร์ตี้ในเครื่องคือการที่หลายคนเล่นบนหน้าจอเดียว แต่ละคนมีคอนโทรลเลอร์ของตัวเอง: เกมแพดจริง หรือโทรศัพท์ที่ PlayDrop เปลี่ยนเป็นคอนโทรลเลอร์ด้วยการสแกนโค้ด เกมของคุณอ่านคอนโทรลเลอร์ทุกตัวด้วยวิธีเดียวกันผ่าน SDK ทั้งบนเว็บไซต์และในแอป

## ประกาศคอนโทรลเลอร์และขนาดปาร์ตี้

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

- `controller.support` เป็น `off`, `optional` หรือ `required` ประกาศไว้ในทุกเกม รวมถึง `off`
- `controller.type` ระบุปุ่มควบคุมขั้นต่ำที่เกมต้องใช้: `any` (ทิศทาง ปุ่มยืนยัน และปุ่มยกเลิก) `simpler` (สติ๊กหนึ่งอัน ปุ่มหน้าสี่ปุ่ม และปุ่ม Menu ซึ่งคอนโทรลเลอร์บนโทรศัพท์ผ่านเกณฑ์) หรือ `standard` (ปุ่มลูกศร สติ๊กที่กดได้สองอัน ปุ่มหน้าสี่ปุ่ม ปุ่มไหล่สองปุ่ม ทริกเกอร์สองปุ่ม และปุ่ม Menu)
- `party.local` ระบุจำนวนผู้เล่นที่แน่ชัดบนหน้าจอเดียว เลข `1` ต้องมีประเภท `solo` เมื่อเปิดรองรับคอนโทรลเลอร์ ทุกจำนวนที่ระบุต้องเล่นด้วยคอนโทรลเลอร์ได้

## อ่านคอนโทรลเลอร์

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

- เรียก `enableControllerInput()` หนึ่งครั้งหลัง `init()` ฟังก์ชันนี้จะปฏิเสธด้วย `controller_input_unavailable` หรือ `controller_input_timeout` เมื่อโฮสต์ให้อินพุตไม่ได้ โดยเกมยังทำงานต่อไป
- `gamepad(playerIndex)` ส่งคืนสแนปช็อตในเลย์เอาต์มาตรฐานของเบราว์เซอร์: `axes` (x/y ซ้าย x/y ขวา จาก -1 ถึง 1) `buttons` สิบเจ็ดปุ่ม `source` (`physical` หรือ `virtual`) และ `id` โดย `playerIndex` 0 คือผู้เล่นคนที่ 1
- ปุ่มมีชื่อตามตำแหน่ง เช่น `south` และ `east` ส่วน `pad.label("south")` ให้ข้อความที่จะแสดงบนหน้าจอ: "A", "Cross" หรือ "B" ขึ้นกับคอนโทรลเลอร์ `pad.has("dpad")` บอกว่ามีปุ่มควบคุมนั้นหรือไม่
- ปุ่ม Menu และ Home เป็นของ PlayDrop และเกมจะอ่านค่าได้เป็นสถานะไม่ได้กดเสมอ
- ห้ามเรียก `navigator.getGamepads()` เด็ดขาด: คอนโทรลเลอร์บนโทรศัพท์ส่งถึงเกมผ่าน SDK เท่านั้น และ PlayDrop จะบันทึกคำเตือน

## ช่องผู้เล่นในเครื่อง

`sdk.device.localPlayers` แสดงช่องที่ผู้เล่นเลือกไว้ `{ playerIndex, gamepadKey }` และ `onLocalPlayersChange(callback)` รายงานการเปลี่ยนแปลง คอนโทรลเลอร์ที่ตัดการเชื่อมต่อยังคงช่องของตัวเองไว้ เมื่อรายชื่อผู้เล่นเปลี่ยนหรือว่างลง ให้กลับไปที่เมนูที่เหมาะสมแทนที่จะให้เกมพัง คอนโทรลเลอร์ตัวเดียวคืออินพุตทั่วไป ไม่ใช่ปาร์ตี้

จากปุ่มในเกม `sdk.social.openParty({ mode: "local" })` จะเปิดหน้าต่างจับคู่ของ PlayDrop พร้อมคิวอาร์โค้ดสำหรับโทรศัพท์และเกมแพดที่เชื่อมต่ออยู่ เสนอเฉพาะโหมดที่คุณประกาศไว้

## ในเครื่องหรือออนไลน์ ไม่ใช่ทั้งสองอย่าง

โฮสต์เริ่มเกมเป็นปาร์ตี้ในเครื่องหรือปาร์ตี้ออนไลน์อย่างใดอย่างหนึ่ง ไม่ใช่ทั้งสองอย่าง: ผู้เล่นในเครื่องเข้าร่วมห้องออนไลน์ไม่ได้ สำหรับการเล่นออนไลน์กับเพื่อน ดู[ปาร์ตี้ออนไลน์และแชทเสียง](https://www.playdrop.ai/th/create/learn/online-party)

## ออกแบบให้เล่นบนโซฟา

แสดงสีและข้อความปุ่มของผู้เล่นแต่ละคน ให้ใครก็ได้กดปุ่มเพื่อเข้าร่วม และทำให้ HUD อ่านได้จากโซฟา คงการควบคุมแบบสัมผัสและคีย์บอร์ดไว้สำหรับการเล่นคนเดียว

## คู่มือที่เกี่ยวข้อง

- [ปาร์ตี้ออนไลน์และแชทเสียง](https://www.playdrop.ai/th/create/learn/online-party): ให้เพื่อนเล่นด้วยกันออนไลน์: ประกาศขนาดปาร์ตี้ เปิดหน้าต่างปาร์ตี้ของ PlayDrop เข้าห้องที่จองไว้ด้วย sdk.multiplayer.join และควบคุมแชทเสียงในห้อง
- [เต็มหน้าจอและพื้นที่ปลอดภัย](https://www.playdrop.ai/th/create/learn/viewport): ทำให้เกม PlayDrop เต็มหน้าจอ เก็บ HUD ไว้ในพื้นที่ปลอดภัยของ CSS และไม่ทับปุ่มควบคุมของโฮสต์ด้วย reservedCorners ที่ SDK วัดให้
- [catalogue.json](https://www.playdrop.ai/th/create/learn/catalogue-json): ฟิลด์ catalogue.json ที่เกม PlayDrop ใช้: ตัวตน หน้าเกม โหมดการเล่น หน้าจอ การเข้าสู่ระบบ Instant การโหลดล่วงหน้า สื่อ คำแปล คะแนน และเซิร์ฟเวอร์
