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

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

در این بخش از آموزش گیم میکر در سایت ای تاتس قصد داریم روش ساخت یک بازی پلتفرم را آموزش بدیم. این آموزش در چند قسمت تشکیل شده که قسمت اول رو به شما کاربران سایت ای تاتس ارائه میدیم. با ما همراه باشید.

platform-011قسمت اول

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

ساخت یک بازی پلتفرم خوب تنها با یادگیری ابزار بازی میسر نیست و باید به چند چیز توجه نمود:

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

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

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

اول از همه دو عدد سپرایت به نام های spr_Block و spr_Ball می سازیم که برای آن ها تصاویر توپ و بلوک را انتخاب می کنیم.

آبجکتی به نام obj_Player بسازید. سپرایت spr_Ball را برای آن انتخاب کنید.

آبجکتی به نام obj_Block بسازید. سپرایت spr_Block را برای آن انتخاب کنید. گزینه ی Solid را برای این آبجکت فعال نمایید.

پنجره ی obj_Block را ببندید و به پنجره ی obj_Player بازگردید.

رویداد step ایجاد کنید و کد زیر را برای آن بنویسید:

// Check whether in the air
gravity_direction = 270;
if(place_free(x, y+1))
gravity = .5;
else
gravity = 0;

// Limit the vertical speed
if(vspeed > 12)
vspeed = 12;

این کد جاذبه را برای بازیکن شبیه سازی می کند. ابتدا gravity_direction به سمت پایین یعنی 270 درجه قرار می گیرد (یعنی جاذبه به سمت پایین باشد). سپس چک می شود اگر مختصات یک پیکسلی زیر بازیکن free بود (یعنی هیچ آبجکت solid در آن جا قرار نداشت) جاذبه با مقدار 0.5 به بازیکن اعمال شود که هر step به سرعت سقوط بازیکن 0.5 پیکسل اضافه می شود. اگر زیر بازیکن خالی نبود مقدار جاذبه را برابر 0 قرار می دهد.

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

حال رویداد Collision با آبجکت obj_Block را ایجاد کنید و در آن کد زیر را بنویسید:

move_contact_solid(direction, 12);
vspeed = 0;

این کد باعث می شود که بازیکن با برخورد به بلوک ها متوقف شود. تابع move_contact_solid برای دقت کار می باشد. با این تابع بازیکن با برخورد به بلوک، دقیقا در فاصله ی صفر پیکسلی آن قرار می گیرد. در خط اول ما گفتیم که تا 12 پیکسل حق داری در جهتی که داری حرکت می کنی (direction) پیش بری، تا به آبجکت solid برخورد کنی. می توانید این خط را حذف کنید تا تفاوت را در اجرای بازی ببینید. متوجه می شوید که بعضی وقت ها بازیکن با اندکی فاصله روی بلوک ها متوقف می شود.

خط دوم هم سرعت عمودی بازیکن که هنگام سقوط عددی مثبت بود را صفر می کند.

حالا یک room بسازید و دور تا دورش را آبجکت obj_Block قرار بدهید و در وسط اتاق آبجکت obj_Player را قرار دهید.

بازی را یک بار اجرا کنید.

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

حالا می خواهیم که توپ را حرکت بدهیم.

برای این کار از رویداد keyboard دکمه left را انتخاب کنید و در آن کد زیر را وارد کنید:

if(place_free(x – 4, y))
x -= 4;

این کد می گوید اگر پیکسل چهارم سمت چپ آبجکت آزاد بود 4 پیکسل به سمت چپ برو.

برای رویداد دکمه right هم کد زیر را وارد کنید تا به سمت راست حرکت کند.

if(place_free(x + 4, y))
x += 4;

آخرین کاری که برای بازیکن در این قسمت باقیمانده، پریدن است. برای پرش ابتدا باید چک شود که آبجکت روی زمین قرار دارد، سپس بپرد. روبداد دکمه space کد زیر را قرار دهید.

if(!place_free(x , y+1))
vspeed = -10;

این کد چک می کند اگر یک پیکسل زیر بازیکن آزاد نبود(!) سرعت عمودی اون را برابر منفی 10 قرار بده. این عدد باعث می شود که بازیکن با سرعت 10 پیکسل به سمت بالا حرکت کند، اما به محض این که از زمین جدا می شود، جاذبه ای که در رویداد step اعمال می شود باعث می شود سرعت عمودی رفته رفته حرکت به سمت بالا را متوقف کند و توپ شروع به سقوط کند (دقیقا مثل دنیای واقعی).

تعدادی بلوک در قسمت های مختلف بازی قرار دهید و بازی را دوباره اجرا کنید.

این اولین قدم در ساخت یک بازی پلتفرم بود.

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

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

بازی ساخته شده با قسمت قبلی آموزش را باز کنید و به جای سپرایت spr_Ball دو سپرایت spr_Player_Walk و spr_Player_Jump بسازید.

و برای پرش تصویری قرار دهید.

هنگام انتخاب تصویر اول به خاطر انتهای نام آن که _strip8 نوشته شده، تصویر به 8 تصویر تقسیم می شود و وارد گیم میکر می شود که انیمیشن راه رفتن را ایجاد می کند.

حال آبجکت obj_Player را باز کرده و سپرایت spr_Player_Walk را برای آن انتخاب کنید.

انتهای کد رویداد step کد زیر را اضافه نمایید:

// Animate
if(keyboard_check(vk_left) || keyboard_check(vk_right))
{
image_speed = 1;
}
else
{
image_speed = 0;
image_index = 0;
}

این کد می گوید اگر دکمه ی left یا right پایین بود (فشرده شده بود) سرعت اجرای انیمیشن سپرایت این آبجکت را برابر 1 قرار بده، در غیر این صورت سرعت اجرای انیمیشن را صفر قرار بده (متوقف کن) و اندیس تصویر کنونی آن را به روی اولین تصویر قرار بده. همان طور که می دانید، تصویر spr_Player_Walk انیمیشن راه رفتن می باشد. با این کد وقتی بازیکن دکمه ی چپ یا راست را فشار می دهد و کاراکتر شروع به حرکت می کند انیمیشن آن باید اجرا شود و وقتی دکمه های چپ یا راست را رها می کند، کاراکتر متوقف شده و دیگر انیمیشن راه رفتن را اجرا نکند.

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

بخش اول کد step را به فرم زیر تغییر دهید:

// Check whether in the air
gravity_direction = 270;
if(place_free(x, y+1))
{
gravity = .5;
sprite_index = spr_Player_Jump;
}
else
{
gravity = 0;
sprite_index = spr_Player_Walk;
}

در اینجا همان طور که قبلا گفتیم دو حالت می باشد؛ یا کاراکتر در هوا معلق است (حالت if) یا بر روی زمین است (حالت else). در حالت اول می گوییم که سپرایت پرش را و در حالت دوم می گوییم سپرایت راه رفتن را برای آبجکت انتخاب کن. sprite_index سپرایت کنونی آبجکت را در خود ذخیره می کند.

نکته ای که اینجا شاید به آن توجه کرده باشید این است که این سپرایت ها تنها برای جهت راست می باشند و هنگامی که بازیکن به سمت چپ حرکت می کند چه سپرایتی برای آن انتخاب کنیم؟

دو راه دارید. راه اول این که برای سمت چپ نیز دو سپرایت جدید بسازید و هنگام زدن دکمه های چپ و راست بگویید که سپرایت مربوط به همان جهت را نشان بده. راه دوم و بهتر این است که همین سپرایت را در حالت حرکت به چپ آیینه نماییم!

متغیری برای هر آبجکت به نام image_xscale وجود دارد که مقدار پیش فرض آن 1 می باشد. اگر آن را به 2 تغییر بدهیم، سپرایت نمایشی برای آبجکت دو برابر عریض تر می شود، و اگر مقدار 0.5 به آن بدهیم، 0.5 برابر عریض تر(جمع تر) می شود. حال اگر مقداری منفی به آن بدهیم، علاوه بر کشیده شدن، برعکس نیز می شود. پس با دادن مقدار منفی 1 به آن به مقصودمان می رسیم.

خب، از این image_xscale کجا استفاده کنیم؟ هنگامی به سپرایت سمت چپ نیاز داریم که کلید سمت چپ فشرده شود و بازیکن به سمت چپ حرکت کند، پس کد زیر را به انتهای کد رویداد کلید left اضافه می کنیم:

image_xscale = -1;

و کد زیر را هم به انتهای رویداد کلید right اضافه می کنیم:

image_xscale = 1;

تا در صورت فشردن کلید راست، دوباره سپرایت در حالت عادی نمایش داده شود.

بازی را اجرا کنید و تغییرات را ببینید.

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

ما در هنگام تعریف سپرایت، Origin آن را با X برابر صفر و Y برابر صفر تعیین کردیم. هنگامی که سپرایت می خواهد آیینه شود، از روی محور Origin خود این کار را انجام می دهد.

و به همین خاطر هنگامی که کلید چپ را فشار می دهید، 32 پیکسل چپ تر ظاهر می شود و برعکس.

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

مشکل دوم که گیر کردن سپرایت هنگام حرکت است، به خاطر Mask آن است که شمایلی نامتناسب دارد. در پنجره ی spr_Player_Walk دکمه Modify Mask را فشار دهید و تصویر سیاهی که روی سپرایت نشان می دهد را مشاهده کنید. این تصویر سیاه همان Mask می باشد. از تصویر Mask برای برخورد با اجسام دیگر استفاده می شود. بهتر است Mask را به شکلی بهتر که با بلوک های درون بازی مشکلی نداشته باشد تبدیل کنیم. بهترین شکل، یک مربع می باشد که می توانید با انتخاب Rectangle از بخش Shape آن را داشته باشید. می بینید که با انتخاب Rectangle تصویر سیاه به مربعی سیاه تبدیل می شود که روی سپرایت قرار دارد. حال برای محاسبه برخورد با سپرایت، این مربع استفاده می شود. برای این که اندازه مربع Mask سپرایت راه رفتن با سپرایت پرش هم اندازه باشد از Bounding Box گزینه ی Full image را انتخاب کنید که اندازه مربع برابر کل عکس یعنی 32 در 32 باشد.

