קובעי מאפיינים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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): היא שגיאה. סוג הטיפוס של המאפיין עצמו כבר מציין מה הוא מכיל.
אתגר
קלהוסף למאפיין 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)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין