مهم آموزش مولتی پلیر - RealTime - تعیین حریف بر اساس سطح
#1
سلام.

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

خب با توجه به قدرت کانستراکت در بازی سازی آنلاین و چند نفره ، معمولا دیده شده دوستان به جای استفاده از پلاگین Multiplayer فقط به استفاده از سرور ( هاست )  برای برگزاری انلاین بازی بسنده می کنن.
یعنی در واقع، مثلا در بازی نبرد فرماندهان، استفاده ای از پلاگین مذکور نشده و فقط ارسال اطلاعات مربوط به هر بازیکن، بر روی سرور اتفاق می افته و در لحظه ی وارد شدن کاربر به بازی ، یه سری اطلاعات با استفاده از Ajax از سرور خونده میشه و روی بازی فعلی، پیاده میشه.

اینکار به اینصورت هست که شما مثلا در زمانی که نیستید، بهتون حمله میشه. خب شما اگه شکست بخورید، مقداری سکه ( مثلا 200 تا ) از دست می دید و اینطوری اگه شما از قبل 1000 تا سکه داشتید، حالا که بعد از اون شکستی که نبودید، وارد بازی می شید، باید مقدار سکه ی شما 800 تا باشه.
در بازی نبرد فرماندهان یا امثال اون، Clash of Clans , Boom Beach و ... دقیقا همین کار در حال انجام هست.

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

خود استفاده از این روش، داستان هایی داره، اما بهترین روش تمرین این پلاگین، استفاده از نمونه های آماده ی خود کانستراکت2 هست و نمونه ای که در اینجا مدنظر هست رو میتونین از قسمت جستجوی پروژه های نمونه در کانستراکت با جستجوی عبارت multiplayer - real-time game رو مورد آزمایش قرار بدید.

برای تست بازی باید حداقل دو Tab جدا در مرورگر باز کنین و پس از Login در بازی ( ثبت نام نمیخواد، فقط اسم لازمه ) اونو تست کنین.

اولین اشکالی که پیش میاد در مورد بازی های دو نفره هست. خب، برای اینکار می تونین روش اتصال به اتاق رو که در مثال هست، به روش زیر تغییر بدید:

[تصویر:  1.jpg]

[تصویر:  2.jpg]

[تصویر:  3.jpg]




خب، با این روش، بر خلاف روش اصلی این بازی نمونه، فقط دو نفر همزمان میتونن از بازی باشن، اولین نفر میشه HOST و دومین نفر میشه Peer

در اینجا، ممکنه یه مشکلی پیش بیاد و اون هم اینه که ، اگه کلش رویال رو بازی کرده باشین، میدونین که بازی باید تقریبا عادلانه باشه. یعنی اگه شما سطح تجربه تون 9 باشه، معمولا با افرادی نبرد رو انجام می دین که در همین سطح هستند.

البته غیر از این سطح بندی، کلش رویال به تعداد جام هایی که دارید هم نگاه می کنه و مثلا اگه شما سطحتون 9 باشه با 1989 تا جام،  ممکنه حریفتون سطحش 8 باشه، اما تعداد جام های اون هم بین 1995 - 1975  باشه.

این تقریبا عادلانه است. ( البته با دقت و بازی بیشتر در کلش رویال، می تونین به این نتیجه برسید که چون تعداد کاربران بازی، بسیار زیاده، کلش رویال، حریف شما رو به نسبت کارت هایی که برای بازی انتخاب کردین، انتخاب میکنه و بازی بیشتر عادلانه میشه )


حالا چرا قضیه ی عادلانه بودن رو گفتم؟
به این خاطر که اگه شما بازی دو نفره بسازین، باید روشی باشه که بتونین عدالت رو برای نبرد دو نفره، برقرار کنین و نباید به صورتی باشه که  یه کاربری با سطح مثلا 10 که درخواست نبرد میده، با کسی نبرد کنه که سطحش 2 هست. در اینصورت کاربر 10 معمولا همیشه برنده میشه و سطحش بالاتر میره، و اون کاربر ضعیف تر، ضعیفتر میشه ( چقدر این قضیه شبیه به پولدار ها و فقیرهاست ):

راه حل چیه؟

من یه مثال ساده میزنم و فکر میکنم مثال روشن باشه.
اساس اتصال به یک کاربر در بازی های مولتی پلیر ، اتصال به Room هست . در صورتی که شما حداکثر کاربران یک Room رو دو نفر قرار بدید، کاربر سومی امکان اتصال به اتاق فعلی رو نداره.
در نتیجه، نفر سوم خودش میشه Host و باید منتظر Peer باشه ( رجوع شود به آموزش های آقا مجتبی )

اگه شما در بازی Room رو با نام game انتخاب کنین، اولین روم ( اتاق ) که پر میشه، اتاق بعدی اسمش میشه Room2 و همینطوری ادامه پیدا میکنه.
مگه اینکه اتاقی خالی بشه که دوباره از اسم اون استفاده بشه.


از طرفی ، شما همیشه سطح کاربر رو دارید، خب بر اساس این سطح، میتونین بر اساس نام Room و سطح کاربر، این اتصال رو برقرار کنین.
یعنی مثلا شما کلا 10 تا کاربر دارین، که میشه 5 تا اتاق، اگه کاربراتون دو نفر ، دو نفر سطح های 2 - 4 - 6 - 8- 10 داشته باشن، کافیه که شما با تغییر نام Room به یک اسمی که قراره به کاربری که همون سطح رو داره و قراره Peer باشه، اتصال رو دو نفره و بر اساس سطح کنین.

برای تست این روش، 4 مرتبه نرم افزار کانستراکت2 رو باز کنین و توی هر 4 تا بازی نمونه ی فوق الذکر رو باز کنین.
همچنین، اسم بازی رو به یه اسم خاص تغییر بدید( برای جلوگیری از اتصال با سایر کاربرانی که در حال تست بازی هستن)

[تصویر:  4.jpg]



[تصویر:  5.jpg]

همونطور که در تصویر مشاهده میشه، دو تا نمونه ی بالای صفحه با ROOM_NAME با مقدار level5  هستند و دو تای پایین level10


البته من به صورت دستی وارد کردم، و در اصل شما باید از شرط هایی برای این قضیه استفاده کنین. البته این فقط برای تست هست و در واقع شما باید اینکار رو با استفاده از سرور انجام بدید. یعنی برنامه ای ، فرضا php بنویسین که کاربری که درخواست اتصال میده، رو توی خودش نگه داره و کاربر بعدی رو هم سطح اون هست، بهش متصل کنه.
ان شاء الله یا من ، یا دوستانی که تخصص دارن، این مورد رو تکمیل خواهیم کرد.

خب برای تست بازی هایی که باز کردین، دکمه ی F4 رو بزنین ( داخل نرم افزار ) ( اینکار باعث میشه اولین لایوت بازی که همون Login هست ، اجرا بشه )

و طبق تصویر زیر می بینین که کار به درستی انجام میشه.




[تصویر:  6.jpg]



امیدوارم مورد استفاده دوستان واقع بشه.
و من الله توفیق.
  پاسخ


 سپاس شده توسط: GAME MOEIN ، rezamms ، shaygaaan ، kamran_cn ، mahdi_R8095 ، shazde ، Warrior ، hamed1985 ، erfab ، amin hosseini
#2
این آموزش، یک مورد استفاده ی دیگه هم داره که جزو کشفیات خودمه! خخخ 4

شما با استفاده از این روش، میتونین مشکل قطع اتصال در بازی های دو نفره رو تا حد زیادی رفع کنین ( شایدم کلا ) البته بیشتر قطع اتصال Peer رو.

چطور؟

الان وقتی دو نفر با هم توی اتاق هستند، وقتی Peer خارج بشه ( به هر دلیلی ) شما از قبل نام Room رو دارید. خب گه بعد از مثلا چند ثانیه دوباره بخواد بازی کنه و مثلا بازی شما هنوز زمان داره که کاربر مجددا وارد بشه، به اینصورت برای اتصال Peer که خارج شده، همون نام اتاق قبلی رو بهش می دید و متصل میشه.
البته !!

فقط کاری که باید بکنین اینه که اتاق رو قفل نکنین ( توی تصاویر بالا مشخص کردم )

