Menu
CoddyTech

קובעי מאפיינים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 11 מתוך 65.

מאפיין יכול להריץ קוד בכל פעם שמקצים לו ערך. הוסף נקודתיים אחרי ההצהרה והוסף בלוק set(value): מוזח, הsetter שלו:

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

value הוא הערך שמוקצה. בתוך ה-setter, ההקצאה של health שומרת את הערך במאפיין; היא לא מפעילה את ה-setter שוב. ה-setter הזה שומר על 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

ה-setter מופעל בכל השמה, גם בתוך המחלקה: health -= 10 במתודה של Player וגם health = start_health בתוך _init() עוברים דרכו. רק ערך ההתחלה שאחרי = בהצהרה נשמר בלי לקרוא לו.

גם setter יכול לדחות ערך. אם הוא לא משייך ערך למאפיין, הערך הישן נשאר:

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

השמטו את סוג הטיפוס של value: set(value: int): היא שגיאה. סוג הטיפוס של המאפיין עצמו כבר מציין מה הוא מכיל.

challenge icon

אתגר

קל

הוסף למאפיין health של המחלקה Player בקובץ player.gd setter ש:

  • ישמור את ערך הבריאות בין 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 אונליין