برای سپرایت پرش نیز همین کار و کار تغییر Origin را انجام دهید.

حال بازی را دوباره اجرا کنید.

کاراکتر ما به اندازه کافی زیبا شد. حال نوبت محیط اطراف آن می باشد.

من می خواهم در پس زمینه ی بازی کوه قرار دهم.

Background جدیدی ایجاد کنید. نام آن را back_Mountains قرار دهید و تصویری را برای آن انتخاب کنید:

به پنجره room بازی بروید و از سربرگ backgrounds از لیستی که دارای 8 بک گراند از Background 0 تا Background 7 است اولین را انتخاب کنید. گزینه ی Visible when room starts فعال باشد و بک گراند back_Mountains را برای آن انتخاب کنید. گزینه ی Tile Vert. را غیرفعال کنید تا تنها به صورت افقی تکرار شود. مقدار Y را به 320 تغییر دهید تا کوها ها در پایین اتاق (جای مناسب) نمایش داده شوند.

بهتر است پس زمینه ی اتاق را از رنگ خاکستری کسل کننده به آسمانی آبی تغییر دهیم. برای این کار گزینه ی Color در بالای همین سربرگ را کلیک کنید و رنگ آبی را برای آن انتخاب کنید.

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

برای ابرها کمی متفاوت تر کار خواهیم کرد. می خواهم چند لایه ابر استفاده کنم که هر لایه با سرعتی متفاوت به سمتی حرکت خواهد کرد. در طبیعت هم ابرهایی که به ما نزدیک ترند به نظر می رسد با سرعت بیشتری در حال حرکت هستند.

ابتدا بک گراندی با نام back_Clouds بسازید و تصویر بالا را برای آن انتخاب کنید.

سپس در سربرگ backgrounds مربوط به اتاق Background 1 را انتخاب کنید. گزینه Visible when room starts را فعال کنید. بک گراند ابر را برای آن انتخاب کنید. گزینه ی Tile Vert. را غیرفعال کنید تا فقط به صورت افقی تکرار شود. مقدار Hor. Speed را برابر منفی 3 قرار دهید تا ابرها با سرعت 3 پیکسل به سمت چپ حرکت کنند(هنگام اجرای بازی). این لایه اول ابرها بود که در بالاترین قسمت قرار می گیرند و به ما نزدیک ترند. برای لایه دوم Background 2 را انتخاب کنید. همین کارها را تکرار کنید با این تفاوت که Y را برابر 128 و Hor. Speed را برابر منفی 2 قرار دهید. لایه سوم را نیز بسازید. Y آن را برابر 256 و Hor. Speed آن را برابر منفی 1 قرار دهید.

بازی را اجرا کنید.

تا اینجای کار بازی زیبایی داریم. پس بهتر است این بلوک های سنگی که ظاهر بازی را زشت کرده اند را با زمینی زیباتر جایگزین کنیم.

نیازی نیست آن ها را حذف کنید. آن ها هنوز نیاز هستند.

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

پس زمینه جدیدی با نام back_Platform بسازید و تصویری برای آن انتخاب نمایید.

گزینه ی Use as tile set را در همان پنجره ی back_Platform فعال کنید. پارامترهای جدیدی نمایان می شود. مقدار tile width و tile height را به 32 تغییر دهید. می بینید که تصویر به خانه هایی با عرض و ارتفاع 32 تقسیم می شود.

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

اگر آبجکت ها مزاحم کارتان هستند می توانید از بالای صفحه منوی کنار دکمه ی ذره بین را کلیک کنید و گزینه ی Show Objects را غیرفعال کنید.

می توانید با نگه داشتن دکمه ی shift یا ctrl همزمان چندین خانه را انتخاب کنید. یا با نگه داشتن دکمه ی alt خانه ای با عرض و ارتفاع دلخواه از روی عکس انتخاب نمایید.

اگر می خواهید کاشی کاری شما در چند لایه انجام شود. دکمه ی Add را انتخاب کنید. پنجره ای باز می شود. عمق متفاوتی وارد کنید. برای مثال می توانید 999999 را وارد کنید تا لایه ای با یک عمق کمتر از لایه پیشین انتخاب شود. لایه به لیست لایه ها اضافه می شود. هر چه عدد بیشتر باشد لایه عمیق تر است و زیرتر نمایش داده می شود. با دکمه Delete می توانید یک لایه را حذف کنید. یا می توانید با دکمه Change عمق لایه را تغییر دهید.

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

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

بازی را اجرا کنید و از آن لذت ببرید.

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

کامنت ها

یک پاسخ به “آموزش ساخت بازی پلتفرم در گیم میکر به صورت پیشرفته (قسمت اول)”

لطفا اگر سوالی نامرتبط با این مطلب دارید، از تب «پرسیدن سوال» استفاده کنید

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد.

<