Menu
CoddyTech

מבוא לתבניות עיצוב

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

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

תבניות גם מעניקות למפתחים שפה משותפת. „האויבים נוצרים באמצעות מפעל” או „מד החיים צופה בשחקן” מסבירים לחבר צוות כיצד הקוד מאורגן עוד לפני שהוא פותח קובץ.

הנה בעיה שתבנית פותרת. התחלת שלב פירושה תקשורת עם שלושה אובייקטים, וכל סקריפט שמתחיל שלב חוזר על השורות האלה:

var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()
music.play("forest.ogg")
level_map.load_map(1)
hud.show_hearts(3)

דפוס Facade מציב מחלקה אחת לפני האובייקטים האלה ומספק לה מתודה פשוטה אחת:

# game_facade.gd
class_name GameFacade
extends RefCounted

var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()

func start_level(number: int) -> void:
	music.play("forest.ogg")
	level_map.load_map(number)
	hud.show_hearts(3)
# main.gd
var game := GameFacade.new()
game.start_level(1)
Music: playing forest.ogg
Map: level 1 loaded
HUD: hearts 3

שאר התוכנית קורא ל־start_level(), וכשמשנים את אופן התחלת השלב, עורכים קובץ אחד.

דפוסים מקובצים לפי הבעיה שהם פותרים:

  • דפוסים יצירתיים שולטים באופן שבו אובייקטים נוצרים: Singleton, Factory.
  • דפוסים מבניים משלבים אובייקטים במבנים גדולים יותר: Facade, Adapter, Decorator, Composite.
  • דפוסים התנהגותיים מארגנים את אופן שיתוף הפעולה בין אובייקטים: Observer, Strategy, Command, Template Method, State.

פרק זה והפרק הבא עוסקים בתבניות האלה. כל אחת מהן בנויה ממה שכבר ידוע לך: מחלקות בקבצים משלהן, ירושה, פולימורפיזם, הרכבה ואותות.

challenge icon

אתגר

קל

משחק מתחיל ומסיים שלבים באמצעות שלושה אובייקטים שכבר נכתבו: MusicPlayer (music_player.gd), LevelMap (level_map.gd) ו-Hud (hud.gd). כתבו את חזית GameFacade עבורם:

  • הוא יוצר משתנה איבר אחד מכל סוג: MusicPlayer, LevelMap ו-Hud.
  • start_level(number, hearts) מנגנת את הרצועה level_N.ogg (N הוא מספר השלב), או את boss.ogg כאשר המספר הוא כפולה של 5, ואז טוענת את המפה של אותו שלב, ואז מציגה את הלבבות.
  • quit_level() מסתירה את ה-HUD, ואז עוצרת את המוזיקה.

הקוד שסופק קורא כמה פקודות מופיעות בהמשך, ואז פקודה אחת בכל שורה: start NUMBER HEARTS או quit. עבור start 5 2 ו-quit הפלט הוא:

Music: playing boss.ogg
Map: level 5 loaded
HUD: hearts 2
HUD: hidden
Music: stopped

כתבו את הקוד שלכם ב-game_facade.gd. main.gd מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

extends Node

func _ready():
	# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
	var game := GameFacade.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "start":
			game.start_level(int(parts[1]), int(parts[2]))
		elif parts[0] == "quit":
			game.quit_level()
quiz iconבחנו את עצמכם

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

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

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