با استفاده از سیگنال ها

ساخت وبلاگ

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

سیگنال ها یک مکانیسم نمایندگی است که در گودوت ساخته شده است و به یک شیء بازی اجازه می دهد تا بدون اینکه آنها به یکدیگر مراجعه کنند ، نسبت به تغییر دیگری واکنش نشان دهند. استفاده از سیگنال ها اتصال را محدود می کند و کد شما را انعطاف پذیر نگه می دارد.

به عنوان مثال ، شما ممکن است یک نوار زندگی روی صفحه نمایش داشته باشید که نشان دهنده سلامت بازیکن است. هنگامی که بازیکن آسیب می بیند یا از یک معجون درمانی استفاده می کند ، می خواهید نوار تغییر را منعکس کند. برای این کار ، در گودوت از سیگنال ها استفاده می کنید.

همانطور که در مقدمه ذکر شد ، سیگنال ها نسخه گودوت الگوی Observer هستند. شما می توانید در اینجا اطلاعات بیشتری کسب کنید: https://gameprogrammingpattes.com/observer.html

اکنون ما از یک سیگنال استفاده خواهیم کرد تا نماد Godot خود را از درس قبلی (گوش دادن به ورودی پخش کننده) با فشار دادن یک دکمه حرکت کرده و متوقف کنیم.

صحنه تنظیم صحنه

برای افزودن یک دکمه به بازی ما ، ما یک صحنه "اصلی" جدید ایجاد خواهیم کرد که شامل یک دکمه و صحنه sprite. tscn است که در درس های قبلی آن را نوشتیم.

Create a new scene by going to the menu Scene ->صحنه جدید

../../_images/signals_01_new_scene.png

در حوض صحنه ، روی دکمه صحنه 2D کلیک کنید. این یک Node2d را به عنوان ریشه ما اضافه می کند.

../../_images/signals_02_2d_scene.png

در حوضچه فایل سیستم ، پرونده sprite. tscn را که قبلاً روی Node2d ذخیره کرده اید ، کلیک کرده و بکشید تا آن را فوری کنید.

../../_images/signals_03_dragging_scene.png

ما می خواهیم گره دیگری را به عنوان خواهر و برادر Sprite اضافه کنیم. برای انجام این کار ، روی Node2d راست کلیک کرده و Add Child Node را انتخاب کنید.

../../_images/signals_04_add_child_node.png

نوع گره دکمه را جستجو کرده و آن را اضافه کنید.

گره به طور پیش فرض کوچک است. برای تغییر اندازه آن ، روی دسته پایین سمت راست دکمه در نمای مشاهده کنید.

اگر دستگیره ها را نمی بینید ، اطمینان حاصل کنید که ابزار SELECT در نوار ابزار فعال است.

../../_images/signals_07_select_tool.png

روی خود دکمه کلیک کرده و بکشید تا آن را به Sprite نزدیکتر کنید.

همچنین می توانید با ویرایش ویژگی متن آن در بازرس ، یک برچسب را روی دکمه بنویسید."حرکت حرکات" را وارد کنید.

../../_images/signals_08_toggle_motion_text.png

درخت صحنه و منظره شما باید به این شکل باشد.

../../_images/signals_09_scene_setup.png

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

اتصال سیگنال در ویرایشگر

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

می توانید سیگنال ها را در حوض گره وصل کنید. گره دکمه را انتخاب کنید و در سمت راست ویرایشگر ، روی برگه "گره" در کنار بازرس کلیک کنید.

../../_images/signals_10_node_dock.png

Dock لیستی از سیگنال های موجود در گره انتخاب شده را نشان می دهد.

../../_images/signals_11_pressed_signals.png

برای باز کردن پنجره اتصال گره ، بر روی سیگنال "فشرده" دوبار کلیک کنید.

../../_images/signals_12_node_coection.png

در آنجا می توانید سیگنال را به گره Sprite وصل کنید. گره به یک روش گیرنده نیاز دارد ، تابعی که گودوت هنگام انتشار دکمه سیگنال با آن تماس می گیرد. ویرایشگر یکی را برای شما ایجاد می کند. طبق کنوانسیون ، ما این روشهای پاسخ به تماس را "_on_nodename_signal_name" نام می بریم. در اینجا ، "_on_button_pressed" خواهد بود.

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

../../_images/signals_advanced_coection_window.png

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

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

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

../../_images/signals_14_signals_coection_info.png

بیایید خط را با کلمه کلیدی عبور با کدی که حرکت گره را تغییر می دهد جایگزین کنیم.

Sprite ما به لطف کد در عملکرد _process () حرکت می کند. Godot روشی را برای تغییر پردازش روشن و خاموش فراهم می کند: node. set_process (). روش دیگر کلاس گره ، IS_PROCESSING () ، اگر پردازش بیکار فعال باشد ، درست برمی گردد. ما می توانیم از کلمه کلیدی استفاده کنیم تا مقدار را معکوس کنیم.

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

