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

التصريح والإطلاق

جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 36 من 65.

أعلِن عن إشارة باستخدام الكلمة المفتاحية signal واسم، في أعلى الصنف بجوار متغيراته. يصف اسم الإشارة حدثًا وقع بالفعل، بصيغة snake_case: died، door_opened، leveled_up. يعلن الصنف عن الإشارات التي يحتاج إليها:

# player.gd
class_name Player
extends RefCounted

signal leveled_up
signal max_level_reached

const MAX_LEVEL := 3
var level := 1
var xp := 0

func add_xp(amount: int) -> void:
	xp += amount
	while xp >= 100 and level < MAX_LEVEL:
		xp -= 100
		level += 1
		leveled_up.emit()
		if level == MAX_LEVEL:
			max_level_reached.emit()

أصدر إشارة لحظة وقوع الحدث الخاص بها، وفقط عندئذٍ. لا يُصدر add_xp(50) أي إشارة للاعب جديد. أما add_xp(250) بعد ذلك، فترفع xp إلى 300: تُصدر leveled_up مرتين، مرة لكل مستوى يتم اكتسابه، وتُصدر max_level_reached مرة واحدة، عند الارتقاء بالمستوى الذي يصل إلى المستوى 3.

يُعدّ مُعيِّن الخاصية مكانًا جيدًا لإطلاق الإشارة، لأنها عندئذٍ تُطلَق مهما كان الكود الذي يغيّر القيمة:

signal died

var hp: int = 10:
	set(value):
		var was_alive := hp > 0
		hp = maxi(value, 0)
		if was_alive and hp == 0:
			died.emit()

يمنع was_alive إصدار died مرة أخرى عندما يُصاب بطل لديه 0 من نقاط الصحة مجددًا.

يمكن أيضًا الوصول إلى الإشارة من خلال اسمها كنص: يصدرها emit_signal("died")، ويربط بها hero.connect("died", _on_hero_died)، ويُرجع hero.has_signal("died") القيمة true. ويُعدّ الربط باسم لا يعرّفه الكائن خطأً عند تنفيذ ذلك السطر.

challenge icon

التحدي

سهل

اكتب Bomb يعدّ تنازليًا ويعلن عن كل خطوة باستخدام الإشارات.

  • عرّف إشارتين: beeped وexploded.
  • تُنقص tick() قيمة fuse بمقدار 1. إذا بقيت قيمة المصهر أعلى من 0، فأصدر beeped؛ وإذا وصلت إلى 0، فأصدر exploded.
  • ما إن تصبح قيمة المصهر 0، تكون القنبلة قد انفجرت: لا تفعل النبضات اللاحقة شيئًا ولا تُصدر أي إشارة.

تقرأ الشيفرة المقدَّمة قيمة المصهر الابتدائية وعدد النبضات المطلوب تنفيذها، وتتصل بالإشارتين باستخدام اسميهما، وتطبع Beep وBOOM! من الدالتين المتصلتين، ثم تطبع قيمة المصهر المتبقية. عند قيمة مصهر 3 وتنفيذ 5 نبضات، تطبع:

Beep
Beep
BOOM!
Fuse: 0

ضع شيفرتك في bomb.gd. يحتوي main.gd على شيفرة الإدخال/الإخراج المقدَّمة، ولا يمكن تعديله.

جرّب بنفسك

extends Node

func _ready():
	# كود الإدخال/الإخراج المقدَّم: اتركه كما هو
	var bomb := Bomb.new(int(OS.read_string_from_stdin()))
	# استخدم connect() مع اسم الإشارة كنص
	bomb.connect("beeped", _on_beeped)
	bomb.connect("exploded", _on_exploded)
	var ticks := int(OS.read_string_from_stdin())
	for i in ticks:
		bomb.tick()
	print("Fuse: ", bomb.fuse)

func _on_beeped() -> void:
	print("Beep")

func _on_exploded() -> void:
	print("BOOM!")
quiz iconاختبر نفسك

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

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

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