הכרזה ופליטה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 36 מתוך 65.
הכרז על אות באמצעות מילת המפתח signal ושם, בראש המחלקה לצד המשתנים שלה. שם של אות מתאר אירוע שכבר התרחש, ב־snake_case: died, door_opened, leveled_up. מחלקה מכריזה על אותות רבים ככל שהיא צריכה:
# player.gd
class_name Player
extends RefCounted
signal leveled_up
signal max_level_reached
const MAX_LEVEL := 3
var level := 1
var xp := 0
func add_xp(amount: int) -> void:
xp += amount
while xp >= 100 and level < MAX_LEVEL:
xp -= 100
level += 1
leveled_up.emit()
if level == MAX_LEVEL:
max_level_reached.emit()שדר אות ברגע שהאירוע שלו מתרחש, ורק אז. add_xp(50) אצל שחקן חדש לא משדר דבר. add_xp(250) לאחר מכן מביא את xp ל-300: האות leveled_up משודר פעמיים, פעם אחת לכל עליית רמה, והאות max_level_reached משודר פעם אחת, בעליית הרמה שמביאה לרמה 3.
מגדיר מאפיין הוא מקום טוב לפלוט אות, כי כך האות מופעלת בכל פעם שקוד משנה את הערך:
signal died
var hp: int = 10:
set(value):
var was_alive := hp > 0
hp = maxi(value, 0)
if was_alive and hp == 0:
died.emit()was_alive מונע מ-died להיפלט שוב כאשר פוגעים פעם נוספת בגיבור עם 0 נקודות בריאות.
אפשר לגשת לאות גם באמצעות שמו כטקסט: emit_signal("died") פולט אותו, hero.connect("died", _on_hero_died) מתחבר אליו, ו־hero.has_signal("died") מחזיר true. התחברות לשם שהאובייקט לא הצהיר עליו היא שגיאה כשהשורה הזאת רצה.
אתגר
קלכתבו Bomb שסופר לאחור ומכריז על כל שלב באמצעות אותות.
- הכריזו על שני אותות:
beepedו-exploded. tick()מפחיתה אתfuseב-1. אם הפתיל עדיין גדול מ-0, יש לפלוט אתbeeped; אם הוא הגיע ל-0, יש לפלוט אתexploded.- ברגע שהפתיל הוא
0, הפצצה התפוצצה: טיקים נוספים לא עושים דבר ולא פולטים דבר.
הקוד שסופק קורא את הפתיל ההתחלתי ואת מספר הטיקים שיש להריץ, מתחבר לשני האותות לפי שמם ומדפיס Beep ו-BOOM! מתוך הפונקציות המחוברות, ולאחר מכן את יתרת הפתיל. עבור פתיל של 3 ו-5 טיקים, הוא מדפיס:
Beep
Beep
BOOM!
Fuse: 0הקוד שלכם צריך להופיע ב-bomb.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
extends Node
func _ready():
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var bomb := Bomb.new(int(OS.read_string_from_stdin()))
# connect() עם שם הסיגנל כטקסט
bomb.connect("beeped", _on_beeped)
bomb.connect("exploded", _on_exploded)
var ticks := int(OS.read_string_from_stdin())
for i in ticks:
bomb.tick()
print("Fuse: ", bomb.fuse)
func _on_beeped() -> void:
print("Beep")
func _on_exploded() -> void:
print("BOOM!")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין