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

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

معرفی نود تایمر (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

    ایجاد یک پروژه جدید در گودو و قدم های اول

    سلام به همه بازی سازهای با انگیزه

    توی این پروژه قصد دارم یه موضوع ابتدایی و مهم رو بهتون آموزش بدم. ایجاد یک پروژه جدید در انجین گودو و اولین کارهایی به طور معمول باید انجام داد و توصیه من اینه که به این روش عمل کنید.

    فرض کنیم گودو رو دانلود کردید و اون رو باز میکنید. اولین چیزی که جلوی شما ظاهر میشه اینه:

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

    الان میخوایم یه پروژه جدید ایجاد کنیم. روی گزینه 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 تا گزینه داریم. 

    1. node2d برای ایجاد یک صحنه دوبعدی (برای بازی دوبعدی)
    2. node3d برای ایجاد یک صحنه سه بعدی (برای بازی سه بعدی)
    3. User Interface برای رابط کاربری مثل منوها، دکمه ها و ...
    4. other نودهای دیگر که شامل بالایی ها نیستن

    بیاید و گزینه node2d رو انتخاب کنید تا یک صحنه دوبعدی داشته باشید. وقتی که node2d رو انتخاب کنید سلسله مراتب صحنه تون به این شکل میشه:

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

    حالا یک کاری که بهتره انجام بدیم اینه صحنه مون رو ذخیره کنیم. از منو scene و بعد save scene رو انتخاب کنید و یک اسم برای صحنه انتخاب کنید و صحنه رو ذخیره کنید. من اسم main رو برای صحنه خودم گذاشتم:

    دقت کنید که در قسمت پایینی در file system که فایل ها رو نشون میده، صحنه ما اضافه شده:

    صحنه ها در گودو با پسوند tscn ذخیره میشن.

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

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

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

    اگه براتون مفید بود یا نظری داشتید بهم بگید. 

  • 1 نظر
  • 2 پسند
    • danial abdl
    • 13:13 1402/07/07