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

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

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

قسمت سوم(آخرین قسمت)

thumbnail_text2

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

سطوح شیب دار

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

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

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

البته این تنها استفاده ی ما از ارث بری نیست. خود آبجکت obj_Ramp هم قرار است Parent آبجکت های دیگری که سپرایت آن ها را در بالا دیدید بشود.

ابتدا چهار آبجکت با سپرایت هایی که در بالا دیدید بسازید. این ها همان سطوح شیب دار بازیمان هستند که نیاز به کدنویسی برای هرکدام می باشد. اما می توانید تنها برای آبجکت obj_Ramp کدنویسی کنید و این آبجکت ها رفتارشان را از آن ارث ببرند. پس والد هرکدامشان را obj_Ramp قرار دهید.

توجه نمایید که obj_Ramp از obj_Block ارث می برد و چهار آبجکت جدید از obj_Ramp، پس رفتارهای obj_Block به این چهار آبجکت نیز ارث می رسد!

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

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

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

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

پس کد ما به صورت زیر تغییر می کند:

if(place_free(x + 4, y))
{
x += 4;
}
else if(place_free(x + 4, y – 2))
{
x += 4;
y -= 2;
}
image_xscale = 1;

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

برای دکمه حرکت به چپ نیز کد جدید را بنویسید.

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

همان طور که می بینید، بازیکن از سطوح شیب دار بالا می رود.

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

کد دکمه حرکت به راست را به کد زیر تغییر دهید:

if(place_free(x + 4, y))
{
if(place_meeting(x + 4, y + 4, obj_Ramp) && place_free( x + 4, y + 2))
{
y += 2;
}
x += 4;
}
else if(place_free(x + 4, y – 2))
{
x += 4;
y -= 2;
}
image_xscale = 1;

برای دکمه ی حرکت به چپ نیز کد جدید را بنوسید.

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

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

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

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

ابتدا می خواهیم کد غیرفعال کردن سقوط را بنویسیم. به رویداد Step بازیکن بروید و در انتهای آن کد زیر را اضافه کنید:

//Check whether on a ladder
if(position_meeting(x, y, obj_Ladder))
{
gravity = 0;
vspeed = 0;
sprite_index = spr_Player_Climb;
}

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

if(place_meeting(x, y, obj_Ladder))
{
if(place_free(x, y – 2))
y -= 2;
}
else if(!place_free(x , y+1))
{
vspeed = -10;
sound_play(snd_Jump);
}

قبل از چک کردن آزاد نبودن زیر بازیکن برای پرش چک می کنیم که در محل نردبان قرار دارد؟ اگر قرار داشت در صورت آزاد بودن بالای بازیکن، به سمت بالا می رود.

برای دکمه ی جهت پایین نیز کد زیر را قرار دهید:

if(place_meeting(x, y, obj_Ladder))
{
if(place_free(x, y + 2))
y += 2;
}

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

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

برای این کار بخش Animate را در رویداد Step بازیکن به صورت زیر تغییر دهید:

// Animate
if(position_meeting(x, y, obj_Ladder))
{
if(keyboard_check(vk_up) || keyboard_check(vk_down))
{
image_speed = 1;
}
else
{
image_speed = 0;
}
}
else if(keyboard_check(vk_left) || keyboard_check(vk_right))
{
image_speed = 1;
}
else
{
image_speed = 0;
image_index = 0;
}

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

راه حلی که برای جلوگیری از این اتفاق پیشنهاد می کنم استفاده از یک متغیر کمکی می باشد. در تمامی کد به جای انتساب سپرایت جدید به متغیر sprite_index، آن را به متغیری دیگر، مثلا temp_sprite انتساب دهید. و در انتهای کد آن را به sprite_index انتقال دهید.


temp_sprite = spr_Player_Jump;

temp_sprite = spr_Player_Walk;

temp_sprite = spr_Player_Climb;
}
sprite_index = temp_sprite;

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

توجه نمایید در این قسمت بازی تغییری در Origins سپرایت های بازیکن انجام داده ام تا مشکلی دیگر که با نردبان دارد حل شود. Y-Origin را در تمامی سپرایت های بازیکن به عدد 32 که زیر پای سپرایت است تغییر دهید.

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

استفاده از نما در بازی

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

این عمل در گیم میکر بسیار ساده انجام می شود.

ابتدا مرحله بازی را از اندازه ی فعلی آن گسترده تر کنید. برای این کار به سربرگ settings در پنجره ی room بروید و عرض و ارتفاع بزرگتری برای مرحله انتخاب کنید.

در فضای جدید مرحله، آبجکت های جدید بچینید و کاشی کاری انجام دهید.

حال به سربرگ views بروید. گزینه ی Enable the use of Views را فعال نمایید. View 0 را انتخاب نمایید و گزینه ی Visible when room starts را فعال نمایید. حال شما یک نما برای اتاق فعال کرده اید.

اگر بخواهید این نما به دنبال بازیکن حرکت کند می بایست در قسمت Object following آبجکت بازیکن را انتخاب نمایید.

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

 

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

ساخت صفحه منو

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

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

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

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

برای هرکدام از دکمه ها از رویدادهای ماوس، رویداد Mouse Enter را انتخاب کنید و کد زیر را در آن وارد کنید:

image_blend = c_yellow;

متغیر image_blend رنگی که به هنگام رسم سپرایت آبجکت با آن آمیخته می شود را در خود ذخیره می کند. ما با دادن رنگ زرد به آن باعث می شویم که سپرایت با ترکیب رنگ زرد کشیده شود.

این رویداد هنگامی رخ می دهد که ماوس روی آبجکت بیاید.

در رویداد Mouse Leave کد زیر را وارد نمایید:

image_blend = c_white;

رنگ سفید رنگ پیشفرض متغیر image_blend می باشد. در واقع ما در رویداد خروج ماوس می گوییم که سپرایت را همان حالت معمولی رسم کن.

یک room جدید به نام room_Menu بسازید. چهار آبجکت اخیر را در آن ها قرار دهید و بازی را اجرا کنید.

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

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

در دکمه ی Play از رویدادهای ماوس Left Pressed را انتخاب نمایید و کد زیر را در آن وارد کنید:

room_goto(room_Stage1);

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

در رویداد Left Pressed دکمه Load کد زیر را وارد کنید:

if(file_exists(‘Save.dat’))
game_load(‘Save.dat’);
else
show_message(‘No sava data founds!’);

این کد ابتدا چک می کند که فایل ‘Save.dat’ وجود داشته باشد، اگر وجود داشت، بازی را از روی آن لود می نماید و اگر وجود نداشت پیغامی مبنی بر وجود نداشتن فایل ذخیره نشان می دهد.

توجه نمایید در ادامه برای ذخیره، در انتهای هر مرحله، بازی را در همان فایل ‘Save.dat’ ذخیره می کنیم.

دکمه ی Info نیز همانند دکمه ی Play می باشد با این تفاوت که به اتاق room_Info که الان باید بسازید می رود.

در رویداد کلیک دکمه ی Exit کد خاتمه دادن به بازی را وارد کنید:

game_end();

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

بعد از منو می بایست صفحه ی Info را بسازید.

من در صفحه ی Info تنها یک دکمه ی بازگشت به منوی اصلی و مقداری متن قرار داده ام. دکمه ی بازگشت را می توانید همانند دکمه های دیگر بسازید و برای متن باید آبجکتی بسازید که متن مورد نظر را نمایش دهد.

برای این کار آبجکتی با نام cont_Info بسازید. در رویداد Create آن متن مورد نظرتان را در متغیری قرار دهید:

InfoText = “Make a platform game with game maker#Step by step##By Naser Mirzaei##For more tutorials goto#http://www.makeagame.ir/gamemaker/”;

علامت # در متن باعث رفتن به خط بعد در هنگام نمایش می شود.

حال به رویداد Draw بروید و در آن کد زیر را بنویسید:

draw_set_color(c_white);
draw_set_font(font_Info);
draw_set_halign(fa_left);
draw_text(128, 128, InfoText);

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

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

خط سوم ترازبندی نوشتن متن را چپ چین می کند و باعث می شود متن از سمت چپ به راست نوشته شود.

خط آخر متن را در مختصات 128 و 128 نمایش می دهد.

آبجکت را در اتاق Info اضافه کنید.

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

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

افزودن جان

تا این جا بازیکن هرچقدر بسوزد دوباره از ابتدای مرحله آغاز به کار می کند. اما ما باید برایش محدودیتی در نظر بگیریم که تا حدی بتواند جان از دست بدهد.

همانند متغیر score که امتیاز بازی را در خود ذخیره می کرد، گیم میکر متغیری به نام lives دارد که می تواند جان را در خود ذخیره کند. حال ما می خواهیم در ابتدای بازی تعدادی جان به بازیکن بدهیم که اگر همه ی آن ها را از دست داد، بازی از ابتدا شروع شود و امتیاز بازیکن نیز ریست شود.

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

ما آبجکتی به نام cont_Init ایجاد می کنیم که در اتاق اول یعنی همان room_Menu قرار دارد و متغیر lives و score را مقداردهی اولیه می کند. این آبجکت را ایجاد کنید و در رویداد Game Start آن این دو متغیر را مقداردهی اولیه کنید:

lives = 3;

score = 0;

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

آبجکت را در اتاق منوی اصلی قرار دهید.

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

//Die
lives -= 1;
sound_play(snd_Die);
sleep(1000);
if(lives <= 0)
game_restart();
else
room_restart();

کد سوختن هنگام برخورد با آبجکت روح و تیغ را نیز تغییر دهید.

افزودن هدفی دیگر در بازی

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

ابتدا آبجکتی به نام obj_Hostage بسازید. سپس 7 آبجکت دیگر با سپرایت هایی بسازید و والد آن ها را obj_Hostage قرار دهید.

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

 در رویداد Create آن کد زیر را وارد کنید:

image_speed = .05;

این کد سرعت اجرای انیمیشن آبجکت را به عدد 0.05 تغییر می دهد. به عبارتی 20 برابر آهسته تر اجرا می شود.

