Mam kilka książek na temat Wzorów projektowych i przeczytałem kilka artykułów, ale nie mogę intuicyjnie ustalić, które wzorce projektowe programowania byłyby przydatne w tworzeniu gier.
Na przykład mam książkę o nazwie ActionScript 3 z wzorami projektowymi, która szczegółowo opisuje kilka wzorców projektowych, takich jak Model View Controller, Singleton, Factory, Command itp.
Jako ktoś nowy w tym, nie mogę dowiedzieć się, który z nich byłby przydatny, a właściwie, jeśli którykolwiek z nich to wzorce projektowe, których powinienem się uczyć i próbować używać. Być może istnieją inne wzorce projektowe specyficzne dla programowania gier, o których nawet nie wiem?
Jeśli masz doświadczenie w stosowaniu określonego wzorca projektowego podczas tworzenia gry, chciałbym go usłyszeć. Rozumowanie, dlaczego zostało użyte, próbki kodu lub zasoby online, byłoby bardzo pomocne, jeśli je masz. W tej chwili najbardziej interesują mnie implementacje ActionScript 3 i C ++, ale zdecydowanie mogę skorzystać z doświadczenia i przykładów z dowolnego języka.
Dzięki!
Odpowiedzi:
Czas na mniej niepotrzebną odpowiedź z kilkoma sugestiami. Nie należy traktować ich jako zaleceń wdrożeniowych, a bardziej przykładów możliwych zastosowań.
Niektóre wzory pominięto z powodu braku inspiracji.
źródło
Napisałem książkę na dokładnie ten temat: Wzorce programowania gier . Rozdziały, które tam są, mogą być dla ciebie pomocne.
źródło
Jedną rzeczą, którą Brandon Eich miał dobry sens, by poruszyć w Coders at Work, jest to, że wzorce to hacki i obejścia: [Wzory] pokazują pewien defekt w języku. Te wzory nie są darmowe. Nie ma darmowego lunchu. Powinniśmy więc szukać ewolucji w języku, który dodaje odpowiednie elementy.
Jako programiści gier, a nie projektanci kompilatorów, rzadko mamy możliwość ewolucji używanych przez nas języków, ale możemy nauczyć się ewoluować w naszym własnym stylu, aby lepiej dopasować nasz język i wymagania. Wzory są tego częścią, ale nieużywanie wzorców to kolejna część, zwłaszcza że, jak mówi Brandon, wzorce rzadko przebiegają bez zauważalnej wydajności, kosztów pamięci lub sprawności kodu. MVC po prostu nie jest świetnym wzorem dla wielu rzeczy w grach. Singleton jest obejściem dla słabych reguł inicjalizacji statycznej C ++ i prawdopodobnie nie powinieneś ich robić. Fabryka upraszcza tworzenie skomplikowanych obiektów - być może Twoje obiekty powinny być po prostu prostsze. Popularne wzory to narzędzia, do których można się odwoływać, kiedy ich potrzebujemy zarządzać czymś złożonym, a nie narzędziami, których powinniśmy chcieć użyć do zbudowania czegoś złożonego na początku.
Dobry kod (gry) może używać wzorców lub nie. Jeśli używa wzorców, w porządku - są doskonałym narzędziem komunikacyjnym do wyjaśniania struktury kodu innym programistom na wysokim, niezależnym od języka poziomie. Jeśli uważasz, że kod jest lepszy bez użycia wzorca, nie pobijaj się - prawdopodobnie tak jest.
źródło
Oczywiście, jak powiedzieli inni, wszystkie wzorce są przydatne w odpowiednich okolicznościach, a częścią uczenia się, jak z nich korzystać, jest nauka, kiedy z nich korzystać. Jednak znakomita książka „ Podstawowe techniki i algorytmy w programowaniu gier” Daniela Sancheza-Crespo Dalmaua wymienia sześć wzorców programowania i sześć wzorców użyteczności jako szczególnie przydatne w programowaniu gier.
Programowanie:
Użyteczność:
Książka zawiera bardziej szczegółowe informacje na temat każdego z nich.
źródło
Systemy jednostek są ładnym rodzajem wzoru. To nie jest dokładnie wzór, ponieważ nie jest ostry OOP. Można go jednak łączyć z OOP.
Kilka dobrych linków (zacznij od góry dla wprowadzenia):
źródło
OOP design patterns
które zazwyczaj pokazują relacje i interakcje między klasami / obiektami. Istnieje wiele innych wzorów. OOP to zestaw pojęć, a nie wzór.Design pattern
to także koncepcja.Wszyscy. Z wyjątkiem Singleton. [/nonszalancja]
źródło
Nie tak naprawdę o wzorach, ale o podstawowych zasadach, które się za nimi kryją. W „Design Patterns: Elements of Reusable Object-Oriented Software” (1995) , grupa czterech (Gamma, Erich; Richard Helm, Ralph Johnson i John Vlissides) zaleca tylko dwie zasady projektowania obiektowego: (1) program do interfejs, a nie implementacja i (2) faworyzuj kompozycję obiektów nad dziedziczeniem klas.
Te dwie zasady są bardzo pomocne w wielu zadaniach związanych z tworzeniem gier. Na przykład wielu programistów gier używa głębokiej hierarchii klas do reprezentowania bytów gry. Istnieje inne podejście oparte na kompozycji - obiekty gry oparte na komponentach. Artykuł o tym podejściu. Jeszcze więcej linków . Jest to przykładowy wzór dekoratora .
źródło
Ciekawie powtarzający się wzór szablonu mogą być bardzo przydatne dla uniknięcia metod wirtualnych i spadku wydajności, które mogą pochodzić z wywołania funkcji wirtualnych.
Może to być odpowiedni wzorzec, gdy tak naprawdę nie potrzebujesz kontenera klasy podstawowej, który ma interfejs, którego szukasz, ale chcesz mieć podobnie nazwane zachowania i interfejsy.
Na przykład możesz tego użyć podczas kompilacji klas dla wielu platform lub silników (dx vs. opengl), gdzie wariancja typu jest znana w czasie kompilacji.
źródło
Wzorzec projektowy, który ewoluowałem przez wiele lat i który był dla mnie spektakularnie przydatny, jest czymś, co nazywam „zestawem definicji brokera”; jak podsumować to w kategoriach GOF wydaje się być kontrowersyjna, ale to pytanie, które napisałem o tym na StackOverflow, zawiera pewne szczegóły na ten temat.
Podstawową koncepcją jest to, że niektóre właściwości modelu, takie jak gatunek stworzenia, są ustawione tak, aby każda możliwa wartość właściwości miała odpowiadający jej obiekt definicji - pojedynczy, wspólny obiekt na wartość - który określa jego zachowanie, i są one dostępne za pośrednictwem centralnego brokera (który, pod względem GOF, może być rejestrem, fabryką lub jednym i drugim). W moim zastosowaniu są one również ogólnie dostępne za pomocą kluczy skalarnych, aby ułatwić słabe wiązanie do celów morfizmu środowiska wykonawczego.
źródło