ما هي الإشارة؟
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 35 من 65.
تحدث أشياء للكائنات أثناء تشغيل اللعبة: تُجمَع عملة، يُفتح باب، وتنخفض hp الخاصة بالبطل إلى 0. وتتفاعل أجزاء أخرى من البرنامج مع هذه الأحداث: ترتفع النتيجة، ويصدر صوت، وتظهر شاشة انتهاء اللعبة.
الإشارة هي رسالة يرسلها كائن عندما يحدث له شيء. يُصدر الكائن الإشارة، وتُشغَّل كل دالة متصلة بهذه الإشارة:
# coin.gd
class_name Coin
extends RefCounted
signal collected
func collect() -> void:
print("Coin picked up")
collected.emit()يُعرّف signal collected الإشارة، ويرسلها collected.emit(). لا تعرف العملة من يستمع إليها. يربط الكود الذي يهتم بالعملات إحدى دواله الخاصة بالإشارة:
# main.gd
func _ready():
var coin := Coin.new()
coin.collected.connect(_on_coin_collected)
coin.collect()
print("Done")
func _on_coin_collected() -> void:
print("Score +1")الناتج هو Coin picked up، Score +1، Done. يؤدي إصدار الإشارة إلى تشغيل الدوال المتصلة فورًا، قبل السطر الذي يلي emit(). الإشارة التي لا تتصل بها أي دوال لا تفعل شيئًا عند إصدارها.
من دون إشارة، سيتعين على collect() استدعاء كود النتيجة بنفسه، لذا ستحتاج كل عملة إلى مرجع للوحة النتائج. باستخدام إشارة، تعلن العملة عن الحدث فحسب، ويمكن لأي عدد من المستمعين، أو لا أحد منهم، الاستجابة له.
تعمل عُقد Godot نفسها بالطريقة ذاتها: تُصدر Button الإشارة pressed عند النقر عليها، ويُصدر Timer الإشارة timeout عند انتهاء وقته.
التحدي
سهليُعلن صندوق البريد عن وصول بريد جديد باستخدام إشارة. يعرّف Mailbox مسبقًا signal mail_arrived ويحتوي على عدّاد letters. اكتب deliver(kind):
- عندما تكون
kindهي"letter"، أضف1إلىlettersوأصدرmail_arrived. - أي نوع آخر (إعلان أو منشور) يُرمى: لا يتغير شيء ولا تُصدر أي إشارة.
يربط الكود المتوفر دالة تطبع You've got mail!، ثم تقرأ عدد الأسطر التالية وتسلّم كل واحد منها. يفصل السطر away تلك الدالة، ويعيد السطر home ربطها، لذا يُحتسب وصول رسالة أثناء غيابك، لكن لا يُعلن عنها. بالنسبة إلى الأسطر letter وad وaway وletter، يطبع:
Delivering: letter
You've got mail!
Delivering: ad
Delivering: letter
Letters: 2اكتب الكود في mailbox.gd. يحتوي main.gd على كود الإدخال/الإخراج المتوفر ولا يمكن تعديله.
جرّب بنفسك
extends Node
func _ready():
# شيفرة الإدخال/الإخراج المقدَّمة: اتركها كما هي
var mailbox := Mailbox.new()
mailbox.mail_arrived.connect(_on_mail_arrived)
var count := int(OS.read_string_from_stdin())
for i in count:
var line := OS.read_string_from_stdin()
if line == "away":
mailbox.mail_arrived.disconnect(_on_mail_arrived)
elif line == "home":
mailbox.mail_arrived.connect(_on_mail_arrived)
else:
print("Delivering: ", line)
mailbox.deliver(line)
print("Letters: ", mailbox.letters)
func _on_mail_arrived() -> void:
print("You've got mail!")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت