# Tarayıcı oyunları için PlayDrop istemci SDK’sı

Her PlayDrop oyunu için isteğe bağlı SDK: giriş, kayıtlar, liderlik tabloları, satın alımlar, reklamlar, arkadaşlar, kumandalar ve çok oyunculu mod.

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

PlayDrop SDK’sı isteğe bağlıdır: SDK’sız oyunlar da PlayDrop’ta oynanır. Oyuncu girişi, kayıtlar, başarımlar ve liderlik tabloları, kredilerle satın alımlar, reklamlar, arkadaşlar ve PlayDrop Sohbet’teki oyun kartları, paylaşım bağlantıları, ana uygulamanın yönettiği duraklatma ve ses, kumanda girdisi, barındırılan çok oyunculu mod ve yapay zeka üretimi gibi platform özellikleri için ekle. [PlayDrop Cloud](https://www.playdrop.ai/tr/create) bunu senin için entegre eder; [PlayDrop Connector](https://www.playdrop.ai/tr/create/connectors) ile ajanın tek bir script etiketi ekler.

## SDK’yı ekle ve ana uygulamanın yaşam döngüsünü izle

SDK’yı PlayDrop’un CDN’inden yükle; paket kurmaya gerek yok. `sdk.host.ready()` çağırmadan önce ilk oynanabilir kareyi çiz ve girdiyi hazırla. Ana uygulama duraklatınca simülasyonu duraklat, çift döngü oluşturmadan devam et ve ana uygulamanın ses politikasını izle.

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

## Kimlik, kayıtlar ve dil

`sdk.me` oyuncu kimliğini sunar ve `sdk.me.appData` özel kayıtları saklar; `sdk.achievements` ve `sdk.leaderboards` başarımları ve skorları yönetir. Kayıtlar, başarımlar ve liderlik tabloları giriş ön kontrolü olmadan çalışır. Satın alımlar veya çok oyunculu mod gibi gerçek bir hesap gerektiren özellikler için `sdk.me.isLoggedIn` kullan. Önizleme ve yakalama modları oyuncu ilerlemesi yazmamalıdır. `sdk.host.language` oyuncunun dilini verir: İngilizceyi ve farklıysa kendi dilini de sun. Bir oyun sayfasını çevirmek oyun içeriğini çevirmez. Bir galibiyet gibi doğal bir aradan sonra `sdk.host.requestReview()`, PlayDrop’un oyuncudan oyun başına en fazla bir kez inceleme istemesini sağlar; oyunun yanıtı asla öğrenmez, bu yüzden bunu ödüllendirme.

## Kütüphaneler, asset’ler ve çok oyunculu mod

`sdk.libs`, desteklenen Three.js, Phaser, Rapier, nipplejs ve Colyseus sürümlerini yükler. `sdk.assets` katalog, paket ve asset referansları sağlar; `sdk.social` arkadaşları, oyun kartlarını ve paylaşım eylemlerini sağlar. Barındırılan çok oyunculu mod için `sdk.multiplayer.getConnection()` sunucu adresini ve giriş yapmış oyuncunun jetonunu döndürür; Colyseus istemcisiyle katıl. Barındırılan sunucuları [sunucu SDK’sı](https://www.playdrop.ai/tr/create/learn/server-sdk) sayfası kapsar; kendi çalıştırdığın bir sunucu SDK’dan hiçbir şeye ihtiyaç duymaz. Eski relay oda API’leri kullanımdan kaldırıldı.

## Yayınlamadan önce SDK ile test et

Her zamanki geliştirme sunucunu çalıştır ve oyunu SDK ana uygulamasıyla gerçek PlayDrop çerçevesinde oynamak için Chrome’da `https://www.playdrop.ai/creators/<username>/apps/game/<slug>/dev?url=http://localhost:5173/` adresini aç. Herhangi bir localhost portu ya da https URL’si çalışır. Kayıtlar ve satın alımlar gibi hesap gerektiren özellikler, oyun bir kez yüklendikten sonra çalışır; özel bir yükleme yeterlidir. Tarayıcıda medya üretimi, ana uygulamanın onayladığı kredi maliyetiyle eşzamansız işler olarak çalışır. Oyun sayfası meta verileri için [catalogue.json](https://www.playdrop.ai/tr/create/learn/catalogue-json) sayfasına bak.

## Birlikte oyna

Oynanış aşamasında `await sdk.multiplayer.join("game")` kullan. Bağımsız olarak katılır ya da ana uygulamanın parti rezervasyonunu kullanır. Bir parti hatası, oyuncuları sessizce başka bir odaya bölmek yerine reddedilir. `getConnection()`, mevcut oyunlar için anlık bağlantı ayrıntıları API’si olarak kalır. Turlar boyunca aynı odayı koru ve ana uygulama katmanları oyun girdisini duraklatırken ağı canlı tut.

Ana uygulamanın parti penceresini açmak için bir oyuncu eyleminden `sdk.social.openParty()` kullan. Üyeliği `await sdk.social.getParty()` ya da `sdk.social.onPartyChange(callback)` ile oku. Oyunlar platform partilerini değiştiremez ya da mikrofonları kontrol edemez. Parti ve oda sesli sohbeti web/yerel ana uygulamada yaşar ve oyuncunun onayına, sessize almasına, engellemelerine ve kullanıma açılma uygunluğuna tabidir.

Akıcı oda oynatımı için, sonlu `{ x, y, z }` vektörleri kullanarak `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` çağır. İpuçları ses seviyesini ve panoramayı etkiler, yetkilendirmeyi asla. Sunucu takımları ve yakınlık uygunluğunu uygular.

Seçili yerel kumanda yuvaları `{ playerIndex, gamepadKey }` için `sdk.device.localPlayers` ve `sdk.device.onLocalPlayersChange(callback)` kullan. Bağlı kumanda envanteri ayrıdır; bağlantısı kopan bir yuva kimliğini korur. Yerel mod çevrimiçi odalara katılamaz. Kopyalanabilir `playdrop-metagame/recipes/play-together` tarifi her iki modu, iki hedefi ve oda politikalarını gösterir.

## Kumandalar

Fiziksel kumandaları ve PlayDrop telefon kumandalarını her platformda aynı şekilde `sdk.device` üzerinden oku. `init()` sonrasında `enableControllerInput()` fonksiyonunu bir kez çağır, oyun döngüsünde `gamepad(playerIndex)` oku (0, P1’dir) ve basma ile bırakma için `onButton` kullan. Eksenler ve düğmeler tarayıcının standart gamepad sırasını izler; düğmelerin `south` ve `east` gibi konumsal adları vardır ve `pad.label("south")` o kumanda için gösterilecek ifadeyi döndürür; örneğin `"A"` veya `"Cross"`. Menü PlayDrop’a aittir ve oyunu duraklatır.

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

`navigator.getGamepads()` çağırma: telefon kumandaları oyunlara yalnızca SDK üzerinden ulaşır ve bir oyun tarayıcı API’sini doğrudan okuduğunda PlayDrop uyarı kaydeder. Ana uygulama kumanda girdisi sağlayamazsa `enableControllerInput()`, `controller_input_unavailable` veya `controller_input_timeout` ile reddedilir ve oyun çalışmaya devam eder. `pad.has("dpad")` bir kontrolün var olup olmadığını söyler; oyununun ihtiyaç duyduğu kontrolleri [catalogue.json](https://www.playdrop.ai/tr/create/learn/catalogue-json) içinde bildir.
