Asenkron çok oyunculu

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! (KosmosGames'den), Match Arena - Üçlü Eşleştir! (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 (JL studio'den) "Hızlı Yarış" modunda, Çılgın motosikletler (haoda games'den).
  • Stratejiler ve autobattlerlar: diğer oyuncuların taktiklerine karşı savaşlar gerçekleştirilebilir. Uygun oyunlara örnekler: Ludus (Positron Dynamics'den), Like a King (Vladimir Saponenko'dan), TOYS: Crash Arena (Mad Pixel'den).

Konsept

  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

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 döndürür.

count parametresi, yüklenecek oturum sayısını belirler. Yanıttaki maksimum oturum sayısı 10'dur.

Seçimler için meta1, meta2, meta3 parametreleri kullanılır. Bu parametreler { min: %number%, max: %number% } şeklinde objeler olarak belirlenir ve oturum kaydetme sırasında belirlenir. Örneğin, meta1de oyun skoru, meta2de ise oyuncu seviyesi saklanıyorsa, bu parametrelerle mevcut kullanıcıya yakın kaydedilmiş oturumları yükleyebilirsiniz.

Önemli

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.

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: {
    meta1: {
      min: 0,
      max: 6000,
    },
    meta2: {
      min: 2,
      max: 10,
    },
  },
}).then(opponents => console.log(opponents));
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: {
      meta1: {
        min: 0,
        max: 6000,
      },
      meta2: {
        min: 2,
        max: 10,
      },
    },
  });

  console.log(opponents);
}

work();

Yanıt Formatı

[
  {
    id: string;
    meta: {
      meta1: number;
      meta2: number;
      meta3: number;
    };
    player: {
      avatar: string;
      name: string;
    };
    timeline: [
      {
        id: string;
        payload: object | string | undefined;
        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ı

Dikkat

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

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:

  • id — olayın benzersiz kimliği;
  • payload — olayın verileri: oyun dünyasındaki değişikliklerin özünü, nedenini yansıtan bilgi (örneğin, karakterin yeni koordinatları veya fare düğmesine basma);
  • time — oyun başlangıcından itibaren, duraklamalar dikkate alınarak geçen süre.

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

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

ysdk.multiplayer.sessions.commit()

commit() yöntemi, mevcut oyun oturumunun işlemlerini sabitler. Olay verileri (payload) yanı sıra gönderilir.

Önemli

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

Kullanım örneği

// İ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() 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 tanımlanmış olması gerekmektedir.

Kullanım örneği

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

Oturumlarla Çalışma

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

  • true — olaylar üzerinden çalışma;
  • false — kendi başına işlem yapma.

İ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() 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.

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: {
    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 yöntemleriyle yönetilir:

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

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

Çok oyunculu oturumları başlatma yöntemi 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:

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: {
      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();

Not

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 yanıt verir.

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

Sohbete yaz

Oturum kimliği.

Oturum kaydedilirken belirtilen meta1, meta2, meta3 gibi özel parametreler. Örneğin, oyun skoru veya oyuncu seviyesi.

Rakip oyuncu bilgileri:

  • avatar: string — Kullanıcının avatar URL'si;
  • name: string — Oyuncunun ismi.

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).

Olayın benzersiz kimliği.

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ı).

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