एसिंक्रोनस मल्टीप्लेयर

ysdk.multiplayer मॉड्यूल की मदद से, आप एक प्रतियोगी मोड बना सकते हैं जो ऑनलाइन-मल्टीप्लेयर जैसा होता है। इसके लिए आपको आवश्यकता नहीं होगी:

  • अपना खुद का सर्वर समाधान लिखने और उसे बनाए रखने की;
  • विरोधियों को जल्दी खोजने के लिए खिलाड़ियों का आवश्यक क्रिटिकल मास प्राप्त करने की।

वह शैलियाँ, जिनकी कोर यांत्रिकी को आप SDK के माध्यम से लागू कर सकते हैं:

  • पहेलियाँ: असिंक्रोनस सत्र आस-पास की गेमिंग फ़ील्ड्स पर खेले जा सकते हैं, समय या अंकों के आधार पर प्रतिस्पर्धा जोड़ी जा सकती है। उपयुक्त खेलों के उदाहरण: कसिनका ऑनलाइन! (KosmosGames द्वारा), Match Arena - थ्री इन ए रो! (PecPoc Piggy द्वारा)।
  • रनर्स और रेसिंग: विरोधियों के सत्र ‘छायाओं’ के रूप में दिखाए जा सकते हैं, जो खिलाड़ी के साथ स्तर पर एक साथ चलती हैं (घोस्ट ड्राइवर यांत्रिकी)। उपयुक्त खेलों के उदाहरण: वाइल्ड कार्स 2 (JL studio द्वारा) ‘स्पीड रेस’ मोड में, वाइल्ड मोटरसाइकल्स (haoda games द्वारा)।
  • रणनीतियाँ और ऑटोबैटलर्स: अन्य खिलाड़ियों की रणनीतियों के खिलाफ युद्ध लागू किया जा सकता है। उपयुक्त खेलों के उदाहरण: लुडुस (Positron Dynamics द्वारा), Like a King (Vladimir Saponenko द्वारा), TOYS: Crash Arena (Mad Pixel द्वारा)।

अवधारणा

  1. उपयोगकर्ता ए खेलते हैं, SDK प्रमुख घटनाओं (कीप्रेस, स्थिति में परिवर्तन) को रिकॉर्ड करता है और उनके समय को दर्ज करता है।
  2. ये घटनाएँ सर्वर पर एक टाइमलाइन (लेन-देन की सूची) के रूप में सहेजी जाती हैं।
  3. जब उपयोगकर्ता बी खेल शुरू करता है, उसकी सत्र में पहले से सहेजी गई टाइमलाइनों से प्रतिद्वंद्वी लोड होते हैं।
  4. SDK प्रतिद्वंद्वियों की क्रियाओं को वास्तविक समय में पुन: प्रकट करता है, जिससे एक साथ खेल का एहसास होता है।

सत्र का प्रारंभ और लोडिंग

असिंक्रोनस मल्टीप्लेयर के साथ शुरू करने के लिए, ysdk.multiplayer.sessions.init() विधि को कॉल करें। यह प्रारंभिक प्रारंभ और प्रतिद्वंद्वियों की खेल सत्रों को लोडिंग करता है।

यह विधि लोड किए गए सत्रों का एक एरे लौटाती है।

count पैरामीटर लोड करने के लिए सत्रों की संख्या निर्धारित करता है। जवाब में अधिकतम सत्रों की संख्या 10 है।

चयन के लिए meta1, meta2, meta3 पैरामीटर का उपयोग होता है। ये ऑब्जेक्ट्स की रूप में होते हैं { min: %number%, max: %number% } और सत्र सहेजते समय सेट किए जाते हैं। उदाहरण के लिए, यदि meta1 में खेल का स्कोर रखा जाता है और meta2 में खिलाड़ी का स्तर होता है, तो आप इन पैरामीटरों के उपयोगकर्ता से सन्निकट सहेजे गए सत्रों को लोड कर सकते हैं।

चेतावनी

सत्रों को लोड करने के लिए तीन meta पैरामीटरों में से कम से कम एक और count पैरामीटर को शून्य से अधिक सेट करना आवश्यक है। अन्यथा, मल्टीप्लेयर केवल लेखन के लिए प्राइत्रिति किया जाएगा।

ysdk.multiplayer.sessions.init({
  count: 2, // लोड करने के लिए विपक्षी सत्रों की संख्या (10 तक)।
  isEventBased: true, // घटनाओं के माध्यम से कार्य आरंभ करने के लिए ध्वज।
  maxOpponentTurnTime: 200, // विपक्षी की चाल की समय सीमा (एमएस)।
  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, // लोड करने के लिए विपक्षी सत्रों की संख्या (10 तक)।
    isEventBased: true, // घटनाओं के माध्यम से कार्य आरंभ करने के लिए ध्वज।
    maxOpponentTurnTime: 200, // विपक्षी की चाल की समय सीमा (एमएस)।
    meta: {
      meta1: {
        min: 0,
        max: 6000,
      },
      meta2: {
        min: 2,
        max: 10,
      },
    },
  });

  console.log(opponents);
}

