---
metadata:
  - name: generator
    content: Diplodoc Platform v5.55.2
alternate:
  - https://yandex.com.tr/dev/games/doc/en/sdk/sdk-multiplayer-sessions.md
  - https://yandex.com.tr/dev/games/doc/hi/sdk/sdk-multiplayer-sessions.md
  - https://yandex.com.tr/dev/games/doc/ko/sdk/sdk-multiplayer-sessions.md
  - https://yandex.com.tr/dev/games/doc/ru/sdk/sdk-multiplayer-sessions.md
  - https://yandex.com.tr/dev/games/doc/tr/sdk/sdk-multiplayer-sessions.md
  - https://yandex.com.tr/dev/games/doc/vi/sdk/sdk-multiplayer-sessions.md
  - https://yandex.com.tr/dev/games/doc/zh/sdk/sdk-multiplayer-sessions.md
  - href: tr/sdk/sdk-multiplayer-sessions.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.com.tr/dev/games/doc/tr/llms.txt

# Asenkron çok oyunculu

<!-- source: tr/_includes/script-common.md -->
<!-- source: tr/_includes/script/index-js.md -->

<!-- endsource: tr/_includes/script/index-js.md -->

<!-- source: tr/_includes/script/requirements-js.md -->

<!-- endsource: tr/_includes/script/requirements-js.md -->

<!-- source: tr/_includes/script/image-modal-js.md -->

<!-- endsource: tr/_includes/script/image-modal-js.md -->
<!-- endsource: tr/_includes/script-common.md -->

`ysdk.multiplayer` modülünü kullanarak çevrimiçi multiplayer'a benzer rekabetçi bir mod oluşturabilirsiniz. Bu sırada şu şeyleri yapmanıza gerek yok:

- kendi sunucu çözümünüzü yazmak ve sürdürmek;
- hızlı rakip bulma için gereken belirli bir oyuncu kitlesine sahip olmak.

SDK aracılığıyla temel mekanizması gerçekleştirebilecek oyun türleri örnekleri:

