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

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

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

اگه بخواید توی بازیتون چیزی قابل کلیک کردن و لمس کردن باشه، ولی الزاما ظاهر دکمه نداشته باشه، از چه روشی استفاده میکنید؟ توی گودو دکمه های مختلفی هست. 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

    آشنایی با سیگنال‌ها در انجین گودو

    مفاهیمی که در این مطلب پوشش داده میشن:

    • معرفی نود button
    • نحوه ایجاد و اتصال یک اسکریپت به یک نود
    • نحوه ایجاد یه سیگنال و اتصال به یک نود دیگر

    سیگنال‌ها در انجین گودو مفهوم و ابزار مهمی هستن. حتی انجین‌های دیگه بازی سازی و حتی نرم‌افزارهای دیگه برنامه نویسی هم به نوعی از سیگنال‌ها استفاده میکنن. فقط اسم‌های متفاوتی دارن.سیگنال‌ها اونقدر در ساخت بازی مهم هستند که تقریبا میشه مطمئن بود هیچ بازی ای ساخته نمیشه مگه اینکه در اون از سیگنال‌ها استفاده بشه. حالا این سیگنال چی هست؟! من سعی میکنم در این مطلب مفهوم اون رو جا بندازم و با یه مثال ساده روش استفاده از اون رو بهتون نشون بدم.

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

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

    حالا شروع کنیم. یه پروژه گودو ایجاد کنید. قبلا یاد گرفتید. و یه نود دوبعدی و یه صحنه دوبعدی ایجاد کنید. روی node2D کلیک راست و گزینه add child node رو انتخاب کنید. از میون نودها Button رو انتخاب کنید. button یه دکمه سادست که معمولا یه متن روش داره.

    بیاید نگاهی به سیگنال‌های button بندازیم. در سمت راست برنامه گودو یه تب به اسم node هست و زیر مجموعه اون یه تب دیگه به اسم signals. (یه تب دیگه به اسم group هم هست که بعدا توضیح میدم). از سمت چپ تصویر توی تب scene، button رو انتخاب کنید و بعد سمت راست، از تب نود، signal رو انتخاب کنید.

    می‌بینید که دکمه یا button تعدادی سیگنال داره، وقتی دکمه پایینه، وقتی دکمه بالاست، وقتی دکمه فشرده شده، وقتی دکمه رها شده و ...

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

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

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

    دقت کنید که الان کنار node2D ما در تب scene، یه آیکون طومار یا کاغذ ظاهر شد. این یعنی نود مورد نظر دارای اسکریپت است. حالا وقتشه که سیگنال button رو به node2D وصل کنیم( یا از button به node2d یه پیام مخابره کنیم).

    همون طور که بهتون نشون دادم button  رو انتخاب کنید. به بخش سیگنالها برید. سیگنال ()pressed رو انتخاب کنید و روی اون دابل کلیک کنید. یه پنجره باز میشه که اونجا باید نود Node2D  رو انتخاب کنید و دکمه connect رو کلیک کنید.

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

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

    func _on_button_pressed():
    	pass #replace with function body.

     

    میخوام به چند چیز دقت کنید. بالای صفحه از تب 2D به script جابجا شدیم. وارد محیط اسکریپت نویسی شدیم و اسکریپت نود Node2D برامون باز شده.توی اون قسمت کد که هایلایت کردم کدی رو مینویسید که وقتی روی دکمه button کلیک میکنید میخواید اجرا بشه. 

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

    سیگنال‌ها اهمیت زیادی دارن. سعی کنید خوب یادش بگیرید. 

     

     

     

     

  • 2 نظر
  • 1 پسند
    • danial abdl
    • 18:17 1402/07/11