نشان

ساخت وبلاگ

هنگامی که ما صحنه ای با درخت گره می سازیم ، مشکلی نیست که یک گره والدین با استفاده از روش های get_node ، find_node یا get_child به روش های گره های کودک دسترسی پیدا کنند. در اینجا چند کد برای نشان دادن این وجود دارد:

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

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

برای حل این مشکل ، ما سیگنالهایی را منتشر می کنیم که هر گره بالادست دیگر ممکن است گوش کند. گره ای که سیگنال را منتشر می کند ، نیازی به دانستن آنچه در آن گوش می دهد نیست ، بنابراین ممکن است به دلیل پیوندهای شکسته در انزوا بدون خطا آزمایش شود. گفته می شود که کاملاً همراه است.

  • یکی از موارد جالب توجه در جایی است که یک گره ممکن است خود را با یک گره پایین دست ثبت کند ، به طوری که گره ممکن است مستقیماً توابع را روی گره ثبت شده (که ممکن است والدین آن باشد) فراخوانی کند. ما این کار را با دستگاه دولتی خود انجام می دهیم که در یک آموزش دیگر پوشانده شده است. این گره همیشه در رابطه با گره های دیگری که ثبت نام می کند استفاده می شود.

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

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

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

سناریوهای پیچیده

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

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

برای مثال فوق ، سفینه فضایی ممکن است سیگنال هایی را مشاهده کند که این سپرهای آسیب دیده است. سپس اسکریپت Handler Artain یک سیگنال به روزرسانی آسیب را به هر ناظر در جهان که به آن علاقه مند است ، منتشر می کند.

سیگنال های ساطع کننده

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

برای انجام این کار ، ما از روش emit_signal با پارامترهای اختیاری استفاده می کنیم.

در اینجا چند نمونه آورده شده است:

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

اتصال به سیگنال ها

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

امیدوارم این مسئله پس از چند نمونه واضح تر شود.

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

اتصال از یک صحنه غیرقانونی

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

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

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

با استفاده از ویرایشگر برای اتصال سیگنال ها

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

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

اتوبوس رویداد جهانی

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

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

کد مثال برای اتوبوس رویداد ما (event_bus. gd):

If we add this file to Project->Project Settings->AutoLoad و نام پیش فرض Event_BUS را نگه دارید ، سپس هر گره ممکن است به عنوان مثال زیر به یک سیگنال متصل شود یا از آن خارج شود:

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

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

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

مشکلات اتوبوس رویداد جهانی

Godot emits waings of unused signals for all the signals published by the Event Bus because there is no code in the same script file for emitting the signals. These waings may be suppressed by adding code as in the example given before each signal declaration or in the Project Settings->Gdscript->منطقه هشدارها و بررسی جعبه اسکریپت بلااستفاده.

راه دیگر اضافه کردن توابع Emitter سیگنال به پرونده اسکریپت Bus Event و تماس با این اسکریپت ها از اسکریپت های ما است که در غیر این صورت به سیگنال ها وصل می شوند.

برای پروژه های متوسط/بزرگ ، اشکال زدایی سیگنال های ما دشوار می شود زیرا ممکن است تعداد زیادی گره در سطح جهان به اتوبوس رویداد وصل شوند و ردیابی کدام گره باعث انتشار سیگنال بدون عبور داده های مرجع می شود.

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

الگوی ناظر

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

معامله ارز ماتیک...
ما را در سایت معامله ارز ماتیک دنبال می کنید

برچسب : نویسنده : لیلا حاتمی بازدید : <-PostHit-> تاريخ : سه شنبه 1 فروردين 1402 ساعت: 23:50