امروز میخوام چند اصطلاح رایج که توی بازی سازی به کار میره براتون به طور کاربردی توضیح بدم. توی همین بلاگ در آینده از این اصطلاح ها بیشتر استفاده میشه.
UI یا رابط کاربری: اجزا و لایه ای از بازی که انسان از طریق اون با بازی شما ارتباط برقرار میکنه. دکمه ها، متن هایی که اطلاعاتی رو از طریق اونها به کاربر نشون میدید، چک باکس ها، نوارهای پیشرفت و... شامل رابط کاربری میشن. توی انجین گودو، معمولا نودهای رابط کاربری به رنگ سبز هستند و زیر مجموعه نود control قرار دارن.
گیم دیزاین (Game design): قبل از این که هیچ کدی نوشته باشه، هیچ آرتی برای بازی ساخته بشه و هیچ بازی قابل بازی ای وجود داشته باشه، بازی از روی یک ایده اولیه طراحی میشه، یعنی درباره همه چیز بازی فکر میشه، از سبک آرت، تا سبک خود بازی، مراحل، داستان، رابط کاربری، مدت زمان بازی و هر جزئیاتی که برای ساخت بازی لازمه. تا این حد بگم که تصمیم گیری در این باره که وقتی بازیکن دکمه حرکت رو فشار میده، موقعی که دستشو روی دکمه میذاره بهتره حرکت شروع بشه یا موقعی که دستشو از روی دکمه برمیداره؟ کدوم برای بازی شما مناسبتره؟ معمولا این جزئیات نوشته میشه و بهتر هم هست که نوشته بشه. ولی ممکنه توی ذهن شما باشه. لازمه اینو بگم که فرایند طراحی بازی یه فرایند چرخه ماننده و این طور نیست که از نقطه صفر شروع کنید و به نقطه صد برسید. خیلی وقتها لازمه برگردی و چیزی که قبلا طراحی کنی تغییر بدی و بعضی چیزها در حین کار مشخص میشه.
اسکریپت و اسکریپت نویسی: همون بخش برنامه نویسی بازی سازیه. توی انجین گودو، به یه قطعه کد میگن اسکریپت که با پسوند "gd." ذخیره میشه و اسکریپت، معمولا به یه نود متصل میشه و یه مجموعه از کارها رو انجام میده. به طور معمول اسکریپت ها توی گودو یا به زبان gd script هستند یا سی شارپ (#c).
نود (Node) : قبلا توضیح دادم، نود مفهوم مهمی توی انجین گودوست. هر آبجکت یا قطعه یا موجودیتی توی بازی شما از اجزائی ساخته شده. مثلا اگه کاراکتری دارید که راه میره، تصویر کاراکتر یا اسپرایت یه جزءاونه، بخشی که انیمیشن کاراکترو کنترل میکنه، یه جزئه، بخش شناسایی برخورد با زمین و چیزهای دیگه یه جزئه، به هر کدوم از اینها میگن یک نود.
اصطلاحات خیلی بیشتری وجود داره ولی این چندتا برای شروع و توی مطالب آینده لازم بود.
توی این پروژه قصد دارم یه موضوع ابتدایی و مهم رو بهتون آموزش بدم. ایجاد یک پروژه جدید در انجین گودو و اولین کارهایی به طور معمول باید انجام داد و توصیه من اینه که به این روش عمل کنید.
فرض کنیم گودو رو دانلود کردید و اون رو باز میکنید. اولین چیزی که جلوی شما ظاهر میشه اینه:
این جا میتونید پروژه های خودتون رو مدیریت کنید و پروژه جدید ایجاد و چند کار دیگه هم میتونید انجام بدید که در درسهای آینده بهشون میپردازیم.
الان میخوایم یه پروژه جدید ایجاد کنیم. روی گزینه new project کلیک کنید. حالا پنجره ای به این شکل ظاهر میشه:
به قسمت های های هایلایت شده دقت کنید. میتونید خیلی ساده دکمه create folder رو بزنید و بعد پایین صفحه دکمه create & edit رو بزنید و پروژه رو بسازید. اما من پیشنهاد میکنم کار بهتری کنید.
توصیه من به شما اینه که حتما توی کامپیوتر خودتون یک فولدر داشته باشید به اسم "پروژه های گودو" یا "Godot projects" یا هر اسمی مشابه این ها. هدف اینه که همه پروژه هاتون یک جا جمع بشن و سردرگم نشید. نظم یک عنصر خیلی مهم توی کار بازی سازیه.
رو گزینه browse کلیک کنید.
درایو مورد نظر رو انتخاب کنید. و در مکانی که مناسب میدونید، فولدر برای مثال Godot projects رو باز کنید. داخل اون فولدر یک فولدر دیگه به نام my project ایجاد کنید و در نهایت گزینه select current folder به معنای انتخاب فولدر فعلی رو انتخاب کنید.
گودو شما به پنجره قبلی برمیگردونه. سمت چپ سه گزینه دارید:
+forward
mobile
compatibility
زیاد شما درگیر تفاوت این سه گزینه نمیکنم. اگه برای کامپیوتر بازی میسازید گزینه اول رو انتخاب کنید. اگه برای موبایل گزینه دوم و اگه با دو گزینه اول مشکل داشتید مثلا با خطا مواجه شدید یا سیستمی که باهاش کار میکنید قدیمیه گزینه سوم یعنی compatibility رو انتخاب کنید. اگر هم تردید دارید گزینه اول رو انتخاب کنید. الان خیلی این موضوع مهم نیست.
خوب، پروژه ایجاد شد. ظاهر برنامه و پروژه در نگاه اول این شکلیه. به قسمت های هایلایت شده دقت کنید:
قسمت سمت چپ بالا درخت صحنه یا Scene tree رو به شما نشون میده که فعلا خالیه. سمت چپ پایین هم فایل های پروژه شما رو نشون میده. در حال حاضر فقط یه آیکون یا عکس انجین گودو توش هست.
در این بخش یک توضیح ضروریه. یک پروژه و بازی گودو از صحنه های مختلف تشکیل شده. مثلا صفحه منوی شما یک صحنه یا scene هست. صفحه مراحل یک scene (با تلفظ سین) هست. و هر صحنه از یک سلسله مراتب نود (Node) تشکیل شده. نود رو فعلا اجزاء سازنده در نظر بگیرید. هر صحنه حداقل یک نود به عنوان سرشاخه یا نود اصلی داره. فعلا در همین حد یاد بگیرید. بعدا که بیشتر کار کردید بیشتر متوجه میشید.
نتیجه این حرف ها اینه که الان ما برای این صحنه که جلومون باز شده به یک نود سرشاخه نیاز داریم. 4 تا گزینه داریم.
node2d برای ایجاد یک صحنه دوبعدی (برای بازی دوبعدی)
node3d برای ایجاد یک صحنه سه بعدی (برای بازی سه بعدی)
User Interface برای رابط کاربری مثل منوها، دکمه ها و ...
other نودهای دیگر که شامل بالایی ها نیستن
بیاید و گزینه node2d رو انتخاب کنید تا یک صحنه دوبعدی داشته باشید. وقتی که node2d رو انتخاب کنید سلسله مراتب صحنه تون به این شکل میشه:
الان در صحنه شما فقط یک نود دوبعدی خالی هست. نود دوبعدی یا node2d معمولا کاربردش همینه که به عنوان سرشاخه باشه و زیر مجموعه هاش ماهیت صحنه رو تعریف کنن.
حالا یک کاری که بهتره انجام بدیم اینه صحنه مون رو ذخیره کنیم. از منو scene و بعد save scene رو انتخاب کنید و یک اسم برای صحنه انتخاب کنید و صحنه رو ذخیره کنید. من اسم main رو برای صحنه خودم گذاشتم:
دقت کنید که در قسمت پایینی در file system که فایل ها رو نشون میده، صحنه ما اضافه شده:
صحنه ها در گودو با پسوند tscn ذخیره میشن.
یک قدم دیگه مونده. پروژه گودو همیشه یه صحنه به عنوان صحنه شروع کننده داره که باید اونو مشخص کنید. الان بالا صفحه سمت راست روی دکمه پلی کلیک کنید. برنامه از شما میخواید که صحنه اول رو انتخاب کنید. شما گزینه select current یعنی انتخاب صحنه فعلی رو انتخاب کنید.
خواهید دید که بعد از چند ثانیه بازیتون اجرا میشه. یک صحنه خاکستری خالی. چقدر هیجان انگیز! بعدا قراره بهترین بازی ها توی این صحنه ساخته بشن.
به این روش پروژه شما ساخته میشه و قدم های اولیه برداشته میشه. سعی کنید به پیشرفت پروژه به طور مرتب پروژه و صحنه های خودتون رو ذخیره کنید تا چیزی از دست نره.
توی این پست روش ساده استفاده از نود animation player رو برای ساخت انیمیشن برای اسپرایت ها و اجزاء صحنه بهتون نشون میدم. انیمیشنی که میخوام بسازم، چیزیه که خیلی جاها میشه ازش استفاده کرد. فرض کنید توی بازی یه کلید دارید که کاراکتر میتونه اونو بگیره. ما برای این کلید یه انیمیشن میسازیم که با یه حرکت روون و نرم بالا و پایین بشه و توجه رو جلب کنه.
از این جا شروع میکنیم که یه پروژه خالی ایجاد کردیم. روی نود سرشاخه یا اصلی صحنه کلیک راست میکنیم و add child node رو انتخاب میکنیم.
یک پنجره باز میشه که به شما اجازه میده نود مورد نظر خودتون رو انتخاب کنید. ما الان به یک اسپرایت نیاز داریم که همون طور که قبلا گفتم یک عکس ساده دوبعدیه. من از قبل یک فایل png که تصویر یک کلید هست رو به پروژه اضافه کردم. شما میتونید از همون عکس لوگوی گودو که از قبل توی پروژه وجود داره استفاده کنید.
در نوار بالایی پنجره ای که باز شده شروع به تایپ sprite کنید. میبینید که نود اسپرایت رو بهتون نشون میده. اون رو انتخاب کنید.
الان اسپرایت ما هنوز خالیه. یعنی تصویری نداره. پس بیاید از بخش file system، تصویر خودتون رو با موس بکشید روی نود اسپرایت:
این جا تصویر کلید رو به اسپرایت دادیم. حالا به همین روش میخوایم یک نود Animation player به زیر مجموعه اسپرایت اضافه کنیم. در اصطلاح نود انیمیشن پلیر فرزند یا child نود اسپرایت میشه. روی نود اسپرایت کلیک راست کنید و بعد add child node رو بزنید در پنجره ای که باز میشه شروع به تایپ animation player کنید تا نود رو ببینید:
حالا باید سلسله مراتب یا درخت نود شما به این شکل باشه:
وقتی که نود انیمیشن پلیر رو انتخاب کنید، پایین صفحه به تب باز میشه که این شکلیه:
ظاهر ساده ای داره ولی خیلی کارها ازش برمیاد!
هنوز هیچ انیمیشنی نداریم. میخوایم یکی اضافه کنیم. به این شکل عمل کنیدو کلیک راست روی دکمه animation و بعد new و یک اسم براش انتخاب کنید. من اسم move گذاشتم:
الان یک انیمیشن اضافه کردید و میخوام به چند چیز دقت کنید. در تصویر زیر علامتی که دوتا فلش به سمت هم چرخیدن، به معنی تکرار همیشگی یا همون loop یا چرخه است. اگه اون رو بزنید انیمیشنتون وقتی که تموم شد بلافاصله از اول شروع میشه. دکمه ای که به شکل +A است به معنی شروع خودکار یا autoplay است. اگه این روشن باشه با شروع بازی انیمیشن خودبخود اجرا میشه و نیازی به کد نویسی نداره. دکمه add track چیزیه که باهاش خیلی کار دارید. در ادامه توضیح میدم:
این جا لازمه یه ذره دقت بیشتری کنید. ما به روش های مختلف میتونیم انیمیشن ایجاد کنیم. وقتی روی Add track کلیک کنید، 6 گزینه ظاهر میشه. من نمیخوام این جا 6 تاش رو توضیح بدم. ما با اولی کار داریم که property track است. پراپرتی در واقع به ویژگی های یک نود میگن. برای مثال position یک نود، یک پراپرتیه، scale یک پراپرتیه، modulate که مربوط به رنگ و شفافیت نوده یک پراپرتیه. حالا توی این درس ما میخوایم یک انیمیشن برای پراپرتی position درست کنیم. به عبارتی میخوایم توی انیمیشن ما پوزیشن یا مکان نود تغییر کنه.
روش add track کلیک کنید. گزینه property track رو انتخاب کنید. یک پنجره باز میشه که توش باید نودی که میخوایم براش انیمیشن بسازیم رو انتخاب کنیم. اسپرایت رو انتخاب میکنیم. بعد باید پراپرتی مورد نظر رو انتخاب کنیم. ما به position نیاز داریم، پس اونو انتخاب میکنیم.
پراپرتی انتخاب شد. حالا باید عملا انیمیشن رو بسازیم. در نوار زمانی که میبینید، در نقطه هایی که میخواید پراپرتی مورد نظر تغییر کنه باید یک فریم کلیدی یا key ایجاد کنید. روی اولین نقطه نوار، یعنی شروع انیمیشن کلیک راست کنید و insert key رو انتخاب کنید:
وقتی کلید رو ساختید، به روی اون کلیک کنید و پنجره ای که در سمت راست انجین باز میشه نگاه کنید. این شکلیه:
این در واقع داره میگه در key که انتخاب کردید(لحظه 0)، x و y نود برابر با 0 است.
انیمیشن ما به این شکله که در نقطه میانی y نود 10 تا اضافه میشه ( و اسپرایت کلید، 10 واحد در محور y صفحه میاد پایین) و در پایان انیمیشن دوباره به 0 برمیگرده. حالا به روشی که یاد گرفتید دوتا کلید دیگه در وسط و آخر نوار ایجاد کنید:
کلید یا key وسطی رو انتخاب کنید و در inspector مقدار y رو به 10 تغییر بدید. یه کار دیگه هم کنید. این که نوع حرکت رو از linear به cubic تغییر بدید:
و :تقریبا تموم شده. حالا اگه روی دکمه پلی انیمیشن کلیک کنید باید همچین چیزی رو ببینید:
دقت کنید که دکمه autoplay و loop که قبلا جاشون رو بهتون گفتم روشن کرده باشید.
نکات تکمیلی
انیمیشن ما آمادست. اگر صحنه بازی رو اجرا کنید میبینید که کلید در نقطه 0 بازی در حال حرکته و حتی اگه سعی کنید که اونو به وسط صحنه بیارید وقتی که بازی رو اجرا کنید خواهید دید که بازهم در نقطه 0 است. دلیل این موضوع اینه که هم اسپرایت و هم نود انیمیشن پلیر در صحنه اصلی هستن و مکانشون مطلقه و نسبی نیست. در حالی که ما میخوایم مکان نود انیمیشن نسبت به اسپرایت، نسبی باشه.
چند تا کار مونده. اول روی اسپرایت کلیک کنید و گزینه save branch as scene رو بزنید تا اسپرایت و نود زیر مجوعه اش به صحنه جدا تبدیل بشن. یک اسم براشون انتخاب کنید.
حالا همه صحنه ها رو یک بار ذخیره کنید. بعد به صحنه اصلی برید و کلید یا اسپرایت خودتون رو به وسط صحنه اصلی بکشید تا انیمیشن رو به خوبی ببینید. در نهایت چیزی که دارید اینه: