Menu
CoddyTech

התחברות לאותות

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

connect() מקבלת את הפונקציה להרצה כ-Callable. ציין מתודה ללא סוגריים, או כתוב למבדה:

chest.opened.connect(_on_chest_opened)          # מתודה של הסקריפט הזה
chest.opened.connect(quest_log.add_entry)       # מתודה של אובייקט אחר
chest.opened.connect(func(): print("Creak!"))   # פונקציית למבדה

Godot נותן לשיטת האזנה שם שמתחיל ב־_on_, אחריו שם המשדר, ואז שם האות: _on_chest_opened. לאות יכולים להיות פונקציות מחוברות רבות, והן רצות לפי סדר החיבור שלהן.

אובייקט שמאזין בדרך כלל מחבר את עצמו, בתוך מתודה שמקבלת את המשדר:

# quest_log.gd
class_name QuestLog
extends RefCounted

var chests_opened := 0

func track(chest: Chest) -> void:
	if not chest.opened.is_connected(_on_chest_opened):
		chest.opened.connect(_on_chest_opened)

func untrack(chest: Chest) -> void:
	if chest.opened.is_connected(_on_chest_opened):
		chest.opened.disconnect(_on_chest_opened)

func _on_chest_opened() -> void:
	chests_opened += 1

חיבור של אותה פונקציה לאותו אות פעמיים הוא שגיאה, וכך גם ניתוק פונקציה שאינה מחוברת. is_connected() בודקת תחילה. disconnect() מפסיקה להאזין, והפליטה הבאה כבר לא תפעיל את הפונקציה הזאת.

העבר את CONNECT_ONE_SHOT כארגומנט השני, והחיבור מתנתק מעצמו לאחר הקריאה הראשונה שלו: chest.opened.connect(_on_first_open, CONNECT_ONE_SHOT).

למבדה נשמר הערך שהיה למשתנה מקומי בזמן יצירת הלמבדה. count += 1 בתוך למבדה מחוברת משנה את העותק הזה, ו-count בתוך _ready() נשאר 0. שמור מונה במשתנה איבר של אובייקט מאזין, כפי שעושה QuestLog.

challenge icon

אתגר

קל

במטווח יש מטרות שפולטות hit כשפוגעים בהן. כתבו את ScoreBoard שמאזין להן:

  • watch(target) מחבר את אות hit של המטרה אל _on_target_hit. מעקב אחר מטרה שכבר עוקבים אחריה אינו משנה דבר.
  • ignore(target) מנתק אותה. התעלמות ממטרה שלא עוקבים אחריה אינה משנה דבר.
  • _on_target_hit() מוסיפה 10 אל points ומדפיסה Hit! Score: N.

מעקב פעמיים או התעלמות ממטרה שלא עוקבים אחריה לא אמורים לגרום לשגיאה, כי כל שגיאה נכשלת בבדיקה. הקובץ target.gd הושלם.

הקוד שסופק קורא את מספר המטרות, ואז פקודות כגון watch 0, ignore 0 ו-shoot 0, ומדפיס את הניקוד הסופי. עבור שתי מטרות והפקודות watch 0, shoot 0, shoot 1, watch 1, watch 1, shoot 1, ignore 0, shoot 0 הוא מדפיס:

Shot target 0
Hit! Score: 10
Shot target 1
Shot target 1
Hit! Score: 20
Shot target 0
Final score: 20

הקוד שלך צריך להיות ב-score_board.gd וב-target.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

extends Node

func _ready():
	# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
	var board := ScoreBoard.new()
	var targets: Array[Target] = []
	for i in int(OS.read_string_from_stdin()):
		targets.append(Target.new())
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var target := targets[int(parts[1])]
		if parts[0] == "watch":
			board.watch(target)
		elif parts[0] == "ignore":
			board.ignore(target)
		else:
			print("Shot target ", parts[1])
			target.shoot()
	print("Final score: ", board.points)
quiz iconבחנו את עצמכם

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

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

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