قبل از تلاش برای بازی ، باید عملکرد _process () خود را ساده کنیم تا گره به طور خودکار جابجا شود و منتظر ورودی کاربر نباشیم. آن را با کد زیر جایگزین کنید ، که ما دو درس قبل دیدیم:

کد کامل sprite. gd شما باید مانند موارد زیر باشد.

صحنه را هم اکنون اجرا کنید و روی دکمه کلیک کنید تا SPRITE شروع و متوقف شود.

اتصال سیگنال از طریق کد

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

بیایید در اینجا از یک گره متفاوت استفاده کنیم. گودوت دارای یک گره تایمر است که برای اجرای مهارت های مهارت Cooldown ، بارگیری مجدد سلاح و موارد دیگر مفید است.

بازگشت به فضای کاری 2D. می توانید روی متن "2D" در بالای پنجره کلیک کنید یا Ctrl + F1 (Alt + 1 را در MACOS) فشار دهید.

در حوض صحنه ، روی گره Sprite راست کلیک کرده و یک گره کودک جدید اضافه کنید. تایمر را جستجو کنید و گره مربوطه را اضافه کنید. صحنه شما اکنون باید به این شکل باشد.

../../_images/signals_15_scene_tree.png

با انتخاب گره تایمر ، به بازرس بروید و ویژگی AutoStart را بررسی کنید.

../../_images/signals_18_timer_autostart.png

روی نماد اسکریپت کنار Sprite کلیک کنید تا به فضای کاری اسکریپت بپردازید.

../../_images/signals_16_click_script.png

برای اتصال گره ها از طریق کد باید دو عمل انجام دهیم:

از Sprite به تایمر مراجعه کنید.

با روش اتصال () تایمر تماس بگیرید.

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

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

برای مراجعه به یک گره نسبت به مورد فعلی ، ما از روش node. get_node () استفاده می کنیم. ما می توانیم مرجع را در یک متغیر ذخیره کنیم.

تابع get_node () به فرزندان Sprite نگاه می کند و به نام آنها گره می خورد. به عنوان مثال ، اگر گره تایمر را به "BlinkingTimer" در ویرایشگر تغییر نام دادید ، باید تماس را به get_node ("BlinkingTimer") تغییر دهید.

اکنون می توانیم تایمر را در عملکرد _Ready () به Sprite وصل کنیم.

این خط مانند SO خوانده می شود: ما سیگنال "زمان بندی" تایمر را به گره ای که اسکریپت به آن وصل شده است (خود) وصل می کنیم. هنگامی که تایمر "Timeout" را منتشر می کند ، می خواهیم عملکرد "_on_timer_timeout" را صدا کنیم ، که باید تعریف کنیم. بیایید آن را در انتهای اسکریپت ما اضافه کنیم و از آن برای تغییر دید Sprite ما استفاده کنیم.

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

اگر اکنون صحنه را اجرا کنید ، خواهید دید که Sprite با یک فواصل دوم چشمک می زند و خاموش می شود.

اسکریپت کامل

این برای نسخه ی نمایشی نماد گودوت کوچک و چشمک زن ما است! در اینجا پرونده کامل sprite. gd برای مرجع آورده شده است.

سیگنال های سفارشی

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

می توانید سیگنال های سفارشی را در یک اسکریپت تعریف کنید. به عنوان مثال بگویید که وقتی سلامت بازیکن به صفر می رسد ، می خواهید یک بازی را از روی صفحه نمایش نشان دهید. برای انجام این کار ، می توانید سیگنال به نام "درگذشت" یا "Health_Depleted" را تعریف کنید که سلامتی آنها به 0 برسد.

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

سیگنال های شما به همان روش داخلی کار می کنند: آنها در برگه Node ظاهر می شوند و می توانید مانند سایر موارد به آنها وصل شوید.

../../_images/signals_17_custom_signal.png

برای انتشار سیگنال در اسکریپت های خود ، با emit_signal () تماس بگیرید.

یک سیگنال می تواند به صورت اختیاری یک یا چند آرگومان را اعلام کند. نام استدلال را بین پرانتز مشخص کنید:

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

برای انتشار مقادیر به همراه سیگنال ، آنها را به عنوان آرگومان های اضافی به عملکرد emit_signal () اضافه کنید:

خلاصه¶

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

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

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

در بخش بعدی ، اولین بازی 2D شما ، یک بازی کامل 2D را ایجاد می کنید و هر آنچه را که تاکنون آموخته اید ، قرار می دهید.

© کپی رایت 2014-2022 ، خوان لییتسکی ، آریل مانزور و جامعه گودوت (CC-BY 3. 0). تجدید نظر 5F5A9378.

نسخه های آخرین پایدار 3. 6 3. 5 3. 4 3. 3 3. 2 3. 1 3. 0 2. 1 بارگیری در Docs Project Project Builds

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

برچسب : نویسنده : سید مهدی موسوی بازدید : <-PostHit-> تاريخ : يکشنبه 6 فروردين 1402 ساعت: 20:46