- **Bulmacalar**: asenkron oturumlar komşu oyun alanlarında oynanabilir, zaman veya puan bazlı rekabet eklenebilir. Uygun oyunlara örnekler: [Kozkarta Online!](https://yandex.com.tr/games/app/211144){.external} (KosmosGames'den), [Match Arena - Üçlü Eşleştir!](https://yandex.com.tr/games/app/96787){.external} (PecPoc Piggy'den).
- **Koşucular ve yarışlar**: rakip oturumları oyuncuyla aynı anda seviyede hareket eden "gölgeler" olarak çizilebilir (hayalet sürücü mekaniği). Uygun oyunlara örnekler: [Çılgın Arabalar 2](https://yandex.com.tr/games/app/374739){.external} (JL studio'den) "Hızlı Yarış" modunda, [Çılgın motosikletler](https://yandex.com.tr/games/app/233231){.external} (haoda games'den).
- **Stratejiler ve autobattlerlar**: diğer oyuncuların taktiklerine karşı savaşlar gerçekleştirilebilir. Uygun oyunlara örnekler: [Ludus](https://yandex.com.tr/games/app/376147){.external} (Positron Dynamics'den), [Like a King](https://yandex.com.tr/games/app/140656){.external} (Vladimir Saponenko'dan), [TOYS: Crash Arena](https://yandex.com.tr/games/app/291515){.external} (Mad Pixel'den).



## Konsept {#concept}

1. Kullanıcı A oynar, SDK anahtar olayları (tuş vuruşları, durum değişiklikleri) kaydeder ve bunların zamanını belirler.
2. Bu olaylar sunucuda zaman çizelgesi (işlem listesi) olarak saklanır.
3. Kullanıcı B oyunu başlattığında, oturumuna daha önce kaydedilmiş zaman çizelgelerinden rakipler yüklenir.
4. SDK, rakiplerin eylemlerini gerçek zamanlı olarak yeniden üretir, eşzamanlı oyun hissi yaratır.



## Oturumların başlatılması ve yüklenmesi {#init}

Asenkron çok oyunculu ile çalışmaya başlamak için `ysdk.multiplayer.sessions.init()` yöntemini çağırın. Bu yöntem, başlangıçta oyun oturumlarının başlatılması ve rakip oyuncuların oturumlarının yüklenmesini gerçekleştirir.

Yöntem, [yüklenen oturumların bir dizisini](#response-format) döndürür.

Parametreleri kabul eder:

#|
|| **Parametre** | **Tür** | **Açıklama** ||
|| `count` | `number` | Yüklenecek oturum sayısını belirler. Yanıttaki maksimum oturum sayısı 10'dur. ||
|| `isEventBased` | `boolean` | [Olaylar aracılığıyla çalışmayı başlatmak](#use) için bayrak. ||
|| `maxOpponentTurnTime` | `number` | Rakibin tur süresini sınırlar ve `multiplayer-sessions-transaction` olaylarının gönderimleri arasındaki maksimum aralığı milisaniye cinsinden belirler. Belirtilirse, `maxOpponentTurnTime` süresinden daha uzun süren her rakip turu belirtilen değere kısaltılır. Varsayılan olarak, rakibin tur süresi sınırsızdır.

{% cut "`maxOpponentTurnTime` kullanım örneği" %}

Kaydedilen bir oturumda rakip, 2–10 saniye aralıklarla hamleler yaptı ve `maxOpponentTurnTime` parametre değeri 5000 ms. Bu durumda, bu rakibin tüm eylemleri, orijinal tur süresine bakılmaksızın, 5 saniyeden daha geç gerçekleşmeyecektir.

{% endcut %} ||
|| `meta` | `object` | Seçim için kullanılan `meta1`, `meta2`, `meta3` özel parametreleri. Bu parametreler `{ min: %number%, max: %number% }` şeklinde nesneler olarak belirlenir ve [oturum kaydedilirken](#push) ayarlanır. Örneğin, `meta1`'de oyun skoru, `meta2`'de ise oyuncu seviyesi saklanıyorsa, bu parametrelerle mevcut kullanıcıya yakın kaydedilmiş oturumları yükleyebilirsiniz. ||
|#

{% note warning %}

Oturumları yüklemek için en az üç `meta` parametresinden birini ve `count` parametresinin değerini sıfırdan büyük olarak belirlemeniz gerekir. Aksi takdirde, çok oyunculu yalnızca kayıt için başlatılacaktır.

{% endnote %}

{% list tabs %}

- Sorgu örneği

  ```javascript showLineNumbers
  ysdk.multiplayer.sessions.init({
    count: 2, // Yüklemek için rakip oturumlarının sayısı (en fazla 10).
    isEventBased: true, //Olaylar aracılığıyla çalışmayı başlatmak için bayrak.
    maxOpponentTurnTime: 200, // Rakibin hamle süresi sınırı (ms).
    [meta](*meta): {
      meta1: {
        min: 0,
        max: 6000,
      },
      meta2: {
        min: 2,
        max: 10,
      },
    },
  }).then(opponents => console.log(opponents));
  ```

- ES2017 async/await ile sorgu örneği

  ```javascript showLineNumbers
  const work = async () => {
    const opponents = await ysdk.multiplayer.sessions.init({
      count: 2, // Yüklemek için rakip oturumlarının sayısı (en fazla 10).
      isEventBased: true, //Olaylar aracılığıyla çalışmayı başlatmak için bayrak.
      maxOpponentTurnTime: 200, // Rakibin hamle süresi sınırı (ms).
      [meta](*meta): {
        meta1: {
          min: 0,
          max: 6000,
        },
        meta2: {
          min: 2,
          max: 10,
        },
      },
    });

    console.log(opponents);
  }

  work();
  ```

{% endlist %}

#### Yanıt formatı {#response-format}

```javascript showLineNumbers
[
  {
    [id](*id): string;
    [meta](*meta): {
      meta1: number;
      meta2: number;
      meta3: number;
    };
    [player](*player): {
      avatar: string;
      name: string;
    };
    [timeline](*timeline): [
      {
        [id](*timeline_id): string;
        [payload](*payload): object | string | undefined;
        [time](*time): number;
      },
      ...
    ];
  },
  ...
]
```

#|
|| **Parametre** | **Tür** | **Açıklama** ||
|| `id` | string | Oturum kimliği. ||
|| `meta` | object | Kullanıcıya özel `meta1`, `meta2`, `meta3` parametreleri. Örneğin, oyun skoru veya oyuncu seviyesi. ||
|| `player` | object | Rakip oyuncu bilgisi:
- `avatar: string` — Kullanıcı avatarının URL'si;
- `name: string` — Oyuncu adı.
||
|| `timeline` | array | Oyun oturumunu tanımlayan zamanlamalı olaylar dizisi:
- `id: string` — Olayın benzersiz kimliği;
- `payload` — Olay verileri: oyun dünyasındaki değişikliklerin nedeni ve özü hakkında bilgi (örneğin, karakterin yeni koordinatları veya fare düğmesine tıklama);
- `time: number` — Oyun başlangıcından itibaren duraklamalarla ayarlanan süre (ms).
||
|#



## Oyun oturumunun kaydı {#record}

{% note alert %}

Tek bir kayıtlı oturumun maksimum boyutu 200 KB'dir.

{% endnote %}

Kullanıcı oyun oturumlarını (zaman damgalı olaylar dizisi) kaydetmek için SDK kullanın. Olaylar, bulmacalarda tahtadaki figürlerin hareketleri veya koşucularda klavye veya fare tuşlarına basılma olabilir.

Kullanıcı girdisinin sürekli olduğu oyunlarda, örneğin koşucularda, olaylar belirli zaman aralıklarında yapay olarak oluşturulabilir ve karakterin durumu ile ilgili göstergeler kaydedilebilir — koordinatlar, enerji seviyesi vb. Buna ek olarak, oyundaki rastgele olaylar — ödüller, depremler de olabilir.

Oyunda meydana gelen olaylar, işlemler şeklinde kaydedilir. Her işlemin:

#|
|| **Parametre** | **Tür** | **Açıklama** ||
|| `id` | `number` | Olayın benzersiz kimliği. ||
|| `payload` | `object` | Olay verileri: oyun dünyasındaki değişikliklerin özünü ve nedenini yansıtan bilgi (örneğin, karakterin yeni koordinatları veya fare düğmesine tıklama). Anahtar-değer çiftleri içeren nesne. ||
|| `time` | `number` | Oyun başlangıcından itibaren duraklamalar dikkate alınarak geçen süre. ||
|#

Oyun süresince [commit()](#commit) yöntemiyle `payload`'u kaydedin. Bu şekilde, bir işlem listesi — oyun oturumunun zaman çizelgesi (`timeline`) oluşur.

Oyunun sonunda, oturumu [push()](#push) yöntemiyle sunucuda saklayın. Kaydedildikten sonra oturum bir sonraki oyunda yüklenebilir ve yeniden oynatılabilir.


### ysdk.multiplayer.sessions.commit() {#commit}

Yöntem, mevcut oyun oturumunun işlemlerini sabitler. İçine olay verileri ([payload](*payload)) iletilir.

{% note warning %}

Diğer işlem parametreleri — kimlik (`id`) ve oyunun başlangıcından itibaren süre (`time`) — SDK'da hesaplanır, bu nedenle `payload`un zamanında gönderilmesi önemlidir.

{% endnote %}

#### Kullanım örneği {#commit-ex}

```javascript showLineNumbers
// İlk işlem.
ysdk.multiplayer.sessions.commit({ x: 1, y: 2, z: 3, health: 67 });

// .......

// Sonraki işlem.
ysdk.multiplayer.sessions.commit({ x: 4, y: -2, z: 19, health: 15 });

// .......
```


### ysdk.multiplayer.sessions.push() {#push}

`push()` metodu, zaman çizelgesini uzak bir sunucuya kaydetmek için kullanılır. Oyun tamamlandığında çağrılır.

`meta1`, `meta2`, `meta3` değerleri oturum kaydedilirken ayarlanır. En az bir [meta parametresinin](*meta) tanımlanmış olması gerekmektedir.

#### Kullanım örneği {#push-ex}

```javascript
ysdk.multiplayer.sessions.push({ meta1: 12, meta2: -2 });
```



## Oturumlarla çalışma {#use}

Rakiplerin yüklü oturumları ile nasıl çalışacağını seçmek için [init()](#init) yöntemine `isEventBased` bayrağının gerekli değerini iletin:

#|
|| **Değer** | **Açıklama** ||
|| `isEventBased: true` | Olaylar aracılığıyla çalışma. ||
|| `isEventBased: false` | Bağımsız işleme. ||
|#


{% list tabs %}

- Olaylar aracılığıyla

  İstemci, `multiplayer-sessions-transaction` ve `multiplayer-sessions-finish` olaylarına `ysdk.on()` üzerinden abone olur ve SDK, ortak oturumu kendi yükler ve belirtilen zaman damgalarına göre olaylar üretir:

  - Oyun sırasında rakiplerin işlemleri, seans başlangıcından itibaren, ancak rakibin tur süresi sınırlamasını (`maxOpponentTurnTime`, [init()](#init) metodunun parametresi) dikkate alarak, kaydedilen anda `multiplayer-sessions-transaction` işlemcisine gelir.

  - Oturum bittiğinde, oyunu biten rakibin kimliği ile `multiplayer-sessions-finish` işlemcisi çağrılır.

  ```javascript showLineNumbers
  ysdk.multiplayer.sessions.init({
    count: 2, // Yüklemek için rakip oturumlarının sayısı (en fazla 10).
    isEventBased: true, //Olaylar aracılığıyla çalışmayı başlatmak için bayrak.
    maxOpponentTurnTime: 200, // Rakibin hamle süresi sınırı (ms).
    [meta](*meta): {
      meta1: {
        min: 0,
        max: 6000,
      },
      meta2: {
        min: 2,
        max: 10,
      },
    },
  });

  // Bu anda gerçekleştirilmesi gereken işlem dizisi buraya gelir:
  // mevcut işlem ve oyun donmalarından dolayı gecikmiş işlemler.
  ysdk.on('multiplayer-sessions-transaction', ({ opponentId, transactions }) = > {
    console.log(opponentId, transactions);
    // transaction.payload verilerinin oyun sahasında uygulanması.
  });

  ysdk.on('multiplayer-sessions-finish', (opponentId) => console.log(opponentId));
  ```

  Çok oyunculu modu başlatma ve duraklatma işlemleri [oyun olayları işaretleme](sdk-game-events.md/#gameplay) yöntemleriyle yönetilir:

  ```javascript showLineNumbers
  // Çok oyunculu modun başlaması.
  ysdk.features.GameplayAPI.start();

  // Çok oyunculu modun duraklatılması.
  ysdk.features.GameplayAPI.stop();
  ```

- Kendi çözümünüz

  Çok oyunculu oturumları başlatma yöntemi [init()](#init), içinde işlemlerle zaman çizelgeleri bulunan yüklenmiş rakip oturumlarının bir dizisini döndürür.

  Verileri alın ve kendiniz işleyin:

  ```javascript showLineNumbers
  const start = (opponent) => {
    console.log('player', opponent.player);
    console.log('timeline', opponent.timeline);

    // Zaman çizelgesi ve oyuncu verilerinin kullanım mekanizmasının uygulanması.
  }

  const work = async () => {
    const opponents = await ysdk.multiplayer.sessions.init({
      count: 2, // Yüklemek için rakip oturumlarının sayısı (en fazla 10).
      isEventBased: false, //Olaylar aracılığıyla çalışmayı başlatmak için bayrak.
      maxOpponentTurnTime: 200, // Rakibin hamle süresi sınırı (ms).
      [meta](*meta): {
        meta1: {
          min: 0,
          max: 6000,
        },
        meta2: {
          min: 2,
          max: 10,
        },
      },
    });

    console.log('opponents', opponents);

    for (let i = 0; i < opponents.length; i++) {
      start(opponents[i]);
    }
  }

  work();
  ```

{% endlist %}


---

<!-- source: tr/_includes/sdk-support.md -->
{% note info %}

Destek ekibi, hazır oyunu Yandex Oyun platformuna yerleştirmenize yardımcı olur. Geliştirme ve test etme konularındaki uygulamalı sorulara ise diğer geliştiriciler [Discord topluluğu](https://discord.com/invite/wU4p3whr4T){.external} yanıt verir.

{% endnote %}

Yandex Games SDK kullanırken sorunla karşılaşırsanız veya sorunuz varsa, lütfen destek ekibiyle iletişime geçin:

<!-- source: tr/_includes/button-chat.md -->
<a href="https://yandex.com/chat/#/user/a4fa5c06-75db-9b38-6eea-b1673785f7d5">
  <span class="button">Sohbete yaz</span>
</a>
<!-- endsource: tr/_includes/button-chat.md -->
<!-- endsource: tr/_includes/sdk-support.md -->

[*id]: Oturum kimliği.

[*meta]: Oturum kaydedilirken belirtilen `meta1`, `meta2`, `meta3` gibi özel parametreler. Örneğin, oyun skoru veya oyuncu seviyesi.

[*player]: Rakip oyuncu bilgileri:
- `avatar: string` — Kullanıcının avatar URL'si;
- `name: string` — Oyuncunun ismi.

[*timeline]: Oyun oturumunu tanımlayan zamanlı olaylardan oluşan bir dizi:
- `id: string` — Olayın benzersiz kimliği;
- `payload` — Olay verileri: Oyun dünyasında değişikliklerin özünü ve sebebini yansıtan bilgiler (örneğin, karakterin yeni koordinatları veya fare düğmesinin tıklanması);
- `time: number` — Oyunun başlangıcından itibaren duraklamalar göz önünde bulundurularak geçen süre (ms).

[*timeline_id]: Olayın benzersiz kimliği.

[*payload]: Olay verileri: Oyun dünyasında değişikliklerin özünü ve sebebini yansıtan bilgiler (örneğin, karakterin yeni koordinatları veya fare düğmesinin tıklanması).

[*time]: Oyunun başlangıcından itibaren duraklamalar göz önünde bulundurularak geçen süre.