Menu
CoddyTech
flag Ar iconالعربيةdown icon

ما هي الإشارة؟

جزء من قسم البرمجة كائنية التوجّه في رحلة 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 عند انتهاء وقته.

challenge icon

التحدي

سهل

يُعلن صندوق البريد عن وصول بريد جديد باستخدام إشارة. يعرّف 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!")
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجّه

تدرّب بنفسك: مترجم GDScript عبر الإنترنت