# PlayDrop client-SDK voor browsergames

Optionele browser-SDK voor elke PlayDrop-game: inloggen, saves, ranglijsten, aankopen, advertenties, vrienden, controllers en multiplayer met één scripttag.

Source: https://www.playdrop.ai/nl/create/learn/sdk

De PlayDrop-SDK is optioneel: games zonder SDK spelen gewoon op PlayDrop. Voeg hem toe voor platformfuncties zoals inloggen van spelers, saves, prestaties en ranglijsten, aankopen met credits, advertenties, vrienden en gamekaarten in PlayDrop Chat, deellinks, door de host beheerde pauze en audio, controllerinvoer, gehoste multiplayer en AI-generatie. [PlayDrop Cloud](https://www.playdrop.ai/nl/create) bouwt hem voor je in; met [PlayDrop Connector](https://www.playdrop.ai/nl/create/connectors) voegt je agent één scripttag toe.

## Voeg de SDK toe en volg de levenscyclus van de host

Laad de SDK vanaf het CDN van PlayDrop; installeren van een pakket is niet nodig. Render het eerste speelbare frame en maak de invoer klaar voordat je `sdk.host.ready()` aanroept. Pauzeer de simulatie bij een pauze van de host, hervat zonder dubbele lussen en volg het audiobeleid van de host.

```html
<script src="https://assets.playdrop.ai/sdk/playdrop.js"></script>
<script type="module">
  const sdk = await playdrop.init();
  // Render the game and prepare input, then:
  sdk.host.ready();
  sdk.host.onPause(() => pauseGame());
  sdk.host.onResume(() => resumeGame());
  sdk.host.onAudioPolicyChange(({ enabled }) => setAudioEnabled(enabled));
</script>
```

## Identiteit, saves en taal

`sdk.me` toont de identiteit van de speler en `sdk.me.appData` slaat privésaves op; `sdk.achievements` en `sdk.leaderboards` regelen prestaties en scores. Saves, prestaties en ranglijsten werken zonder voorafgaande logincontrole. Gebruik `sdk.me.isLoggedIn` voor functies die een echt account vereisen, zoals aankopen of multiplayer. Voorbeeld- en opnamemodi mogen geen voortgang van spelers wegschrijven. `sdk.host.language` geeft de taal van de speler: lever Engels plus je eigen taal als die anders is. Een vertaalde gamepagina vertaalt de inhoud van de game niet. Op een natuurlijk moment, zoals een overwinning, laat `sdk.host.requestReview()` PlayDrop de speler om een review vragen, hoogstens één keer per game; je game komt het antwoord nooit te weten, dus beloon het nooit.

## Bibliotheken, assets en multiplayer

`sdk.libs` laadt ondersteunde versies van Three.js, Phaser, Rapier, nipplejs en Colyseus. `sdk.assets` biedt verwijzingen naar catalogus, pakketten en assets; `sdk.social` biedt vrienden, gamekaarten en deelacties. Voor gehoste multiplayer geeft `sdk.multiplayer.getConnection()` het serveradres en het token van de ingelogde speler terug; doe mee met de Colyseus-client. De pagina over de [server-SDK](https://www.playdrop.ai/nl/create/learn/server-sdk) behandelt gehoste servers; een server die je zelf draait heeft niets van de SDK nodig. De oude relay-room-API’s zijn buiten gebruik gesteld.

## Test met de SDK voordat je publiceert

Draai je gebruikelijke devserver en open `https://www.playdrop.ai/creators/<username>/apps/game/<slug>/dev?url=http://localhost:5173/` in Chrome om hem in het echte PlayDrop-frame met de SDK-host te spelen. Elke localhost-poort of https-URL werkt. Functies die een account nodig hebben, zoals saves en aankopen, werken zodra de game één keer is geüpload; een privé-upload is genoeg. Het genereren van media in de browser draait als asynchrone taken met door de host bevestigde creditkosten. Zie [catalogue.json](https://www.playdrop.ai/nl/create/learn/catalogue-json) voor metadata van de gamepagina.

## Samen spelen

Gebruik `await sdk.multiplayer.join("game")` in de speelfase. Het sluit zelfstandig aan of gebruikt de groepsreservering van de host. Een mislukte groep wordt geweigerd in plaats van spelers stilletjes over een andere room te verdelen. `getConnection()` blijft de directe API voor verbindingsgegevens bij bestaande games. Houd dezelfde room aan over rondes heen en houd het netwerk actief terwijl overlays van de host de spelerinvoer pauzeren.

Gebruik `sdk.social.openParty()` vanuit een actie van de speler om de groepspopup van de host te openen. Lees het lidmaatschap met `await sdk.social.getParty()` of `sdk.social.onPartyChange(callback)`. Games kunnen platformgroepen niet wijzigen en microfoons niet besturen. Groeps- en roomspraak draaien in de web-/native host en blijven onderhevig aan toestemming van spelers, dempen, blokkades en geschiktheid voor de uitrol.

Roep voor soepele roomweergave `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` aan met eindige `{ x, y, z }`-vectoren. Hints beïnvloeden volume en panning, nooit autorisatie. De server handhaaft teams en geschiktheid op afstand.

Gebruik `sdk.device.localPlayers` en `sdk.device.onLocalPlayersChange(callback)` voor de gekozen lokale controllerslots `{ playerIndex, gamepadKey }`. De inventaris van verbonden controllers staat los hiervan; een losgekoppeld slot behoudt zijn identiteit. De lokale modus kan niet meedoen aan online rooms. Het kopieerbare recept `playdrop-metagame/recipes/play-together` toont beide modi, twee bestemmingen en roombeleid.

## Controllers

Lees fysieke controllers en PlayDrop-telefooncontrollers via `sdk.device`, op elk platform op dezelfde manier. Roep na `init()` één keer `enableControllerInput()` aan, lees `gamepad(playerIndex)` in de gamelus (0 is P1) en gebruik `onButton` voor indrukken en loslaten. Assen en knoppen volgen de standaardgamepadvolgorde van de browser; knoppen hebben positienamen zoals `south` en `east` en `pad.label("south")` geeft de aanduiding voor die controller, zoals `"A"` of `"Cross"`. Menu is van PlayDrop en pauzeert de game.

```js
await sdk.device.enableControllerInput();
const stop = sdk.device.onButton(({ playerIndex, button, pressed }) => {
  if (button === "south" && pressed) jump(playerIndex);
});
function update() {
  const pad = sdk.device.gamepad(0);
  if (pad?.connected) move(pad.axes[0], pad.axes[1]);
  requestAnimationFrame(update);
}
update();
```

Roep `navigator.getGamepads()` niet aan: telefooncontrollers bereiken games alleen via de SDK en PlayDrop logt een waarschuwing als een game de browser-API rechtstreeks leest. Kan de host geen controllerinvoer leveren, dan weigert `enableControllerInput()` met `controller_input_unavailable` of `controller_input_timeout` en blijft de game draaien. `pad.has("dpad")` laat weten of een besturingselement bestaat; geef de besturing die je game nodig heeft op in [catalogue.json](https://www.playdrop.ai/nl/create/learn/catalogue-json).
