Menu
CoddyTech

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 3

Reszta 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.

challenge icon

Wyzwanie

Łatwy

Gra 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, LevelMap i Hud w swoich zmiennych składowych.
  • start_level(number, hearts) odtwarza ścieżkę level_N.ogg (N to numer poziomu) lub boss.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: stopped

Twó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()
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online