گودو گیم دو، بلاگ بازی سازی با انجین گودو Godot

گودو گیم دو، بلاگ آموزشی و اطلاع رسانی انجین بازی سازی گودو (Godot) است. در این بلاگ مطالب زیادی درباره انجین گودو و بازی سازی یاد میگیرید.

متغیرهای سراسری و اتولود (autoload) در انجین بازی گودو

در هر بازی متغیرها و داده‌هایی وجود داره که میخواید در تمام صحنه‌های بازی بهشون دسترسی داشته باشید. برای این منظور باید از اسکریپت‌هایی استفاده کنید که از همه اسکریپت‌ها و صحنه‌ها قابل دسترسی هستن. به این قابلیت در گودو میگن اتولود (autoload). کاری که باید کنید اینه که یه اسکریپت ایجاد کنید و اون رو اتولود کنید و در اسکریپت‌های دیگه بهش ارجاع میدید. اما چجوری؟

در یه مثال ساده این رو بهتون نشون میدم. 

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

 

میخوایم اسکریپت اتولود رو بسازیم. در بخش filesystem روی res کلیک راست  و بعد گزینه create new و بعد script رو انتخاب کنید.اسمشو بذارید General یعنی عمومی یا سراسری. 

حالا اسکریپت جنرال رو میخوایم اتولود کنیم. از مسیرsetting و بعد project setting، تب autoload رو انتخاب میکنیم. برای اضافه کردن اسکریپت به اتولود روی آیکون فولدر کلیک میکنیم، اسکریپت General رو انتخاب میکنیم و open  رو کلیک میکنیم. در نهایت سمت راست صفحه دکمه Add رو میزنیم تا اسکریپت به لیست اضافه بشه. 

برای نشون داده استفاده از اتولود، به نود سرشاخه یه اسکریپت اضافه کنید. دقت کنید که حالا در کل پروژه 2 تا اسکریپت داریم. 

توی این قسمت میخوایم داخل اسکریپ General یه متغیر ساده اضافه کنیم تا بتونیم توی اسکریپت main ازش استفاده کنیم و متن اون رو توی لیبل نشون بدیم. اینجا میخوام نحوه تایپ و کدنوشتن هم بهتون نشون بدم. گاهی اوقات وقتی بخشی از کلمه رو تایپ میکنید، برنامه به شما کلمه رو پیشنهاد میده و با کلید Enter میتونید انتخابش کنید. یه متغیر به نام text میسازم و مقدارشو (متنشو) میذارم "General text". متنها همیشه در کدنویسی گودو بین دوتا علامت " قرار میگیرن.  

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

کاری که توی این کد انجام میشه اینه که در فانکشن یا تابع ready ، به لیبل ارجاع میدم و متنشو برابر با متن متغیر text  از اسکریپت general  میکنم.( تابع ready یکی از تابع های پیش ساخته گودوئه و هر اسکریپتی در شروع صحنه، تابع ready رو اجرا میکنه. )

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

در نهایت وقتی صحنه رو اجرا کنیم، داخل لیبل متن General text نشون داده میشه. 

فایده اتولود اینه که شما رو از دوباره‌کاری بی نیاز میکنه. فرض کنید 10 تا صحنه داشتید که میخواستید اون متن رو توی همشون نشون بدید. باید در هر 10 تا صحنه متغیری میساختید. ولی با این روش یک بار نوشتید و میتونید 10 بار یا بیشتر استفاده کنید. 

درآخر کدها رو میذارم تا داشته باشید.

