Wprowadzenie do wzorców projektowych
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 45 z 65.
Wzorzec projektowy to znany, nazwany sposób organizowania klas w celu rozwiązania problemu, który powraca w kolejnych programach. Nie jest to biblioteka ani kod do skopiowania: opisuje, jakie obiekty istnieją, za co każdy z nich odpowiada i jak ze sobą współpracują. Samodzielnie piszesz kod, dostosowując go do swojej gry.
Wzorce dają też programistom wspólny język. „Wrogowie pochodzą z fabryki” albo „pasek zdrowia obserwuje gracza” mówi członkowi zespołu, jak zorganizowany jest kod, zanim otworzy plik.
Oto problem, który rozwiązuje wzorzec. Rozpoczęcie poziomu oznacza konieczność skomunikowania się z trzema obiektami, a każdy skrypt rozpoczynający poziom powtarza te linie:
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)Wzorzec Facade umieszcza jedną klasę przed tymi obiektami i udostępnia jej jedną prostą metodę:
# 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 3Reszta programu wywołuje start_level(), a gdy zmienia się sposób uruchamiania poziomu, edytujesz jeden plik.
Wzorce są pogrupowane według problemu, który rozwiązują:
- Wzorce kreacyjne określają sposób tworzenia obiektów: Singleton, Factory.
- Wzorce strukturalne łączą obiekty w większe struktury: Facade, Adapter, Decorator, Composite.
- Wzorce behawioralne organizują współpracę obiektów: Observer, Strategy, Command, Template Method, State.
Ten rozdział i następny omawiają te wzorce. Każdy z nich opiera się na tym, co już znasz: klasach w osobnych plikach, dziedziczeniu, polimorfizmie, kompozycji i sygnałach.
Wyzwanie
ŁatwyGra rozpoczyna i kończy poziomy za pomocą trzech obiektów, które są już napisane: MusicPlayer (music_player.gd), LevelMap (level_map.gd) i Hud (hud.gd). Napisz fasadę GameFacade, która będzie je opakowywać:
- Tworzy po jednym obiekcie
MusicPlayer,LevelMapiHudw swoich zmiennych składowych. start_level(number, hearts)odtwarza ścieżkęlevel_N.ogg(N to numer poziomu) lubboss.ogg, gdy numer jest wielokrotnością5, następnie wczytuje mapę tego poziomu, a potem wyświetla liczbę serc.quit_level()ukrywa HUD, a następnie zatrzymuje muzykę.
Dostarczony kod odczytuje liczbę kolejnych poleceń, a następnie po jednym poleceniu w każdym wierszu: start NUMBER HEARTS lub quit. Dla poleceń start 5 2 i quit wynik to:
Music: playing boss.ogg
Map: level 5 loaded
HUD: hearts 2
HUD: hidden
Music: stoppedTwój kod umieść w pliku game_facade.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
extends Node
func _ready():
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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()
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online