# PlayDropin client SDK selainpeleille

Valinnainen selain-SDK PlayDrop-peleille: kirjautuminen, tallennukset, tulostaulut, ostot, mainokset, ystävät, ohjaimet ja moninpeli yhdellä script-tagilla.

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

PlayDrop SDK on valinnainen: ilman sitä olevat pelit toimivat PlayDropissa. Lisää se alustaominaisuuksia varten, kuten pelaajan kirjautuminen, tallennukset, saavutukset ja tulostaulut, krediiteillä tehtävät ostot, mainokset, ystävät ja pelikortit PlayDrop Chatissa, jakolinkit, isännän hallitsema tauko ja ääni, ohjainsyöte, isännöity moninpeli ja tekoälyluonti. [PlayDrop Cloud](https://www.playdrop.ai/fi/create) integroi sen puolestasi; [PlayDrop Connectorin](https://www.playdrop.ai/fi/create/connectors) kanssa agenttisi lisää yhden script-tagin.

## Lisää SDK ja noudata isännän elinkaarta

Lataa SDK PlayDropin CDN:stä; pakettiasennusta ei tarvita. Renderöi ensimmäinen pelattava ruutu ja valmistele syöte ennen kuin kutsut `sdk.host.ready()`. Pysäytä simulaatio, kun isäntä keskeyttää, jatka luomatta päällekkäisiä silmukoita ja noudata isännän äänikäytäntöä.

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

## Identiteetti, tallennukset ja kieli

`sdk.me` tarjoaa pelaajan identiteetin ja `sdk.me.appData` tallentaa yksityiset tallennukset; `sdk.achievements` ja `sdk.leaderboards` hoitavat saavutukset ja pisteet. Tallennukset, saavutukset ja tulostaulut toimivat ilman kirjautumisen ennakkotarkistusta. Käytä `sdk.me.isLoggedIn`-arvoa ominaisuuksiin, jotka vaativat oikean tilin, kuten ostot tai moninpeli. Esikatselu- ja kaappaustilat eivät saa kirjoittaa pelaajan edistymistä. `sdk.host.language` kertoo pelaajan kielen: toimita englanti sekä oma kielesi, jos se on eri. Pelisivun kääntäminen ei käännä pelin sisältöä. Luonnollisessa taukokohdassa, kuten voiton jälkeen, `sdk.host.requestReview()` antaa PlayDropin pyytää pelaajalta arvostelua, enintään kerran per peli; pelisi ei koskaan saa tietää vastausta, joten älä koskaan palkitse siitä.

## Kirjastot, resurssit ja moninpeli

`sdk.libs` lataa tuetut Three.js-, Phaser-, Rapier-, nipplejs- ja Colyseus-versiot. `sdk.assets` tarjoaa katalogi-, paketti- ja resurssiviitteet; `sdk.social` tarjoaa ystävät, pelikortit ja jakotoiminnot. Isännöityä moninpeliä varten `sdk.multiplayer.getConnection()` palauttaa palvelimen osoitteen ja kirjautuneen pelaajan tunnisteen; liity Colyseus-clientillä. Sivu [server SDK](https://www.playdrop.ai/fi/create/learn/server-sdk) kattaa isännöidyt palvelimet; itse ylläpitämäsi palvelin ei tarvitse SDK:sta mitään. Vanhat relay-huoneen rajapinnat on poistettu käytöstä.

## Testaa SDK:lla ennen julkaisua

Käynnistä tavallinen kehityspalvelimesi ja avaa `https://www.playdrop.ai/creators/<username>/apps/game/<slug>/dev?url=http://localhost:5173/` Chromessa pelataksesi sitä oikeassa PlayDrop-kehyksessä SDK-isännän kanssa. Mikä tahansa localhost-portti tai https-URL-osoite käy. Tilin vaativat ominaisuudet, kuten tallennukset ja ostot, toimivat, kun peli on ladattu kerran; yksityinen lataus riittää. Selaimen mediageneroinnit toimivat asynkronisina töinä, joiden krediittihinnan isäntä vahvistaa. Katso pelisivun metatiedot kohdasta [catalogue.json](https://www.playdrop.ai/fi/create/learn/catalogue-json).

## Pelaa yhdessä

Käytä `await sdk.multiplayer.join("game")` pelivaiheessa. Se liittyy itsenäisesti tai käyttää isännän ryhmävarausta. Ryhmävirhe hylkää liittymisen sen sijaan, että pelaajat hiljaa jaettaisiin toiseen huoneeseen. `getConnection()` säilyy välittömänä yhteystietorajapintana olemassa oleville peleille. Pidä sama huone kierrosten yli ja pidä verkkoyhteys käynnissä, kun isännän peittokuvat keskeyttävät pelisyötteen.

Käytä `sdk.social.openParty()` pelaajan toiminnosta avataksesi isännän ryhmäpopupin. Lue jäsenyys komennolla `await sdk.social.getParty()` tai `sdk.social.onPartyChange(callback)`. Pelit eivät voi muuttaa alustan ryhmiä tai hallita mikrofoneja. Ryhmän ja huoneen puhe sijaitsee web-/natiivi-isännässä ja noudattaa pelaajan suostumusta, mykistystä, estoja ja käyttöönoton kelpoisuutta.

Sujuvaa huoneen toistoa varten kutsu `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` käyttäen äärellisiä `{ x, y, z }`-vektoreita. Vihjeet vaikuttavat äänenvoimakkuuteen ja panorointiin, eivät koskaan valtuutukseen. Palvelin valvoo tiimejä ja läheisyyskelpoisuutta.

Käytä `sdk.device.localPlayers` ja `sdk.device.onLocalPlayersChange(callback)` valittujen paikallisten ohjainpaikkojen `{ playerIndex, gamepadKey }` lukemiseen. Yhdistettyjen ohjainten luettelo on erillinen; yhteydetön paikka säilyttää identiteettinsä. Paikallinen tila ei voi liittyä verkkohuoneisiin. Kopioitava resepti `playdrop-metagame/recipes/play-together` havainnollistaa molemmat tilat, kaksi kohdetta ja huonekäytännöt.

## Ohjaimet

Lue fyysiset ohjaimet ja PlayDropin puhelinohjaimet `sdk.device`-rajapinnan kautta, samalla tavalla kaikilla alustoilla. Kutsu `enableControllerInput()` kerran `init()`:n jälkeen, lue `gamepad(playerIndex)` pelisilmukassa (0 on P1) ja käytä `onButton` painalluksiin ja vapautuksiin. Akselit ja painikkeet noudattavat selaimen standardia peliohjainjärjestystä; painikkeilla on sijaintinimet, kuten `south` ja `east`, ja `pad.label("south")` palauttaa kyseisen ohjaimen kehotteen, kuten `"A"` tai `"Cross"`. Menu kuuluu PlayDropille ja keskeyttää pelin.

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

Älä kutsu `navigator.getGamepads()`: puhelinohjaimet tavoittavat pelit vain SDK:n kautta, ja PlayDrop kirjaa varoituksen, kun peli lukee selaimen rajapintaa suoraan. Jos isäntä ei pysty tarjoamaan ohjainsyötettä, `enableControllerInput()` hylätään arvolla `controller_input_unavailable` tai `controller_input_timeout` ja peli jatkaa toimintaansa. `pad.has("dpad")` kertoo, onko ohjain olemassa; ilmoita pelisi tarvitsemat ohjaimet tiedostossa [catalogue.json](https://www.playdrop.ai/fi/create/learn/catalogue-json).
