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

العُقد كمكوّنات

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

challenge icon

التحدي

سهل

ابنِ روبوتًا من عُقد المكوّنات.

  • يمتد 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())
quiz iconاختبر نفسك

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

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

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