خصوصیات بازی - سرویس بلادرنگ

یکی دیگر از قابلیت‌های مدیر بازی بلادرنگ که به کمک رایانش به آن دست می‌یابد، تنظیم خصوصیات (properties) یک بازی است. به دلیل جزئیات زیاد موضوع، در این صفحه به صورت جداگانه به مسئله‌ی فوق می‌پردازیم.

پیش‌نیازها

  1. در صورتی که با سرویس بلادرنگ آشنایی ندارید، به معرفی سرویس بلادرنگ مراجعه کنید.
  2. در صورتی که هنوز با تنظیمات پنل سرویس بلادرنگ آشنا نشده اید، به تنظیمات پنل سرویس بلادرنگ مراجعه کنید.

توجه: برای استفاده از امکانات این بخش، باید در قسمت «تنظیمات عمومی» پنل تیک «فعال‌سازی حافظه‌ی بلادرنگ» را فعال کنید.

آشنایی با خصوصیات (Properties)

در یک بازی بلادرنگ عموما قصد دارید تا منطقی را در سمت سرور مدیریت و هدایت کنید. مثلا در یک بازی فوتبال آنلاین احتمالا می‌‌خواهید تعداد گل‌های زده شده، تعداد کارت‌های زرد و قرمز و خطاها و … را در سمت سرورِ بازی نگه‌داری کنید. اولین گزینه‌ای که به ذهن توسعه دهنده برای پیاده سازی این موارد می‌رسد، اینست که به کمک وب‌هوک‌های رویداد و … این اطلاعات را در یک جدول در پایگاه داده ذخیره کند. اما واقعیت اینست که در صورتی که نرخ ارسال رویداد شما زیاد است، نمی‌توانید اطلاعات خود را در پایگاه داده ذخیره کنید. چون وب‌هوک‌ها به شدت کند می‌شوند.

بنابراین، چاره چیست؟
در بکتوری برای این مشکل راه حلی تعبیه شده است؛ به این صورت که سرویس بلادرنگ می‌تواند یک json را (که می‌توان آن را نگاشتی از رشته به jsonهای دیگر انگاشت،) به عنوان وضعیت (state) بازی نگه‌داری کند. به این json اصطلاحا خصوصیات بازی (realtime game properties) می‌گوییم. درباره‌ی نحوه‌ی مقداردهی کردن و خواندن خصوصیات بازی در ادامه به طور مفصل صحبت شده است.

مقداردهی و خواندن خصوصیات

روش مستقیم

اولین راهی که وجود دارد که به کمک آن بتوان properties را set و get کرد، به کمک متدهای شیء Realtime Game است. این متدها مستقیما درخواست‌های REST ای را به سرور ریل تایم ارسال می‌کنند و نحوه‌ی استفاده از آن‌ها به شکل زیر است:

var game = new Backtory.RealtimeGame(realtimeGameId);
game.setProperties({redCards: 3,
                    fouls: 4, ...}, {
    success: function() {
        context.log('Properties are set successfully.');
    },
    error: function(error) {
        context.log(error);
    }
});

// Or
game.getProperties({
    success: function(props) {
        context.log(props);     // Will print: {redCard: 3, ...}
    },
    error: function(error) {
        context.log(error);
    }
});

مشخصا برای این‌که بتوانیم از متدهای بالا استفاده کنیم، نیاز به شیء game و به تبع آن realtimeGameId داریم. بنابراین، اولین جایی که می‌توان از متدهای بالا استفاده کرد، در وب‌هوک‌های Match Found و Challenge Ready است.

اما در این‌جا باید به یک نکته‌ی بسیار مهم دقت کنید؛ این که متدهای بالا، به دلیل ساختار سرورها و ماژول‌های بکتوری بسیار کند هستند. به عبارت دیگر، در صورتی که مثلا وب‌هوک‌های رویداد شما با نرخ بالایی صدا زده می‌شوند، اصلا بهینه نیست که در آن‌ها از متدهای setProperties و getProperties استفاده شود؛ بلکه به جای این دو، باید از روش غیر مستقیم استفاده کرد که در زیر توضیح داده می‌شود.

روش غیر مستقیم

این روش به این صورت است که در وب‌هوک‌های Event ،Start ،Join و Leave علاوه بر کلیدهای requestBody که در مستندات هریک آمده است، یک کلید دیگر به نام properties شامل خصوصیات بازی وجود دارد. شما می‌توانید این مقدار را خوانده، بر روی آن پردازش‌های لازم را انجام دهید و در نهایت در json تابع context.succeed به عنوان خروجی وب‌هوک، علاوه بر کلید message کلید properties را نیز قرار دهید تا مقادیر جدید به جای خصوصیات بازی ثبت شوند. نمونه کد زیر به عنوان مثالی از خواندن و نوشتن properties می‌تواند مورد توجه قرار گیرد:

exports.handler = function(requestBody, context) {
    var props = requestBody.properties || {};
    var redCards = props.redCards || 0;
    context.log('number of redCards til now:', redCards);

    props.redCards = redCards + 1;

    context.succeed({message: "A new red card is shown.",
                     properties: props});
}

در کد بالا، فرض شده است که می‌خواهیم به یک بازیکن کارت قرمز نشان دهیم. (یک سناریوی محتمل برای وب‌هوک رویداد!) بنابراین، خصوصیات بازی از requestBody به عنوان ورودی خوانده شده است. سپس، تعداد کارت‌های قرمز داده شده در زمین فوتبال را از آن استخراج کرده‌ایم تا در نهایت در خروجی تابع یک واحد به آن اضافه کنیم. بدین ترتیب، مقدار جدید در سرور بازی بلادرنگ ثبت شده و با صدا شدن وب‌هوک‌های بعدی به آن‌ها پاس داده می‌شود.

روش غیر مستقیم بهترین و بهینه‌ترین روش برای خواندن و مقداردهی کردن خصوصیات بازی است و فقط در صورتی از روش مستقیم استفاده کنید که امکان استفاده از این روش را نداشته باشید. بدین ترتیب، شما با تمامی نکات لازم درباره‌ی خصوصیات بازی آشنا شده‌اید.