به آبجکت obj_Hostage بروید و در رویداد Create آن کد زیر را وارد کنید:

HelpVoice = instance_create(x, y- 32, obj_PleaseHelp);

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

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

with(HelpVoice){instance_destroy();}

این کد باعث می شود که هنگام نابودی آبجکت، متن کمکی که در هنگام ایجاد شدن ساخته بود نیز نابود شود.

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

sound_play(snd_Hostage);
with(other){instance_destroy();}

صدای snd_Hostage را می توانید ایجاد کنید.
این کد باعث می شود که آبجکتی که با آن برخورد کردیم نابود شود.

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

if(instance_exists(obj_Hostage))
exit;

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

همچنین قبل از کد رفتن به اتاق بعدی کد ذخیره ی بازی را وارد کنید تا در انتهای هر مرحله بازی ذخیره شود:

game_save(‘Save.dat’);

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

به دلیل این که تصمیم داریم در انتهای هر مرحله بازی ذخیره و در منوی اصلی بازی لود شود باید سیو و لود پیش فرض گیم میکر را غیرفعال کنیم. برای این کار از بخش Global Game Settings بازی سربرگ Other گزینه ی Let <F5> save the game and… را غیرفعال نمایید.

نمایش اطلاعات بازیکن

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

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

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

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

به آبجکت cont_Level بروید و در رویداد Draw آن کد زیر را اضافه کنید.

draw_set_font(font_GUI);
draw_set_color(c_white);
draw_set_halign(fa_left);

draw_text(view_xview + 16, view_yview + 16, “Score: “ + string(score));

دقت نمایید که به دلیل استفاده از نماها، می بایست امتیاز را در پیکسل با عرض 16 و ارتفاع 16 نما نمایش دهیم تا با حرکت نما، امتیاز نیز به همان صورت در پنجره باقی بماند. متغیر view_xview در واقع x نما و متغیر view_yview همان y نما می باشند.

حال می توانید مقدار جان را کمی پایین تر از امتیاز نمایش دهید. برای این کار کد زیر را در ادامه اضافه نمایید:

draw_text(view_xview + 16, view_yview + 32, “Lives: “ + string(lives));

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

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

var c, f;
for(c = 0; c < instance_number(obj_Hostage); c += 1)
{
f = instance_find(obj_Hostage, c);
draw_sprite_ext(f.sprite_index, 0, view_xview + 16 + (c * 24), view_yview + view_hview – 32, .5, .5, 0, c_white, 1);
}

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

حال کد را توضیح می دهم.

تابع instance_number تعداد نمونه های موجود از آبجکت مورد نظر را باز می گرداند. پس حلقه ی for به تعداد افراد باقی مانده اجرا می شود. برای مثال اگر 5 نفر برای نجات وجود داشته باشند، 5 بار بدنه ی for اجرا می شود (از صفر تا 4).

تابع instance_find شناسه ی نمونه ی شماره ی c از آبجکت obj_Hostage را یافته و در متغیر f قرار می دهد. پس هربار که بدنه ی for اجرا می شود شناسه ی یکی از افراد نجات نیافته در f ریخته می شود.

تابع draw_sprite_ext سپرایت مورد نظر را با پارامترهای ذکر شده می کشد. در اینجا سپرایت نمونه آبجکتی که در f ریخته شد را با image_index برابر صفر، x برابر view_xview + 16 + (c * 24)، y برابر view_yview + view_hview – 32، image_xscale برابر 0.5، image_yscale برابر 0.5، rotation برابر صفر، image_blend سفید و image_alpha برابر 1 کشیدیم. توجه نمایید که در مقدار x هر بار که حلقه ی for اجرا می شود، 24 پیکسل بیشتر قرار داده می شود.

در واقع ما به تعداد آدم های نجات نیافته، تصویر آن ها را با اندازه ی نصف کشیدیم.

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

پلیش و انتشار بازی

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

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

مطالب مرتبط

آموزش کد سیستم های عامل در گیم میکر

آموزش ایجاد نوار سلامتی در Game Maker

آموزش ExtremePhysics در گیم میکر به صورت پیشرفته

آموزش کار با Registry در گیم میکر

آموزش ساختمان داده ها در Game Maker (قسمت دوم)

آموزش ساختمان داده ها در Game Maker (قسمت اول)

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

محتوای مطلب

کامنت ها

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

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

    ___________________________________________
    ############################################################################################
    FATAL ERROR in
    action number 1
    of Draw Event
    for object cont_Level:

    Push :: Execution Error – Variable Get -7.font_info(100002, -1)
    at gml_Object_cont_Level_DrawEvent_1 (line 3) – draw_set_font(font_info);
    ############################################################################################

    • علی اکبر من به جای کد با اکشن کار می کنم. برو رویداد setp را بزن و از بخش score اکشن test score را انتخاب کن. مقادیر را به صورت زیر انتخاب کن.
      value: 9
      operation: گزینه سوم
      تیک not را نزن

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

پاسخ دهید

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

<