چگونه بازی پلتفرم بسازیم؟
|اضافه کردن دشمن
امیدوارم تا حالا با مراحل اضافه کردن اسپرایت و انیمیشن آشنا شده باشید. به خاطر همین برای اینکه آموزش زیاد طولانی نشه دوباره تکرار نمیکنیم. بیاین یه اسپرایت جدید برای دشمن وارد کنیم.
- یه شیء اسپرایت جدید به لیوت اضافه کنید.
- اسپرایت استریپ Enemies\Snail رو انتخاب کنید.
- اوّلین فریم انیمیشن رو که خالیه حذف کنید.
- تنظیم کنید وقتی انیمیشن تموم شد دوباره از اوّل پخش بشه، و سرعتش هم 15 باشه.
- نقطهی مبدأ رو بذارین پایین حلزون و این نقطه رو به همهی انیمیشن اعمال کنید.
- قسمتهای خالی اضافی همهی فریمها رو حذف کنید (shift + crop)
- ویرایشگر تصویر رو ببندید و اسم شیء رو SnailEnemy بذارید.
- همون طور که میبینید اون رو روی زمین قرار بدین.
حالا میخوایم از الگوی زیر پیروی کنیم:
– اگه پلیر از بغل به حلزون برخورد کنه، چشمک میزنه[1].
– اگر پلیر از بالا روی حلزون بپره، حلزون میمیره.
برای چشمک زدن پلیر، پلیر رو انتخاب کنید و بهش رفتار Flash بدین. حواستون باشه پلیر واقعی رو انتخاب کنید، نه شیء PlayerBox رو (چون ما میخوایم اون پلیری که دیده میشه چشمک بزنه) برای این کار از اکشنهای رفتار Flash استفاده میکنیم.
به نمای ایونت شیت بروید، و ایونتی جدید اضافه کنید:
PlayerBox -> On collision with another object -> SnailEnemy
وقتی با هر زاویهای به حلزون میخوریم این ایونت اجرا میشه. ما میتونیم برای اینکه آیا پلیر از بالا روی حلزون پریده یا از بغل بهش برخورد کرده از ساب-ایونتها استفاده کنیم. بیاین اوّل تست کنیم که آیا پلیر بالای سر حلزونه.
یه ساب-ایونت به ایونت برخورد اضافه کنید:
PlayerBox -> Is falling
ما باید بررسی کنیم که آیا پلیر واقعاً بالای سر دشمن قرار داره. این کار از کشته شدن تصادفی حلزون جلوگیری میکنه، مثلاً اگر از گوشهای پایین بیفتیم حلزون دیگه نمیمیره. روی شرط Is falling کلیک راست کنید و گزینهیAdd another condition رو انتخاب کنید. حواستون باشه برای اجرا شدن یک ایونت باید همهی شرطهاش درست باشن. این شرط رو اضافه کنید:
PlayerBox -> Compare Y -> Less than, SnailEnemy.Y
محور Yها به سمت پایین افزایش پیدا میکنه ( یعنی همین طور که به طرف پایین میریم Yها بیشتر میشن دقیقاً برعکس ریاضی)، بنابراین اگه Y پلیر کمتر از مال حلزون باشه، پلیر بالاتر از اون قرار داره.
در این ایونت، این اکشن رو اضافه کنید تا حلزون نابود بشه:
SnailEnemy -> Destroy
ما میتونیم با افزودن اکشن دیگری باعث شویم پلیر به سمت بالا نیز بجهد:
PlayerBox -> Set vector Y -> -700
Set vector Y اساساً فقط سرعت عمودی حرکت پلت فرم رو تنظیم میکنه؛ تنظیمش به عددی منفی آن را به سمت بالا تنظیم میکند (چون محور Y به سمت پایین افزایش مییابد)، و 700 کمی از قدرت پرش پلیر یعنی از 1100 کمتره. پس این کار باعث میشه پلیر بجهد که این جهیدن مثل پرشی ضعیف میمونه.
هنوز تموم نشده: روی حاشیهی ایونت Is falling کلیک راست کنید (حاشیه همون جاییه که سمت چپ آیکون PlayerBox هست) و Add -> Else را انتخاب کنید. Else یک شرط مخصوصه که اگر ایونت قبلی اجرا نشه اون اجرا میشه. پس اگر ما به حلزون برخورد کنیم امّا روی آن نپریده باشیم این ایونت اجرا خواهد شد – یعنی از بغل به حلزون برخورد کردیم. در این ایونت که میخواهیم پلیر آسیب ببیند. این اکشن را اضافه کنید:
(مقادیر پیشفرض را تغییر ندهید و روی Done کلیک کنید) -> Player -> Flash
یادتون باشه که رفتار Flash در شیء Player است نه PlayerBox.
خوب، چون پلیر هیچوقت نمیمیره، فقط چشمک میزنه. امّا تونستین تشخیص بدیم که آیا از بالا روی آن پریدیم یا از کنار به آن برخورد کردیم. در این آموزش تمام ویژگیهای کنستراکت 2 گفته نشدهاند، امّا الآن فقط میگیم کجا افکتهای مردن رو ایجاد کنید (سعی کنید وقتی حلزون نابود شد یک اسپرایت poof روی آن ایجاد کنید، با استفاده از اکشن Spawn object حلزون) و کجا از سلامتیاش کم کنیم (در ایونتی که باعث میشود پلیر چشمک بزند – میتوانید در مورد سلامتی با استفاده از متغیرهای اینستنس یه کارهایی بکنید).
بیایید عقب و جلو رفتن حلزون روی زمین رو تنظیم کنیم.
حرکت دشمن
مشکل اصلی حرکت حلزون اینه که چگونه تشخیص دهد که به لبهی پرتگاه رسیده است. سادهترین راه انجام این کار نشانگذارهای نامرئی پرتگاههاست. اینها فقط اسپرایتهای نامرئیای هستند که وقتی حلزون به آنها برخورد کند جهت حرکتش را قرینه میکنند.
ما میتوانیم برای حلزون نیز دوباره از رفتار Platform استفاده کنیم. و این کار خوبی است زیرا:
– میتواند به چپ و راست حرکت کند
– میتواند از سطح شیبدار پایین و بالا برود درست همان طور که پلیر میتواند
– از پرتگاهها پایین میافتد اگر بخواهید
– اگر بخواهید دشمنی بسازید که بتواند بپرد، میتوانید با اکشن simulate control تنظیم کنید که به صورت خودکار بپرد.
به اسپرایت SnailEnemy رفتار Platform را اضافه کنید. به خاطر اینکه ما از انیمیشنهای زیادی روی این شیء استفاده نکردیم، میتوانیم با استفاده از رفتار پلت فرم شیء به طور مستقیم بدون شیئی نامرئی رفتار Platform رو مستقیم به خودش بدهیم. توجه داشته باشید اگر بازی پلت فرم دیگری با دشمنهایی که انیمیشنهایی زیاد دارند بسازید، باید از همان تکنیک اسپرایت نامرئی که برای پلیر استفاده کردیم استفاده کنید.
ما نمیخواهیم پلیر دشمن را کنترل کند، ما میخواهیم به طور خودکار کنترل شود. ما میتوانیم این کار را با تنظیم Default controls به No در نوار ویژگیها و بعد با استفاده از اکشن Simulate control انجام دهیم. چون حلزونها نسبتاً آهسته حرکت میکنند، Max speed را به 50 تنظیم کنید و Acceleration و Deceleration را به 100 تنظیم کنید!
ما همچنین به نشانگذارهای پرتگاه نیاز داریم. اسپرایتی جدید اضافه کنید و فقط یک مستطیل رنگی بکشید.
آن را EdgeMarker بنامید. سایز شیء را به 40×40 تغییر دهید و Intial visibility آن را به Invisible تغییر دهید تا نتوانیم آن را ببینیم. در آخر هر یک از زمینها یکی از آنها را قرار دهید مثل این: (فراموش نکنید با نگه داشتن کلید کنترل و درگ کردن میتوانید اینستنسهایی[2] جدید از شیئتان ایجاد کنید)
حلزون باید بداند که الآن در چه راهی حرکت میکند، چپ یا راست. میتوانیم این کار را با متغیّرهای اینستنس (instance variables) انجام دهیم. اینها اعداد یا متنهایی هستند که در هر اینستنس شیء ذخیره میشوند. اگر چند حلزون داشته باشیم، این متغیّرها برای هر کدام از آنها به طور مجزّا ذخیره میشوند. این به آنها اجازه میدهد که سلامتی، جهت فعلی و چیزهای دیگر منحصر به فرد داشته باشند. ایجاد متغیّر اینستنسی که موقعیت فعلی دشمن را نگه میدارد تکنیکی ساده برای کنترل شدن خودکار دشمنهاست. مثلاً میتوانید با این روش تنظیم کنید دشمن فرار کند، پلیر را تعقیب کند یا بیکار باشد. در این مورد ما فقط میخوایم حلزون به چپ و راست حرکت کند، و انجام این کار با این روش خوبه.
شیء SnailEnemy را انتخاب کنید. در نوار ویژگیها، روی Instance variables که به رنگ آبی هست کلیک کنید.
پنجرهای که در آن تمام متغیّرهای اینستنس لیست شده ظاهر میشود. روی آیکون add کلیک کنید تا یکی جدید اضافه کنید. نام آن را به action تغییر دهید، نوع را به text (متن) ، و مقدار اوّلیّه (intial value) را به right تنظیم کنید (برای حرکت به راست).
روی OK کلیک کنید و پنجرهی متغیّرهای اینستنس را ببندید. به ایونت شیت برگردید.
ما میخواهیم طبق الگوی زیر پیش بریم:
– اگر مقدار action برابر right باشد، برای اینکه حلزون به راست حرکت کند نگه داشته شدن کلید راست شبیهسازی شود.
– اگر مقدار action برابر left باشد، برای اینکه حلزون به چپ حرکت کند نگه داشتن کلید چپ شبیهسازی شود.
درضمن:
– وقتی حلزون به نشانگذارهای پرتگاه برخورد کرد، مقدار action قرینه شود (اگر left بود right شود و برعکس)
ما با این دو ایونت میتوانیم حرکت حلزون را راه اندازی کنیم.
Event: SnailEnemy -> Compare instance variable -> action equal to “right”
(برای اینکه نشان دهید متن است باید از دابل کوتیشن (” “) استفاده کنید)
Action: SnailEnemy -> Simulate control -> Right
باید درست همین کار را برای چپ هم انجام دهید. درضمن ما میخواهیم روی حلزون به سمت چپ و راست تغییر کند مثل پلیر. بنابراین در ایونت مربوط به چپ SnailEnemy -> Set mirrored را اضافه کنید، و SnailEnemy -> Set not mirrored را در ایونت مربوط به راست اضافه کنید. باید در آخر این شکلی شده باشد:
حالا برای اینکه وقتی حلزون به پرتگاه رسید جهتش قرینه شود:
Event: SnailEnemy -> On collision with another object -> EdgeMarker
Sub-event: SnailEnemy -> Compare instance variable -> action equal to “right”
Action: SnailEnemy -> Set value -> action to “left”
Sub-event: Else
Action: SnailEnemy -> Set value -> action to “right”
اینجا استفاده از Else مهم است، چون ایونتها از بالا به پایین اجرا میشوند. اگر به جای else (به معنی وگرنه) بگوییم اگر متغیّر action برابر left بود اکشنها اجرا شوند، در هر صورت برابر left است چون ایونت قبلی آن را برابر left قرار میدهد. بنابراین در هر صورت به راست حرکت میکند. با استفاده از else، ما از اجرای ایونت دوم درصورتی که اوّلی درست باشد جلوگیری میکنیم.
بازیتان را اجرا کنید. میبینید که حلزون دارد به عقب و جلو حرکت میکند. این باعث میشود که پریدن روی حلزون کمی سختتر شود! این یک سیستم هوش مصنوعی بسیار ابتدایی است، امّا تصور کنید که میتوانید دشمنانی باهوشتر که حرکتشان با ایونتهای بیشتر کنترل میشود بسازید. ممکن است حتّی به آنها اجازه دهید از پرتگاه بیفتند، یا از نشانگذارهای دیگری استفاده کنید تا با رسیدن به لبهها بپرد تا اینطور به نظر برسد که دشمن میداند باید از لبهها بپرد.
یه زمین بسازید و دو تا حلزون روش بذارید. توجّه کنید که آنها شخصاً خودشان را کنترل میکنند، چون هر یک از آنها متغیّر اینستنس action مربوط به خود را دارند که وضعیتشان را مشخص میکند. امیدوارم ببینید که چه قدر متغیرهای اینستنس برای حرکت به طور مستقل مهم هستند. همهی حلزونها مجبور نیستند دقیقاً همان کاری را انجام دهند که دیگری انجام میدهد.
[1] روشن و خاموش میشه
[2] اینستنس (Instance): وقتی یک شیء رو وارد بازی میکنیم از روش چند نمونه در لیوت کپی میکنیم یا توی بازی حین بازی کردن ایجاد میکنیم مثل گلوله. به هر کدوم از نمونههای یک شیء در لیوت یک اینستنس گفته میشه.
میشه در مورد اون قسمت چشمک زدن پلیر بیشتر توضیح بدید هر چی میگردم پیداش نمیکنم!!!!!!
سلام، میتونید ویدئوی همین آموزش رو مشاهده کنید
سلام و درود
تبریک میگم بهتون، من تازه برنامه نویسی اندروید رو شروع کردم و علاقه زیادی به ساخت بازی دارم یکی از دوستانم کنستراکت ۲ رو بهم معرفی کردند. ممنون بابت آموزش های خوبتون