work();

उत्तरीय प्रारूप

[
  {
    id: string;
    meta: {
      meta1: number;
      meta2: number;
      meta3: number;
    };
    player: {
      avatar: string;
      name: string;
    };
    timeline: [
      {
        id: string;
        payload: object | string | undefined;
        time: number;
      },
      ...
    ];
  },
  ...
]

पारामीटर

प्रकार

विवरण

id

string

सत्र का पहचानकर्ता।

meta

object

कस्टम पैरामीटर meta1, meta2, meta3। उदाहरण के लिए, खेल में स्कोर या खिलाड़ी का स्तर।

player

object

प्रतिद्वंदी खिलाड़ी की जानकारी:

  • avatar: string — उपयोगकर्ता के अवतार का URL;
  • name: string — खिलाड़ी का नाम।

timeline

array

समयबद्ध घटनाओं का एक श्रृंखला, जो गेम सेशन को दर्शाती है:

  • id: string — घटना का अनूठा पहचानकर्ता;
  • payload — घटना का डेटा: जानकारी, जो गेम वर्ल्ड में बदलाव के मूल कारण या उद्देश्य को दर्शाती है (उदाहरण के लिए, पात्र के नए निर्देशांक या माउस क्लिक करना);
  • time: number — खेल की शुरुआत से समय, विरामों को ध्यान में रखते हुए (मिलीसेकंड में)।

गेम सत्र रिकॉर्ड करना

प्रतिबंध

एक सेसियां का अधिकतम आकार 200 किलोबाइट है।

उपयोगकर्ताओं के गेम सत्रों (टाइमस्टैंप के साथ इवेंट्स की अनुक्रम) को रिकॉर्ड करने के लिए SDK का उपयोग करें। इवेंट्स बोर्ड पर पहेलियों में मोहरों का स्थानांतरण या रनर्स में कीबोर्ड या माउस बटन का दबाना हो सकते हैं।

जहां उपयोगकर्ता का इनपुट निरंतर होता है, जैसे कि रनर्स में, इवेंट्स को एक निर्धारित समय अंतराल पर कृत्रिम रूप से बनाया जा सकता है, चरित्र की स्थिति की विशेषताओं को रिकॉर्ड करते हुए — जैसे कॉर्डिनेट्स, ऊर्जा स्तर आदि। यह गेम में यादृच्छिक इवेंट्स भी हो सकते हैं — पुरस्कार, भूकंप।

गेम में होने वाले इवेंट्स को ट्रांज़ैक्शन्स के रूप में सुरक्षित किया जाता है। प्रत्येक ट्रांज़ैक्शन में होते हैं:

  • id — इवेंट का अद्वितीय पहचानकर्ता;
  • payload — इवेंट डेटा: जानकारी जो खेल की दुनिया में परिवर्तनों के कारण को प्रकट करती है (जैसे, चरित्र के नए कॉर्डिनेट्स या माउस बटन को दबाना);
  • time — खेल की शुरुआत से समय जिसमें विरामों का समायोजन होता है।

खेल के दौरान, payload को commit() मेथड की मदद से सुरक्षित करें। इससे एक ट्रांज़ैक्शन की सूची बन जाएगी — गेम सत्र की टाइमलाइन (timeline)।

खेल के अंत में, सत्र को सर्वर पर push() मेथड की मदद से सुरक्षित करें। सुरक्षा के बाद सत्र को लोड और अगली खेल में चलाया जा सकता है।

ysdk.multiplayer.sessions.commit()

commit() विधि वर्तमान गेम सत्र में लेनदेन को स्थिर करती है। इसमें घटना डेटा (payload) पारित किया जाता है।

चेतावनी

अन्य लेनदेन पैरामीटर — पहचानकर्ता (id) और गेम की शुरुआत के बाद का समय (time) — SDK में गणना की जाती है, इसलिए यह महत्वपूर्ण है कि payload समय पर भेजा जाए।

उपयोग का उदाहरण

// पहला लेन-देन।
ysdk.multiplayer.sessions.commit({ x: 1, y: 2, z: 3, health: 67 });

// .......

// अगला लेन-देन।
ysdk.multiplayer.sessions.commit({ x: 4, y: -2, z: 19, health: 15 });

// .......

ysdk.multiplayer.sessions.push()

विधि push() रिमोट सर्वर पर टाइमलाइन को सहेजने के लिए उपयोग की जाती है। इसका आह्वान खेल समाप्त होने पर किया जाता है।

meta1, meta2, meta3 मान सत्र को सहेजते समय निर्धारित किए जाते हैं। कम से कम एक meta-पैरामीटर को परिभाषित किया जाना चाहिए।

उपयोग का उदाहरण

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

सेशन्स के साथ काम करना

प्रतिद्वंदी के लोड किए गए सेशन्स के साथ काम करने का तरीका चुनने के लिए, मेथड init() में फ्लैग isEventBased की सही मान्यता प्रदान करें:

  • true — इवेंट्स के माध्यम से काम;
  • false — स्वयं द्वारा प्रोसेसिंग।

