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