Menu
CoddyTech

הכרזה ופליטה

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

challenge icon

אתגר

קל

כתבו 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!")
quiz iconבחנו את עצמכם

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

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

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