برای تست هم میتونین بازی پنگ آنلاین رو انجام بدید و Peer رو خارج کنین و دوباره برگردین به بازی، میبینین که بازی از همونجایی که رفتین بیرون ( در واقع از ادامه ی بازی که Host در حال انجام هست، شروع میشه ، حتی امتیاز ها هم سینک میشه ( اگه امتیاز Peer سینک نشه گاها، شما باید با استفاده از سرور، امتیازات رو سینک کنین.)


البته من کمی در مورد هاست هم فکر کردم، یعنی زمانی که Host میره بیرون چه کنیم؟
اگه بازی های مولتی پلیر کانستراکت2 رو تست کنین، میبینین که بعد از خارج شدن Host ، دیگه peer نمیتونه کاری انجام بده.

راه حل: شما برای جلوگیری از این اتفاق، باید در دستور مربوط به خروج host ، یه گروه دیگه از دستورات رو فعال کنین و به peer ، اختیار کنترل خودش رو بدید. ( همین )

حالا Peer خودش میتونه بازی رو تموم کنه.

اما داشتم در مورد خروج هاست و برگشت دوباره ی اون میگفتم ! 4

یه کاری که میتونیم بکنیم اینه که، زمانی که هاست خارج شد، ما عملیات مربوط به Peer و Host  رو ذخیره کنیم، بعد Peer رو خارج کنیم و دوباره اونو ببریم توی اتاق دیگه ای و عملیات رو باز سازی کنیم ( مثلا مقدار سلامتی، مکانش و ... )

حالا اون Peer میشه Host. !!!!

ما نام اتاق رو ذخیره میکنیم و اگه اون کسی که هاست بود و خواست دوباره به بازی برگرده، کاری که میکنیم، اینه که اونو به عنوان peer وارد اتاق میکنیم و بازم مثل قضیه ی بازسازی عملیات Peer ، اطلاعات Host رو هم بازسازی می کنیم.

اینطوری هر کدوم از بازی خارج بشن، اون یکی جاشو میگیره.

من دقت کردم، زمانی که بازی کلش رویال رو انجام میدیم، یکی از طرف ها رو مینویسه : مهمان
فکر میکنم، کلش رویال هم از همین روش استفاده میکنه!

  پاسخ


 سپاس شده توسط: kamran_cn ، shaygaaan ، GAME MOEIN ، mahdi_R8095 ، shazde ، erfan002pooya ، hamed1985
#3
(1396/2/1، 01:24 عصر)mostafanastary نوشته است: این آموزش، یک مورد استفاده ی دیگه هم داره که جزو کشفیات خودمه! خخخ 4

شما با استفاده از این روش، میتونین مشکل قطع اتصال در بازی های دو نفره رو تا حد زیادی رفع کنین ( شایدم کلا ) البته بیشتر قطع اتصال Peer رو.

چطور؟

الان وقتی دو نفر با هم توی اتاق هستند، وقتی Peer خارج بشه ( به هر دلیلی ) شما از قبل نام Room رو دارید. خب گه بعد از مثلا چند ثانیه دوباره بخواد بازی کنه و مثلا بازی شما هنوز زمان داره که کاربر مجددا وارد بشه، به اینصورت برای اتصال Peer که خارج شده، همون نام اتاق قبلی رو بهش می دید و متصل میشه.
البته !!

فقط کاری که باید بکنین اینه که اتاق رو قفل نکنین ( توی تصاویر بالا مشخص کردم )

برای تست هم میتونین بازی پنگ آنلاین رو انجام بدید و Peer رو خارج کنین و دوباره برگردین به بازی، میبینین که بازی از همونجایی که رفتین بیرون ( در واقع از ادامه ی بازی که Host در حال انجام هست، شروع میشه ، حتی امتیاز ها هم سینک میشه ( اگه امتیاز Peer سینک نشه گاها، شما باید با استفاده از سرور، امتیازات رو سینک کنین.)


البته من کمی در مورد هاست هم فکر کردم، یعنی زمانی که Host میره بیرون چه کنیم؟
اگه بازی های مولتی پلیر کانستراکت2 رو تست کنین، میبینین که بعد از خارج شدن Host ، دیگه peer نمیتونه کاری انجام بده.

راه حل: شما برای جلوگیری از این اتفاق، باید در دستور مربوط به خروج host ، یه گروه دیگه از دستورات رو فعال کنین و به peer ، اختیار کنترل خودش رو بدید. ( همین )

حالا Peer خودش میتونه بازی رو تموم کنه.

اما داشتم در مورد خروج هاست و برگشت دوباره ی اون میگفتم ! 4

یه کاری که میتونیم بکنیم اینه که، زمانی که هاست خارج شد، ما عملیات مربوط به Peer و Host  رو ذخیره کنیم، بعد Peer رو خارج کنیم و دوباره اونو ببریم توی اتاق دیگه ای و عملیات رو باز سازی کنیم ( مثلا مقدار سلامتی، مکانش و ... )

حالا اون Peer میشه Host. !!!!

ما نام اتاق رو ذخیره میکنیم و اگه اون کسی که هاست بود و خواست دوباره به بازی برگرده، کاری که میکنیم، اینه که اونو به عنوان peer وارد اتاق میکنیم و بازم مثل قضیه ی بازسازی عملیات Peer ، اطلاعات Host رو هم بازسازی می کنیم.

اینطوری هر کدوم از بازی خارج بشن، اون یکی جاشو میگیره.

من دقت کردم، زمانی که بازی کلش رویال رو انجام میدیم، یکی از طرف ها رو مینویسه : مهمان
فکر میکنم، کلش رویال هم از همین روش استفاده میکنه!

سلام

من قبلا هم توی ی پست دیگه در این باره صحبت کردم ، این روش ها اصلا بدرد نمیخوره ( با عرض معذرت ) کد نویسی های الکی ، زحمات الکی ، ایده های الکی و همچنین باگ های زیاد و الکی ،،،
اگر از این روش استفاده کنید اولین مشکلی که پیش میاد این هست که بعد از ورود هر بازیکن با توجه به اینکه باید اطلاعات از زمانی که بازیکن نبوده فراخوانی بشه ، متاسفانه باید طوری برنامه ریزی بشه که اطلاعات توی دیتابیس بازی ثبت بشه ، اینطوری بدجور حجم دیتابیس بالا میره و اصلا خودش میشه ی باگ ،،، بعد اینکه ، شما باید تایم بازی رو با بازیکن ها با هم ست کنید ، مثلا من در نبرد مدرن ، طوری برنامه ریزی کردم که تایم هر دو بازیکنی که با هم متصل میشن ، اگر این مثلا 13 ثانیه دیگه وقت داره ، اون یکی دیگه هم 13 ثانیه داره ، شما اگر بازی مولتی پلیر ساخته باشید یا باهاش کار کرده باشید میدونید این جزو یکی از مشکلاتش هست ، چون اگر بازیکنی برای چند ثانیه ( به هر حالتی ) اتصال با موتور بازی نداشته ، میبینید که مثلا تایمش گیر میکنه یا حتی تایم بازیکن اول 30 ثانیه هست و تایم بازیکن دوم هنوز 60 ثانیه مونده ...

نکته بعدی اینکه اگر بازیکنی از روم خارج بشه ، باید این بازیکن ازش امتیاز کسر بشه ، و این اصلا مهم نیست که از وسط بازی دوباره بیاد ...
شما یک درصد فکر کن با اینترنتی که ایران داره ، اینترنت لگ بخوره ، خب خورد ! حالا بازیکنی که قطع شد حداقل 20 ثانیه طول میکشه که دوباره به بازی متصل بشه ، توی این 20 ثانیه اتفاقات زیادی میوفته ... پس در هر حال بازیکن بازنده هست .

نکته بعد از همه اینا ، این هست که بازیکنان اطلاعات رو از هم دریافت میکنن ، یعنی هاست از پیر دریافت میکنه و پیر از هاست دریافت میکنه ، اگر یکی از این دو طرف از لیوت خارج بشن ، بازی ناتموم میمونه که من قبلا هم گفتم میتونیم شرط بذاریم وقتی هرکدوم از بازیکن ها خارج شدند ، بازیکن دوم بتونه به بازی در همون لیوت ادامه بده ، اما از روم خارج بشه ، یعنی لیوت همون بمونه ، خب بازیکن دوم هنوز داره بازی میکنه و اطلاعات هم داره توی سرور رد و بدل میشه ، پس مشکلی پیش نمیاد . بازیکن دوم اگر امتیازش در آخر بیشتر باشه برنده میشه و بازیکن قبلی که بازنده هست امتیاز ازش کسر میشه و ... .

این ها باید به کار برن چون احتمال باگ داشتنشون کمتر هست .
  پاسخ


 سپاس شده توسط: mostafanastary ، hamed1985
#4
صد درصد صحبت شما درسته، اما چون این یک مشکل در روش مولتی پلیر کانستراکت هست( یا در واقع مشکل نیست، اصل قضیه همینطوریه )  باید راه حل هایی براش پیدا کرد.

این آموزشی هم که قرار دادم، دقیقا بابت همین موضوع هست.


صحبت شما در مورد قطع کلی بازی در سمت Peer هست، ولی من میگم با ذخیره ی نام اتاق، میشه دوباره اتصال رو بر قرار کرد.

اینطوری هم از شیء مولتی پلیر و راحتی کار با اون استفاده میشه، هم مشکلاتش رو به حداقل میرسونیم.

در مورد سنگین شدن بانک اطلاعاتی، باید عرض کنم، شما خودت بهتر میدونی که مثلا اینهمه اطلاعات بازی هایی که در روز داره توی کلش رویال یا کلنس، انجام میشه، همه ذخیره میشه و حتی Replay بازی هم وجود داره.


سنگین شدن بانک درسته، ولی فکر نمیکنم اونقدری باشه که مشکل بشه. کمااینکه میشه بعد از انجام بازی، اون اطلاعات رو حذف کرد.
  پاسخ


 سپاس شده توسط: hasansanaei ، shazde ، GAME MOEIN ، hamed1985
#5
بله بنده هم حرف شما رو درباره اون ها قبول دارم ، بلعکس موقعی که پست و مینوشتم همین فکر و میکردم .

اما ( اما داره دیگه ) شما حساب کن کلش آف کلنز مثلا 200 میلیون نصب فعال داشته باشه ، من میام برای بازی تازه ساز خودم که هنوز 200 تا کاربر فعال هم نداره ماهانه 80 هزار ت پول سرور میدم ، حالا به نظرتون اونی که 200 میلیون نصب فعال داره چقدر داره ماهانه به دلار پول سرور اختصاصی میده ؟؟؟
خب صد درصد داره 1 میلیون برابر من پول سرور میده !
سروری که من خریدم مثلا یک هارد ssd هم بذارم اختصاصی برای دیتابیس ، خب هزینه اون زیاد میشه ، اما مهم نیست ، اگر بازی بگیره درآمدشم همونطوری خوبه ، حذف اطلاعات هم کاری نداره ، اما کلش رویال ، حدودا هر چند وقت یکبار اگر توجه کنید دیتابیس رو کلیر میکنه و اینطوری میشه که ریپلی ها حذف میشه ، برای ما که بازی هامون با سرور های محدود تری هست باید هر روز اطلاعات نبرد ها پاک بشه ، بله این کار و میشه طبق گفته شما انجام داد ، اما اگر تعداد بازیکنان فعال بیش از 20 هزار نفرباشه ، باید یک هارد ssd برای دیتابیس اختصاصی بخرید ، چون دیتابیس های معمولی نمیکشه ،

انشاالله بنده از فردا تبلیغات نبرد مدرن رو شروع میکنم ، طی یک ماه آینده هرچقدر نصب داشته باشه بقیه اطلاعات رو هم میگم که آیا میشه یا نه ، اما چون قبلا سایت های بازی های آنلاین داشتم و حتی خودم کد نویسی میکردم ، درباره دیتابیس ها میدونم ، مثلا برای یک بازی که 100 بازیکن داره ، بستگی به نوع بازی میتونه بین 1 تا 30 مگ حجم دیتابیس رو ببره ...
  پاسخ


 سپاس شده توسط: mostafanastary


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 127 82,184 1402/8/24، 09:00 عصر
آخرین ارسال: mehdiosw
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 19,756 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,423 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 7,868 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100
  رفع مشکل خروجی فونگپ (: M.gh 11 7,955 1400/4/10، 02:17 صبح
آخرین ارسال: oak

پرش به انجمن: