التصريح والإطلاق
جزء من قسم البرمجة كائنية التوجّه في رحلة 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. ويُعدّ الربط باسم لا يعرّفه الكائن خطأً عند تنفيذ ذلك السطر.
التحدي
سهلاكتب 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!")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت