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