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

مُعيِّنات الخصائص

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

يمكن لخاصية أن تُشغّل تعليمات برمجية في كل مرة تُسنَد إليها قيمة. ضع نقطتين بعد التصريح وأضف كتلة set(value): ذات مسافة بادئة، وهي المُعيِّن الخاص بها:

# player.gd
var health: int = 100:
	set(value):
		health = clampi(value, 0, 100)

القيمة value هي ما يجري إسناده. داخل المعيّن، يؤدي إسناد health إلى تخزين القيمة في الخاصية؛ ولا يؤدي إلى تشغيل المعيّن مرة أخرى. يُبقي هذا المعيّن health بين 0 و100، مهما كانت القيمة التي يسندها باقي البرنامج:

var p := Player.new()
p.health -= 30
print(p.health) # 70
p.health = 250
print(p.health) # 100
p.health -= 500
print(p.health) # 0

يُنفَّذ المُعيِّن عند كل إسناد، حتى داخل الصنف أيضًا: يمرّ كلٌّ من health -= 10 في إحدى دوال Player وhealth = start_health في _init() عبره. القيمة الابتدائية الوحيدة التي تُخزَّن دون استدعائه هي القيمة التي تأتي بعد = في التصريح.

يمكن للدالة المُعيِّنة أيضًا رفض قيمة. إذا لم تُسنِد قيمة إلى الخاصية، فستبقى القيمة القديمة:

var level: int = 1:
	set(value):
		if value > level:
			level = value

احذف نوع value: set(value: int): خطأ. نوع الخاصية نفسه يحدد ما تخزّنه.

challenge icon

التحدي

سهل

أضف إلى الخاصية health في الصنف Player ضمن player.gd أداة ضبط بحيث:

  • تحافظ على قيمة الصحة المخزنة بين 0 وmax_health: تُخزَّن القيمة الأكبر على أنها max_health، والقيمة السالبة على أنها 0
  • تطبع Player is down! عندما تكون الصحة الجديدة 0 وكانت الصحة القديمة أكبر من 0

يقرأ الكود المزوَّد عدد الأوامر التالية، ثم يقرأ أمرًا واحدًا في كل سطر: damage N (player.health -= N) أو heal N (player.health += N) أو set N (player.health = N). بعد كل أمر، يطبع قيمة الصحة. عند تنفيذ damage 30 وheal 50 وdamage 120 وheal 10، يطبع:

Health: 70
Health: 100
Player is down!
Health: 0
Health: 10

اكتب كودك في player.gd. يحتوي main.gd على كود الإدخال/الإخراج المزوَّد، ولا يمكن تعديله.

جرّب بنفسك

extends Node

func _ready():
	# شيفرة الإدخال/الإخراج المقدَّمة: اتركها كما هي
	var player := Player.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var amount := int(parts[1])
		if parts[0] == "damage":
			player.health -= amount
		elif parts[0] == "heal":
			player.health += amount
		elif parts[0] == "set":
			player.health = amount
		print("Health: %d" % player.health)
quiz iconاختبر نفسك

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

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

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