# PlayDrops klient-SDK för webbläsarspel

Valfritt webbläsar-SDK för alla PlayDrop-spel: inloggning, sparfiler, topplistor, köp, annonser, vänner, handkontroller och flerspelarläge med en script-tagg.

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

PlayDrop-SDK:t är valfritt: spel utan det går att spela på PlayDrop. Lägg till det för plattformsfunktioner som spelarinloggning, sparfiler, prestationer och topplistor, köp med krediter, annonser, vänner och spelkort i PlayDrop Chat, delningslänkar, paus och ljud som hanteras av värden, handkontrollsinmatning, hostat flerspelarläge och AI-generering. [PlayDrop Cloud](https://www.playdrop.ai/sv/create) integrerar det åt dig. Med [PlayDrop Connector](https://www.playdrop.ai/sv/create/connectors) lägger din agent till en script-tagg.

## Lägg till SDK:t och följ värdens livscykel

Läs in SDK:t från PlayDrops CDN. Ingen paketinstallation behövs. Rendera den första spelbara bildrutan och förbered inmatning innan du anropar `sdk.host.ready()`. Pausa simuleringen när värden pausar, återuppta utan dubbla loopar och följ värdens ljudpolicy.

```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, sparfiler och språk

`sdk.me` ger spelarens identitet och `sdk.me.appData` lagrar privata sparfiler. `sdk.achievements` och `sdk.leaderboards` hanterar prestationer och poäng. Sparfiler, prestationer och topplistor fungerar utan förhandskontroll av inloggning. Använd `sdk.me.isLoggedIn` för funktioner som kräver ett riktigt konto, som köp eller flerspelarläge. Förhandsvisnings- och inspelningslägen får inte skriva spelarens framsteg. `sdk.host.language` ger spelarens språk: leverera engelska plus ditt eget språk om det är ett annat. Att översätta en spelsida översätter inte spelets innehåll. Vid en naturlig paus, som en vinst, låter `sdk.host.requestReview()` PlayDrop be spelaren om en recension, högst en gång per spel. Ditt spel får aldrig veta svaret, så belöna det aldrig.

## Bibliotek, assets och flerspelarläge

`sdk.libs` läser in versioner som stöds av Three.js, Phaser, Rapier, nipplejs och Colyseus. `sdk.assets` ger referenser till katalog, paket och assets. `sdk.social` ger vänner, spelkort och delningsåtgärder. För hostat flerspelarläge returnerar `sdk.multiplayer.getConnection()` serveradressen och den inloggade spelarens token. Gå med via Colyseus-klienten. Sidan om [server-SDK:t](https://www.playdrop.ai/sv/create/learn/server-sdk) beskriver hostade servrar. En server som du driver själv behöver ingenting från SDK:t. De gamla API:erna för relärum är avvecklade.

## Testa med SDK:t innan du publicerar

Kör din vanliga utvecklingsserver och öppna `https://www.playdrop.ai/creators/<username>/apps/game/<slug>/dev?url=http://localhost:5173/` i Chrome för att spela i den riktiga PlayDrop-ramen med SDK-värden. Valfri localhost-port eller https-adress fungerar. Funktioner som kräver ett konto, som sparfiler och köp, fungerar när spelet har laddats upp en gång. En privat uppladdning räcker. Mediagenerering i webbläsaren körs som asynkrona uppgifter med en kreditkostnad som bekräftas av värden. Se [catalogue.json](https://www.playdrop.ai/sv/create/learn/catalogue-json) för metadata till spelsidan.

## Spela tillsammans

Använd `await sdk.multiplayer.join("game")` i spelfasen. Den går med fristående eller använder värdens gruppreservation. Ett gruppfel avvisar anropet i stället för att tyst dela upp spelarna i ett annat rum. `getConnection()` är fortfarande API:et för omedelbar anslutningsinformation för befintliga spel. Behåll samma rum mellan omgångarna och håll nätverket igång medan värdens överlägg pausar spelets inmatning.

Använd `sdk.social.openParty()` från en spelaråtgärd för att öppna värdens grupprutor. Läs medlemskap med `await sdk.social.getParty()` eller `sdk.social.onPartyChange(callback)`. Spel kan inte ändra plattformsgrupper eller styra mikrofoner. Grupp- och rumsröst finns i webb- och native-värden och styrs fortfarande av spelarens samtycke, ljudavstängning, blockeringar och behörighet i utrullningen.

För mjuk uppspelning i rummet anropar du `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` med ändliga `{ x, y, z }`-vektorer. Tips påverkar volym och panorering, aldrig behörighet. Servern styr lag och närhetsbehörighet.

Använd `sdk.device.localPlayers` och `sdk.device.onLocalPlayersChange(callback)` för de valda lokala handkontrollplatserna `{ playerIndex, gamepadKey }`. Förteckningen över anslutna handkontroller är separat. En frånkopplad plats behåller sin identitet. Lokalt läge kan inte gå med i onlinerum. Receptet `playdrop-metagame/recipes/play-together`, som går att kopiera, visar båda lägena, två destinationer och rumspolicyer.

## Handkontroller

Läs fysiska handkontroller och PlayDrops telefonkontroller via `sdk.device`, på samma sätt på alla plattformar. Anropa `enableControllerInput()` en gång efter `init()`, läs `gamepad(playerIndex)` i spelloopen (0 är P1) och använd `onButton` för nedtryckningar och släpp. Axlar och knappar följer webbläsarens standardordning för gamepad. Knappar har positionsnamn som `south` och `east`, och `pad.label("south")` returnerar texten för den handkontrollen, som `"A"` eller `"Cross"`. Menu tillhör PlayDrop och pausar spelet.

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

Anropa inte `navigator.getGamepads()`: telefonkontroller når spel bara via SDK:t, och PlayDrop loggar en varning när ett spel läser webbläsarens API direkt. Om värden inte kan ge handkontrollsinmatning avvisar `enableControllerInput()` anropet med `controller_input_unavailable` eller `controller_input_timeout` och spelet fortsätter köra. `pad.has("dpad")` visar om en kontroll finns. Ange de kontroller som ditt spel behöver i [catalogue.json](https://www.playdrop.ai/sv/create/learn/catalogue-json).