क्लाइंट ysdk.on() के माध्यम से multiplayer-sessions-transaction और multiplayer-sessions-finish इवेंट्स पर सब्सक्राइब करता है, और SDK स्वयं सत्र लोड करता है और उसमें दी गई समय की मायनों पर इवेंट्स प्रदान करता है:

  • खेल के दौरान प्रतिद्वंदी की ट्रांजेक्शन्स multiplayer-sessions-transaction हैंडलर में शुरुआती समय से रिकॉर्ड किया जाता है, लेकिन प्रतिद्वंदी के टर्न के समय की सीमा (maxOpponentTurnTime, मेथड के पैरामीटर init()) के साथ ध्यान में रखते हुए।

  • जब सत्र समाप्त होता है, तो हैंडलर multiplayer-sessions-finish उस प्रतिद्वंदी के आईडी के साथ बुलाया जाता है, जिसकी खेल समाप्त हो गई हो।

ysdk.multiplayer.sessions.init({
  count: 2, // लोड करने के लिए विपक्षी सत्रों की संख्या (10 तक)।
  isEventBased: true, // घटनाओं के माध्यम से कार्य आरंभ करने के लिए ध्वज।
  maxOpponentTurnTime: 200, // विपक्षी की चाल की समय सीमा (एमएस)।
  meta: {
    meta1: {
      min: 0,
      max: 6000,
    },
    meta2: {
      min: 2,
      max: 10,
    },
  },
});

// यहाँ एक समय में निष्पादित किए जाने वाले लेनदेन का एक समूह आता है:
// वर्तमान लेनदेन, साथ ही संभावित खेल के फ्रीज के कारण विलंबित लेनदेन।
ysdk.on('multiplayer-sessions-transaction', ({ opponentId, transactions }) = > {
  console.log(opponentId, transactions);
  // खेल के मैदान पर transaction.payload के डेटा का अनुप्रयोग।
});

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

मल्टीप्लेयर का स्टार्ट और पॉज़ गेमप्ले मार्कअप के माध्यम से नियंत्रित होते हैं:

// मल्टीप्लेयर शुरू करें।
ysdk.features.GameplayAPI.start();

// मल्टीप्लेयर पॉज।
ysdk.features.GameplayAPI.stop();

मल्टीप्लेयर आरंभ करने की विधि init() विरोधियों के लोड किए गए सत्रों की एक सरणी लौटाती है, जिसमें लेन-देन के साथ टाइमलाइन शामिल होते हैं।

डेटा प्राप्त करें और उन्हें स्वतः संसाधित करें:

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

  // टाइमलाइन और प्लेयर डेटा के उपयोग की प्रणाली का कार्यान्वयन।
}

const work = async () => {
  const opponents = await ysdk.multiplayer.sessions.init({
    count: 2, // लोड करने के लिए विपक्षी सत्रों की संख्या (10 तक)।
    isEventBased: false, // घटनाओं के माध्यम से कार्य आरंभ करने के लिए ध्वज।
    maxOpponentTurnTime: 200, // विपक्षी की चाल की समय सीमा (एमएस)।
    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();

नोट

टीम सपोर्ट के कर्मचारी यंडेक्स गेम्स प्लेटफॉर्म पर तैयार खेल को डालने में मदद करते हैं। डेवलपमेंट और परीक्षण के संबंध में आवेदनिक प्रश्नों का उत्तर अन्य डेवलपर्स देंगे Discord चैनल

यदि आप किसी समस्या का सामना कर रहे हैं या Yandex Games SDK के इस्तेमाल के बारे में आपका कोई प्रश्न है, तो कृपया समर्थन से संपर्क करें:

चैट करने के लिए लिखें

सत्र पहचानकर्ता।

सत्र को सहेजते समय निर्धारित किए गए उपयोगकर्ता-मूल्य पैरामीटर meta1, meta2, meta3, जैसे खेल में स्कोर या खिलाड़ी का स्तर।

प्रतिद्वंदी खिलाड़ी की जानकारी:

  • avatar: string — उपयोगकर्ता अवतार का URL;
  • name: string — खिलाड़ी का नाम।

गेमिंग सत्र का विवरण देने वाली घटनाओं की समयरेखा की सूची:

  • id: string — अद्वितीय घटना पहचानकर्ता;
  • payload — घटना डेटा: जानकारी जो बताती है कि कैसे और क्यों गेम वर्ल्ड में बदलाव आया (उदाहरण के लिए, चरित्र के नए निर्देशांक या माउस बटन का क्लिक);
  • time: number — खेल की शुरुआत से समय, विराम का भी ध्यान रखा गया (मिलीसेकंड में)।

घटना का अद्वितीय पहचानकर्ता।

घटना डेटा: जानकारी जो बताती है कि कैसे और क्यों गेम वर्ल्ड में बदलाव आया (उदाहरण के लिए, चरित्र के नए निर्देशांक या माउस बटन का क्लिक)।

खेल की शुरुआत से समय, विराम को ध्यान में रखते हुए।