آموزش ساخت سیستم توقف بازی-قسمت اول

آموزش ساخت سیستم توقف بازی-قسمت اول

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

اولا میتوان گفت که وجود سیستم pause برای هر بازی ضروری است.

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

بنابراین بیایید نحوه پیاده سازی pause را به صورت عملی انجام دهیم.در این آموزش ما سعی داریم برای بازی فرضی زیر سیستم pause بسازیم. همانطور که می بینید تعدادی توپ در میان دیوارهایی محصورشده اند و به صورت تصادفی در جهت های مختلف حرکت می کنند.

حالا به یک آبجکت که وظیفه مدیریت توقف بازی را دارد احتیاج داریم. بنابراین یک آبجکت جدید با نام obj_pause بسازید. دقت کنید که آن را در روم بازی قرار ندهید. این آبجکت در طول اجرای بازی توسط سایر آبجکت ها اضافه می شود. در ضمن توجه داشته باشیدکه نیازی به اسپرایت هم ندارد.

حالا به سراغ آبجکت توپ بروید. می خواهیم توقف و شروع مجدد بازی را به کلید P کیبورد وابسته کنیم. بنابراین یک رخداد release P-key را برای آن تعریف کنید و یک قطعه کد خالی در مقابل آن قرار داده کد زیر را در آن بنویسید:

if !instance_exists(obj_pause)

instance_create(0,0,obj_pause);

تفسیر

خط اول:اگر هیچ نمونه ای از آبجکت obj_pause در بازی قرار ندارد؛

خط دوم :یک نمونه از obj_pause را در نقطه 0و0 ایجاد کن.

نکته:

1: علامت ! منفی کننده عبارت شرطی است. میتوان به جای آن از عبارت not نیز استفاده کرد.

2: نقطه 0و0 یک نقطه دلخواه از صحنه بازی است وشما می توانید هر مختصات دیگری را به جای آن وارد کنید. زیرا عملکرد آبجکت متوقف کننده بازی به محل قرارگیری آن در روم ارتباطی ندارد.

سوال:هدف ما از نوشتن خط اول چیست:

از آنجا که ما در این پروژه 3 توپ در روم بازی قرار داده ایم، در صورتی که این شرط را قرار ندهیم ، در زمان اجرای بازی هرکدام از توپ ها یک obj_pause را تولید می کند و این موضوع علاوه بر اینکه خواسته ما نبوده، بلکه ممکن است  باعث اختلال در کارکرد بازی نیز بشود. بنابراین ما تنها به یک آبجکت obj_pause نیاز داریم و به همین علت ابتدا چک  می کنیم که در صورتی که هنوز هیچ نمونه ای از آن در روم وجود ندارد، یک نمونه از آن ساخته شود. با برآورده شدن این شرط و نتیجه آن، تنها یک آبجکت توپ قادر خواهد بود یک obj_pause تولید کند و سایر توپ ها امکان ساخت آبجکت را نخواهند داشت.

کد مربوط به آبجکت توپ در حال حاضر به این صورت است:

حالا به سراغ آبجکت obj_pause می رویم. باید کاری کنیم که به محض ظاهر شدن در بازی همه چیز را متوقف کند. بنابراین یک رخداد Create برای آن ایجاد کنید و کد زیر را در مقابل آن قرار دهید:

instance_deactivate_all(true);

این خط کد کار اصلی را برایمان انجام می دهد یعنی،: تمامی آبجکت های حاضر در بازی را غیرفعال می کند. همانطور که می بینید تنها به یک پارامتر درون پرانتز احتیاج دارد و آن هم انتخاب از میان دو عبارت true و false است:

اگر true را انتخاب کنیم به معنای آن است که تمامی آبجکت های بازی غیرفعال شوند، اما خود obj_pause فعال بماند. در صورتی که:

اگر false را انتخاب کنیم به معنای آن است که همه آبجکت های بازی بعلاوه خود obj_pause نیز غیرفعال شوند.

از آنجا که ما نیاز داریم که این آبجکت دائما فعال باشد تا به بازیکن اجازه بازگشت و شروع مجددد به بازی را بدهد بنابراین true را برمی گزینیم.

کد شما باید به صورت زیر باشد:

حالا زمان آن رسیده که امکان بازگشت به بازی بعد از متوقف شدن آن را ایجاد کنیم. همانطور که گفتیم کلید P را به طور دلخواه برای متوقف و یا پیگیری مجدد بازی انتخاب کرده ایم. بنابراین یک رخداد release P-key را برای obj_pause تعریف کنید  و درمقابل آن بنویسید:

 

instance_activate_all();

instance_destroy();

تفسیر

خط اول:تمامی آبجکت های بازی را فعال کن!

خط دوم:این آبجکت را از بازی حذف کن!

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

حالا به مرحله آخر قسمت اول این آموزش می رسیم:نوشتن عبارت Game Paused در هنگام متوقف بودن بازی به نشانه حالت توقف. بنابراین یک رخداد Draw به obj_pause اضافه کرده و در مقابل آن کد زیر را تایپ کنید:

draw_text(rooom_width/2,room_height/2,”GAME PAUSED”);

تفسیر

در وسط روم بازی عبارت GAME PAUSED به معنای “بازی متوقف شده است” را نشان بده.

نکته

1:عبارت room_width :به معنای طول روم بازی است و در نتیجه room_width/2 به معنای مرکز طولی روم است.

2:عبارت room_height :به معنای عرض روم بازی است و در نتیجه room_ height /2 به معنای مرکز عرضی روم است.

3:زمانیکه کلمه ای را داخل “” می نویسیم به معنای آن است که این کلمه یا عبارت یک عبارت متنی است.

حالا می توانید کار خود را تست کنید:

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

 

نقاط ضعف!!

همانطور که حتما متوجه شدید اگرچه کد های ما به درستی کار می کنند و وظیفه خود را به خوبی انجام می دهند اما کار ما در حال حاضر زیبابی چندانی ندارد. یعنی اینکه در زمان توقف بازی اگر ناگهان همه چیز ناپدید شود و با شروع مجدد آن ناگهان همه چیز ظاهر شود ایده خیلی جالبی نیست. علاوه بر این نحوه نمایش متن GAME PAUSED هم بیش از حد ساده و ابتدایی است و از لحاظ گرافیکی یک فاجعه به حساب می آید.!

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

فایل سورس پروژه این درس را دانلود کنید.(پس از دانلود آن را به داخل گیم میکر import کنید)

pause1.gmz

 

 

 

 

2 دیدگاه ها

  1. Saeed گفت:

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

    • خیلی ممنون،
      توی نسخه استودیو بعید میدونم اکشن آماده ای برای متوقف کردن بازی داشته باشیم.
      در ضمن بازیسازی با نوشتن کد خیلی قدرت و انعطاف بیشتری بهتون میده و خیلی حرفه ای تره.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *