العُقد كمكوّنات
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 42 من 65.
يمكن أن تحتوي Node على عقد فرعية. تنشئ Godot كائنات الألعاب بهذه الطريقة: تحصل عقدة البطل على عقدة فرعية لكل قدرة، مثل الصحة أو الحركة. كل عقدة فرعية هي مكوّن: عقدة صغيرة تؤدي مهمة واحدة.
# health.gd
class_name Health
extends Node
var hp := 10
func _ready() -> void:
print("Health ready")
# hero.gd
class_name Hero
extends Node
func _init() -> void:
var health := Health.new()
health.name = "Health"
add_child(health)
func _ready() -> void:
print("Hero ready, hp: ", $Health.hp)تُرفق add_child() عقدةً بوصفها عقدةً فرعية. امنح كل مكوّن name: يبحث get_node("Health")، أو صيغته المختصرة $Health، عن العقدة الفرعية بهذا الاسم. العقدة التي ليس لها اسم، أو التي يكون اسمها محجوزًا لعقدة شقيقة، تحصل على اسم تلقائي مثل @Node@4.
تُنفَّذ الدالة _ready() للعقدة عندما تدخل شجرة المشهد، وهي شجرة العقد التي تعمل عليها اللعبة. الملف main.gd موجود في الشجرة، لذا فإن إضافة البطل إليه تبدأ تشغيل طريقتَي _ready()، بدءًا بطريقة الابن:
# main.gd
var hero := Hero.new()
add_child(hero) # Health جاهز، ثم Hero جاهز، hp: 10
print(hero.get_child_count()) # 1يصل العنصر الأب إلى مكوّناته باستخدام get_children() (مصفوفة الأبناء، حسب ترتيب إضافتهم)، وget_child_count() وhas_node("Health"). تُحرَّر العُقد في الشجرة مع الشجرة عند انتهاء اللعبة، لذا لا يحتاج المكوّن الذي أُضيف باستخدام add_child() إلى تنظيف.
التحدي
سهلابنِ روبوتًا من عُقد المكوّنات.
- يمتد
PartمنNode. يستقبل مُنشئه اسم جزء وقيمة طاقة: يخزّن قيمة الطاقة ويضبطnameللعقدة على اسم الجزء. عندما يدخل جزء إلى شجرة المشهد، تطبع_ready()القيمةLaser attached. - يمتد
RobotمنNode. تضيفadd_part(part_name, power)كائنًا جديدًا منPartبصفته ابنًا. إذا كان للروبوت ابن بهذا الاسم بالفعل، فإنه يطبعLaser is already attachedولا ينشئ شيئًا. - تعيد
total_power()مجموع طاقة جميع أجزائه.
يضيف الكود المزوّد الروبوت إلى شجرة المشهد، ويقرأ عدد الأوامر التالية (add Laser 5، power)، ويطبع عدد الأجزاء في النهاية. بالنسبة إلى add Laser 5، add Wheels 2، power، add Laser 9، add Arm 3، power، فإنه يطبع:
Laser attached
Wheels attached
Total power: 7
Laser is already attached
Arm attached
Total power: 10
Parts: 3ضع كودك في part.gd وrobot.gd. يحتوي main.gd على كود الإدخال/الإخراج المزوّد، ولا يمكن تعديله.
جرّب بنفسك
extends Node
func _ready():
# كود الإدخال/الإخراج المقدَّم: اتركه كما هو
var robot := Robot.new()
add_child(robot)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "add":
robot.add_part(parts[1], int(parts[2]))
else:
print("Total power: ", robot.total_power())
print("Parts: ", robot.get_child_count())
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت