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

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

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

قسمت دوم

game-maker-studio-platformer-tutorial_78395

در قسمت قبل ظاهر بازی رو از حالت ساده و کسل کننده در آوردیم؛ اما تنها این ور و اون ور پریدن کمی کسل کننده است.

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

افزودن دشمنانmaxresdefault

با کلیک راست بر روی بخش Sprites و انتخاب Create Group گروهی جدید به نام Enemy ایجاد نمایید.

در آن یک سپرایت با نام spr_Skeleton ایجاد نمایید و تصویری را برای آن انتخاب نمایید.

آبجکتی به نام obj_Skeleton ایجاد نمایید و در رویداد Create آن کد زیر را بنویسید:

 

hspeed = 4;

همچنین در رویداد برخورد با آبجکت obj_Block آن کد زیر را بنویسید:

hspeed = -hspeed;

آبجکتی با نام obj_Limit ایجاد کنید و سپرایتی را برای آن قرار دهید.

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

در آبجکت obj_Skeleton در رویداد برخورد با obj_Limit کد زیر را بنویسید:

hspeed = -hspeed;

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

 

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

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

 

if(vspeed > 0 && y < other.y + 8)
{
//Destroy the enemy
score += 100;
vspeed = -3;
with(other){instance_destroy();}
}
else
{
//Die
sleep(1000);
room_restart();
}

این کد چک می کند که اگر هنگام برخورد، بالای اسکلت قرار داشتیم و سرعت هم به سمت پایین بود امتیاز کسب کنیم و دشمن نابود شود؛ در غیر این صورت از طریقی دیگر به اسکلت برخوردیم و باید خودمان بسوزیم. کد vspeed = -3 هم به این خاطر قرار دادم که پس از نابودی دشمن، بازیکن اندکی به بالا بپرد.

اسکلت کامل شد. اما به نظر یک دشمن کافی نیست! دشمنی دیگر هم می سازیم.

آبجکتی با نام obj_Ghost بسازید و سپرایتی را برای آن قرار دهید.

در رویداد Step این آبجکت کد زیر را قرار دهید:

 

mp_potential_step(obj_Player.x, obj_Player.y, 1, false);

با این تابع، روح با سرعت 1 پیکسل به دنبال بازیکن خواهد رفت. پارامتر آخر تعیین می کند که موانع solid دور زده شوند یا همه موانع. با مقدار false تنها موانع solid را دور خواهد زد.

در رویداد برخورد بازیکن با روح همان کد برخورد با اسکلت را بنویسید (می توانید رویداد مورد نظر را Duplicate نمایید).

تنوع دشمنان و رفتار آن ها باعث هیجان و جذابیت بازی می شود. شما می توانید به دلخواه خود دشمنانی بیشتر با رفتارهایی متفاوت تعریف کنید.

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

افزودن امتیاز

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

ما قصد داریم در بازی سکه هایی قرار دهیم که با دریافت آن ها بازیکن 100 امتیاز دریافت می کند و این با هدف بازی که کسب امتیاز بیشتر هست نیز سازگاری دارد. همیشه یادتان باشد امتیازی در بازی که به هیچ دردی نمی خورد نگذارید!

ابتدا یک آبجکت به نام obj_Coin بسازید و سپرایت زیر را برای آن انتخاب کنید:

 

و کد زیر را در آبجکت بازیکن در کد برخورد با سکه بنویسید:

score += 100;
with(other){instance_destroy();}

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

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

انتهای مرحله

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

یک آبجکت به نام obj_Exit بسازید و تصویری را برای سپرایت آن قرار دهید.

و در رویداد برخورد بازیکن با آن کد زیر را قرار دهید:

if (room != room_last)
{
room_goto_next();
}
else
{
highscore_show(score);
game_restart();
}

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

این تابلو را نیز در انتهای مرحله قرار دهید.

افزودن صدا به بازی

صدا یکی از پایه های بازی می باشد که به آن جذابیت زیادی می دهد. بازی ما هم اگر صدا داشته باشد، بهتر و شیرین تر می شود.

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

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

حال به کد مربوط به پریدن بازیکن (رویداد دکمه Up) بروید و آن را به صورت زیر تغییر دهید:

if(!place_free(x , y+1))
{
vspeed = -10;
sound_play(snd_Jump);
}

از این به بعد هنگام پریدن صدای پرش نیز شنیده می شود.

برای صدای امتیاز هم ابتدا فایلی را با نام snd_Coin به بازی اضافه کنید.

سپس کد زیر را در رویداد برخورد با سکه اضافه کنید:

sound_play(snd_Coin);

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

 

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

if(vspeed > 0 && y < other.y + 8)
{
//Destroy the enemy
sound_play(snd_Jump);
score += 100;
vspeed = -3;
with(other){instance_destroy();}
}
else
{
//Die
sound_play(snd_Die);
sleep(1000);
score = 0;
room_restart();
}

کد برخورد با روح را نیز تغییر دهید.

بعد از افکت های صوتی نوبت به افزودن موسیقی به بازی می شود. ابتدا یک صدا با نام snd_Music ایجاد نمایید و فایلی را برای آن انتخاب کنید.
همان طور که می بینید با انتخاب فایل mid برای آن Kind صدا به Background music تغییر می کند. این نوع مناسب موسیقی بازی می باشند و برخلاف صداهای معمولی به طور کامل در حافظه برای اجرا قرار نمی گیرند، تا در مصرف حافظه صرفه جویی شود.

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

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

در رویداد Create کد زیر را قرار دهید:

sound_loop(snd_Music);

این تابع نیز صدا را اجرا می کند، با این تفاوت که صدا پس از پایان یافتن دوباره بخش می شود.

در رویداد Room End که در بخش Other در لیست رویداد ها می باشد کد توقف موسیقی بالا را قرار دهید:

sound_stop(snd_Music);

حال بازی را اجرا کنید و از صدای اضافه شده به بازی لذت ببرید.

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

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

در رویداد Game Start آبجکت cont_Level کد زیر را وارد کنید:

global.Volume = 0.8;
global.VolumeRate = 0.01;
sound_global_volume(global.Volume);

این جا دو متغیر global به نام های Volume و VolumeRate تعریف می کنیم که حجم صدا و میزان تغییر حجم صدا را در خود ذخیره کنند. تابع sound_global_volume صدای کلی بازی را تعیین می کند که مقدار بین صفر تا یک را دریافت می کند. ما در اینجا مقدار 0.8 را به آن داده ایم.

برای افزایش حجم صدا در رویداد کلید + آبجکت cont_Level کد زیر را وارد کنید:

global.Volume = min(1, global.Volume + global.VolumeRate);
sound_global_volume(global.Volume);

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

global.Volume += global.VolumeRate;
if(global.Volume > 1)
global.Volume = 1;

این کار برای این است که مقدار متغیر از عدد 1 فراتر نرود. پس از تغییر مقدار دوباره تابع sound_global_volume اجرا می شود تا صدای بازی با مقدار جدید به روز شود.

برای کاهش حجم صدا نیز در رویداد کلید – آبجکت cont_Level کد زیر را وارد کنید:

global.Volume = max(0, global.Volume – global.VolumeRate);
sound_global_volume(global.Volume);

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

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

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

کامنت ها

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

پاسخ دهید

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

لطفا اگر سوالی خارج از موضوع این مطلب دارید آن را در فروم مطرح کنید.

<