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
- Kullanıcı A oynar, SDK anahtar olayları (tuş vuruşları, durum değişiklikleri) kaydeder ve bunların zamanını belirler.
- Bu olaylar sunucuda zaman çizelgesi (işlem listesi) olarak saklanır.
- Kullanıcı B oyunu başlattığında, oturumuna daha önce kaydedilmiş zaman çizelgelerinden rakipler yüklenir.
- 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, meta1
de oyun skoru, meta2
de 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 |
|
string |
Oturum kimliği. |
|
object |
Kullanıcıya özel |
|
object |
Rakip oyuncu bilgisi:
|
|
array |
Oyun oturumunu tanımlayan zamanlamalı olaylar dizisi:
|
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 payload
un 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 andamultiplayer-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:
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.