...

  • 0 نظر
  • 0 پسند
    • danial abdl
    • 20:28 1402/07/23

    تبدیل هر نودی به قابل کلیک و لمس در گودو با یک ترفند ساده

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

    مطالبی که توی این آموزش پوشش داده میشه:

    1. معرفی نود Label
    2. استفاده از سیگنال‌ها
    3. معرفی ویژگی modulate برای تغییر رنگ و شفافیت

    کاری که انجام میدیم به طور خلاصه اینه: یک لیبل میسازیم و زیر مجموعه‌اش یه Button اضافه میکنیم. شفافیت button رو صفر میکنیم تا نامرئی بشه. بعد سیگنال pressed دکمه رو به لیبل متصل میکنیم و در فانکشن کلیک روی دکمه، متن رو ناپدید میکنیم. 

    مثل همیشه با یه صحنه جدید شروع میکنیم. ولی این بار به جای 2D scene، این بار Other node رو انتخاب میکنیم. این بار میخوایم به جای یک صحنه کامل، یه کامپوننت یا آبجکتی بسازیم که داخل هر صحنه ای قابل استفاده است. روند کار فرقی نمیکنه. 

    برای ایجاد صحنه جدید یا از منوی scene، گزینه new scene رو انتخاب کنید یا از بخش file system، کلیک راست کنید و create new و بعد scene رو انتخاب کنید. وقتی میخواید نود سرشاخه رو انتخاب کنید، روی other node کلیک کنید:

    از صفحه باز شده، Label رو پیدا کنید و انتخاب کنید. حالا نود سرشاخه یه Label ئه. این نود برای نمایش متن به کار میره. فرض کنید میخواید به کاربر پیامی نشون بدید که به راحتی هم ناپدید بشه. 

    حالا نود label رو انتخاب کنید و از تب inspector در سمت راست، در قسمت Text، به فارسی بنویسید: "کلیک کن تا ناپدید بشم".

     از بهترین قابلیت‌های گودو پشتیبانی فوق‌العاده خوب از زبان فارسیه.  

     و بعد پایین تر برید و از Theme override و بعد font size فونت در به 30 تغییر بدید تا متن بزرگتر بشه.

    با کلیک روی نود label، گزینه add child رو کلیک میکنیم و یه Button زیر مجموعه لیبل اضافه میکنیم. توی صحنه اندازه button رو با اندازه لیبل برابر میکنیم.

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

    حالا به نود label یه اسکریپت اضافه میکنیم و سیگنال pressed از دکمه رو به label متصل میکنیم. اینها رو توی آموزش‌های قبلی توضیح دادم و توی تصویر هم مشاهده میکنید.

    اینجای کار به یه خط کد نیاز داریم. کدی که میگه با کلیک روی دکمه، لیبل ناپدید بشه. برای این کار از visible استفاده میکنیم. visible که قابل دیدن بودن یه نود رو مشخص میکنه، یه متغیر از نوع boolean هست که دو حالت true و false داره. صحیح و غلط. این نوع متغیر حالت صفر و یک داره. بودن و نبودن و بسیار بسیار کابردی هستن. اینجا ما visible رو false میکنیم تا لیبل دیگه قابل مشاهده نباشه. 

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

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

  • 0 نظر
  • 2 پسند
    • danial abdl
    • 12:48 1402/07/21

    معرفی نود تایمر (timer) با یک مثال ساده ( و فقط سه خط کد)

    سلام. امروز با یه درس مهم و باحال اومدم. میخوام نود تایمر (timer) رو بهتون معرفی کنم و یه مثال ساده هم بهتون نشون بدم تا مطلب براتون جا بیفته. تایمر یه ابزار خیلی مهمه و توی همه انجین‌های بازی سازی به نوعی وجود داره. حالا ممکنه اسمش چیز دیگه ای باشه. 

    چیزی که تا آخر این درس انجام میدیم اینه که در صحنه ما، یک اسپرایت وجود داره که هر  1 ثانیه، موقعیت مکانیش در محور افقی (x) به اندازه 128 واحد اضافه میشه و تغییر میکنه(به سمت مثبت محور x). به این شکل:

     به اندازه کافی انگیزه گرفتید که شروع کنیم؟!

    سعی کردم که این مطلب بر پایه چیزهایی باشه که قبلا بهتون گفتم تا زیاد سردرگم نشید و راحت متوجه بشید. این درس یه مقدار خیلی کمی کدنویسی داره.( من این جا برای این که تمام زیر و بم کدنویسی با gd script رو بهتون بگم محدودیت دارم. ولی تلاش میکنم هر کدی که استفاده میکنم رو خوب توضیح بدم). لازمه بگم که من دارم از گودو ورژن 4.1 استفاده میکنم.

    شروع میکنیم. یه پروژه جدید ایجاد کنید. یه نود دوبعدی به عنوان سرشاخه ایجاد کنید و با کلیک راست و گزینه add child node دوتا نود ایجاد کنید. اولین نود، timer ئه و دومی sprite2D. فعلا فقط نودها رو اضافه کنید. و در ادامه به نود node2D همونجور که یاد گرفتید(با دکمه ای که بالای صفحه علامت مثبت سبز داره) یک اسکریپت اضافه کنید. وقتی اسکریپت اضافه میکنید، کنار نود node2D یه علامت کاغذ اضافه میشه. کلیت پروژه این شکلی میشه:

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

    اینجا دو خط کد به اسکریپت اضافه می‌کنیم.لازمه توضیح بدم که وقتی که ما نودهایی رو به زیرمجموعه نودی اضافه میکنیم، میتونیم در اسکریپت اون نود سرشاخه (والد)، به نودهای زیرمجموعه یا فرزند ارجاع بدیم، برای این که بتونیم بهشون دسترسی داشته باشیم، دستکاری کنیم و ازشون استفاده کنیم. توی این دو خط کد، من به دوتا نود فرزند، یعنی تایمر و اسپرایت ارجاع دادم و از هر کدومشون یه متغیر ساختم. ببینید، بعد همه چیزو توضیح میدم.

    به طور کامل توضیح میدم. کلیدواژه var وقتی استفاده میشه که میخوایم یه متغیر جدید تعریف کنیم. حالا میخواد یه متغیر عددی باشه یا متنی یا یه نود باشه. درست بعد از var یه اسم دل به خواهی میاد. من گذاشتم timer و my_sprite. بعد علامت مساوی میاد که اون ور مساوی میخوایم بگیم متغیرهای ما چی هستن. دقت کنید که علامت $ اومده و بعدش اسم نودهای ما. علامت $ وقتی میاد که میخوایم به زیرمجموعه های یه نود دسترسی پیدا کنیم. معمولا وقتی علامت $ رو بزنید و حرف اول نود رو وارد کنید (مثلا t)، اسم نودها به صورت پیشنهادی برای شما ظاهر میشه و میتونید انتخاب کنید. یه کلمه و علامت دیگه که استفاده شده onready@ ئه. این کلمه هم برای ارجاع دادن به نودها معمولا استفاده میشه و داره میگه وقتی که صحنه اجرا شد، منتظر بمون تا نود موردنظر لود بشه(و اگه بلافاصله لود نشده بود، به من پیغام خطا نده).

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

    قدم بعدی اینه که تایمر رو تنظیم کنیم که در شروع صحنه به طور خودکار استارت بشه. اساسا تایمر، یه نوده  که یه زمان شمارش معکوس داره و وقتی اون زمان به آخر میرسه یعنی timeout اتفاق میفته، سیگنال timeout ارسال میشه و شما میتونید کاری که میخواید رو انجام بدید و تایمر کاربردهای مختلف و زیادی داره. تایمر سه تا گزینه اولیه مهم داره، زمان (wait time) که به طور پیش فرض روی 1 ثانیه است. گزینه one shot ، یعنی فقط یک بار اجرا بشه و تمام. اگر one shot رو انتخاب نکنید، تایمر تا ابد تکرار میشه، یعنی وقتی به آخر رسید دوباره شروع میشه. گزینه auto start که یعنی خودبخود شروع بشه و لازم نباشه بهش دستور شروع بدی. چیزی که ما ین جا لازم داریم auto start ئه. 

    پس تایمر رو انتخاب کنید و در قسمت inspector، گزینه auto start رو تیک بزنید. 

    اگه قسمت قبل رو دیده باشید، این بخش باید براتون تکراری باشه. میخوایم سیگنال timeout تایمر رو به نود node2D وصل کنیم. انتخاب نود تایمر، رفتن به قسمت node، و بعد signals و  بعد دابل کلیک روی timeout  و در نهایت انتخاب نود node2D از پنجره باز شده و کلیک روی connect. 

    خواهید دید که فانکشن on timer timeout در اسکرپت node2D ساخته میشه. 

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

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

     و حالا قدم آخر. توی فانکشن یا تابع on timer timeout این کد رو بنویسید. (متاسفانه به دلیل این که وقتی کد رو مستقیم توی این وبلاگ مینویسم چینشش به هم میخوره، ناچار شدم عکس کدها رو بذارم).

    این خط ساده داره میگه به مکان x اسپرایت، 128 واحد اضافه کن. این کد هر ثانیه یک بار اجرا میشه و هر بار 128 تا به x اضافه میشه.

    توی gd script با استفاده از نقطه به ویژگیها و اجزاء یه متغیر دسترسی پیدا میکنیم. این جا  x از position اسپرایت رو گرفتیم و با علامت += گفتیم که مقدار 128 به هر مقداری که الان هست اضافه بشه. این کد معادل my_sprite.position.x = my_sprite.position.x + 128 ئه که کوتاهتر شده.خوب اینم از این

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

     

  • 0 نظر
  • 1 پسند
    • danial abdl
    • 13:34 1402/07/16