Menu
CoddyTech

אותות עם ארגומנטים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 מדווח על מופעים שדלפו כשהתוכנית מסתיימת.

challenge icon

אתגר

קל

ארנק מדווח על כל שינוי באמצעות אותות שנושאים את המספרים. בתוך 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])
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר GDScript אונליין