# PlayDrop klient-SDK for nettleserspill

Valgfri nettleser-SDK for PlayDrop-spill: innlogging, lagring, topplister, kjøp, annonser, venner, kontrollere og flerspiller, med én script-tag.

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

PlayDrop-SDK-en er valgfri: spill uten den kan spilles på PlayDrop. Legg den til for plattformfunksjoner som spillerinnlogging, lagring, prestasjoner og topplister, kjøp med kreditter, annonser, venner og spillkort i PlayDrop Chat, delingslenker, pause og lyd styrt av hosten, kontrollerinndata, hostet flerspiller og KI-generering. [PlayDrop Cloud](https://www.playdrop.ai/nb/create) integrerer den for deg. Med [PlayDrop Connector](https://www.playdrop.ai/nb/create/connectors) legger agenten din til én script-tag.

## Legg til SDK-en og følg host-livssyklusen

Last SDK-en fra PlayDrops CDN. Du trenger ingen pakkeinstallasjon. Tegn den første spillbare ruten og klargjør inndata før du kaller `sdk.host.ready()`. Sett simuleringen på pause når hosten pauser, gjenoppta uten doble løkker, og følg hostens lydregler.

```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>
```

## Identitet, lagring og språk

`sdk.me` eksponerer spilleridentiteten, og `sdk.me.appData` lagrer private lagringer. `sdk.achievements` og `sdk.leaderboards` håndterer prestasjoner og poengsummer. Lagringer, prestasjoner og topplister fungerer uten en forhåndssjekk av innlogging. Bruk `sdk.me.isLoggedIn` for funksjoner som krever en ekte konto, som kjøp eller flerspiller. Forhåndsvisnings- og opptaksmodus må ikke skrive spillerfremdrift. `sdk.host.language` gir spillerens språk: lever engelsk pluss ditt eget språk hvis det er et annet. Å oversette en oppføring oversetter ikke spillinnholdet. Ved en naturlig pause, for eksempel en seier, lar `sdk.host.requestReview()` PlayDrop be spilleren om en anmeldelse, høyst én gang per spill. Spillet ditt får aldri vite svaret, så belønn det aldri.

## Biblioteker, ressurser og flerspiller

`sdk.libs` laster støttede versjoner av Three.js, Phaser, Rapier, nipplejs og Colyseus. `sdk.assets` gir referanser til katalog, pakker og ressurser. `sdk.social` gir venner, spillkort og delingshandlinger. For hostet flerspiller returnerer `sdk.multiplayer.getConnection()` serveradressen og tokenet til den innloggede spilleren. Bli med via Colyseus-klienten. Siden om [server-SDK-en](https://www.playdrop.ai/nb/create/learn/server-sdk) dekker hostede servere. En server du kjører selv, trenger ingenting fra SDK-en. De gamle API-ene for relay-rom er avviklet.

## Test med SDK-en før du publiserer

Kjør den vanlige utviklingsserveren din og åpne `https://www.playdrop.ai/creators/<username>/apps/game/<slug>/dev?url=http://localhost:5173/` i Chrome for å spille i den ekte PlayDrop-rammen med SDK-hosten. Alle localhost-porter og https-URL-er fungerer. Funksjoner som krever en konto, som lagring og kjøp, fungerer når spillet er lastet opp én gang. En privat opplasting er nok. Mediegenerering i nettleseren kjører som asynkrone oppgaver med en kredittkostnad som hosten bekrefter. Se [catalogue.json](https://www.playdrop.ai/nb/create/learn/catalogue-json) for metadata om oppføringen.

## Spill sammen

Bruk `await sdk.multiplayer.join("game")` i spillfasen. Den blir med uavhengig, eller bruker hostens gruppereservasjon. En gruppefeil avviser kallet i stedet for å stille og rolig dele spillerne inn i et annet rom. `getConnection()` er fortsatt API-et for umiddelbare tilkoblingsdetaljer for eksisterende spill. Behold det samme rommet gjennom rundene, og hold nettverket i gang mens host-overlegg pauser spillinndata.

Bruk `sdk.social.openParty()` fra en spillerhandling for å åpne hostens gruppe-popup. Les medlemskap med `await sdk.social.getParty()` eller `sdk.social.onPartyChange(callback)`. Spill kan ikke endre plattformgrupper eller styre mikrofoner. Gruppe- og romstemme ligger i web-/native-hosten og er fortsatt underlagt spillerens samtykke, demping, blokkeringer og kvalifisering for utrulling.

For jevn avspilling i rommet kaller du `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` med endelige `{ x, y, z }`-vektorer. Hint påvirker volum og panorering, aldri autorisasjon. Serveren håndhever lag og nærhetskvalifisering.

Bruk `sdk.device.localPlayers` og `sdk.device.onLocalPlayersChange(callback)` for de valgte lokale kontrollerplassene `{ playerIndex, gamepadKey }`. Oversikten over tilkoblede kontrollere er adskilt. En frakoblet plass beholder identiteten sin. Lokal modus kan ikke bli med i nettrom. Den kopierbare oppskriften `playdrop-metagame/recipes/play-together` viser begge moduser, to destinasjoner og romregler.

## Kontrollere

Les fysiske kontrollere og PlayDrop-telefonkontrollere gjennom `sdk.device`, på samme måte på alle plattformer. Kall `enableControllerInput()` én gang etter `init()`, les `gamepad(playerIndex)` i spillløkken (0 er S1), og bruk `onButton` for trykk og slipp. Akser og knapper følger nettleserens standardrekkefølge for spillkontrollere. Knapper har posisjonsnavn som `south` og `east`, og `pad.label("south")` returnerer teksten for den kontrolleren, for eksempel `"A"` eller `"Cross"`. Menu tilhører PlayDrop og setter spillet på pause.

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

Ikke kall `navigator.getGamepads()`: telefonkontrollere når spill bare via SDK-en, og PlayDrop logger en advarsel når et spill leser nettleser-API-et direkte. Hvis hosten ikke kan levere kontrollerinndata, avviser `enableControllerInput()` med `controller_input_unavailable` eller `controller_input_timeout`, og spillet fortsetter å kjøre. `pad.has("dpad")` forteller om en kontroll finnes. Deklarer kontrollene spillet ditt trenger i [catalogue.json](https://www.playdrop.ai/nb/create/learn/catalogue-json).
