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

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

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

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

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

شروع ساخت تایمر

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

ساختار پروژه

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

اولین کد

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

ارجاع دادن به نودهای زیرمجموعه نود اصلی
@onready var timer = $Timer
@onready var my_sprite = $Sprite2D

توضیح کد

به طور کامل توضیح میدم. کلیدواژه 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 ساخته میشه. 

فانکشن مخصوص timeout

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

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

جابجا کردن اسپرایت

خط آخر

و حالا قدم آخر. توی فانکشن یا تابع on timer timeout این کد رو بنویسید.

کد داخل فانکشن تایم اوت
function on_timer_timeout():
my_sprite.position.x +=128

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

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

my_sprite.position.x = my_sprite.position.x + 128 

هست که کوتاهتر شده.خوب اینم از نتیجه این قسمت از آموزش ساخت بازی:

نتیجه نهایی

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

دیدگاه‌ خود را بنویسید

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

پیمایش به بالا