אותות עם ארגומנטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 38 מתוך 65.
אות יכול לשאת ערכים. ציין אותם בהצהרה, כמו הפרמטרים של פונקציה:
signal damaged(amount: int, hp_left: int)
signal diedהעבירו את הערכים אל emit() באותו סדר:
func take_damage(amount: int) -> void:
hp = maxi(hp - amount, 0)
damaged.emit(amount, hp)
if hp == 0:
died.emit()פונקציה מחוברת מקבלת את הערכים כפרמטרים שלה, ולכן היא זקוקה לפרמטר אחד לכל ערך:
hero.damaged.connect(_on_hero_damaged)
func _on_hero_damaged(amount: int, hp_left: int) -> void:
print("-%d HP, %d left" % [amount, hp_left])הטיפוסים בהצהרה מתעדים את הערכים: GDScript לא בודק אותם בעת הפליטה. אי־התאמה מתגלה בפונקציה המקבלת. פונקציה עם מספר שגוי של פרמטרים, או פרמטר מטיפוס שאינו יכול להכיל את הערך, גורמת לשגיאה בשורת emit(), והפונקציה לא רצה.
bind() מוסיפה ערכים משלך אחרי הערכים שנפלטו. כך פונקציה אחת יכולה להאזין לכמה גיבורים ועדיין לדעת מי מהם נפגע:
ada.damaged.connect(_on_damaged.bind("Ada"))
bo.damaged.connect(_on_damaged.bind("Bo"))
func _on_damaged(amount: int, hp_left: int, who: String) -> void:
print(who, " lost ", amount, " HP")ארגומנטים מספקים למאזין את הנתונים הדרושים לו, כך שהוא לא צריך לקרוא אותם מהמשדר. לעולם אל תחבר למבדה שמשתמשת באובייקט המשדר עצמו, כמו hero.died.connect(func(): print(hero.hp)): הלמבדה משאירה את hero בחיים, hero שומר על הלמבדה, אף אחד מהם לא משתחרר לעולם, ו-Godot מדווח על מופעים שדלפו כשהתוכנית מסתיימת.
אתגר
קלארנק מדווח על כל שינוי באמצעות אותות שנושאים את המספרים. בתוך Wallet, הוסף את הפרמטרים לשני האותות וכתוב את שתי המתודות:
balance_changed(old_balance: int, new_balance: int)וגםpurchase_failed(price: int, missing: int)add(amount)מוסיפה מטבעות ופולטת אתbalance_changedעם היתרה שלפני השינוי ואחריו.buy(price): כשהיתרה מספיקה, הפחת את המחיר ופלט אתbalance_changed. אחרת, אל תשנה דבר ופלט אתpurchase_failedעם המחיר ומספר המטבעות החסרים.
הקוד שסופק מחבר פונקציה אחת לכל אות, קורא כמה פקודות מופיעות בהמשך, מריץ כל פקודה (add 20, buy 15) ומדפיס את המטבעות שנותרו בסוף. עבור add 20, buy 15, buy 10, add 5, buy 10 הוא מדפיס:
Balance: 0 -> 20
Balance: 20 -> 5
Cannot buy for 10: 5 coins missing
Balance: 5 -> 10
Balance: 10 -> 0
Coins left: 0הקוד שלך צריך להיות בתוך wallet.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
extends Node
func _ready():
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var wallet := Wallet.new()
wallet.balance_changed.connect(_on_balance_changed)
wallet.purchase_failed.connect(_on_purchase_failed)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "add":
wallet.add(int(parts[1]))
else:
wallet.buy(int(parts[1]))
print("Coins left: ", wallet.balance)
func _on_balance_changed(old_balance: int, new_balance: int) -> void:
print("Balance: %d -> %d" % [old_balance, new_balance])
func _on_purchase_failed(price: int, missing: int) -> void:
print("Cannot buy for %d: %d coins missing" % [price, missing])
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין