Czy istnieje ogólnie przyjęty wzorzec wykonywania różnych czynności w grze? Sposób, w jaki gracz może wykonywać akcje, a także sztuczna inteligencja może wykonywać akcje, takie jak ruch, atak, autodestrukcja itp.
Obecnie mam abstrakcyjną funkcję BaseAction, która używa ogólnych .NET do określania różnych obiektów zwracanych przez różne akcje. Wszystko to jest zaimplementowane we wzorcu podobnym do polecenia, w którym każde działanie jest odpowiedzialne za siebie i robi wszystko, czego potrzebuje.
Moje rozumowanie jako abstrakcyjne jest takie, że mogę mieć pojedynczy ActionHandler, a AI może po prostu ustawiać w kolejce różne działania implementujące baseAction. Powodem tego jest to, że różne akcje mogą zwracać informacje o wynikach istotne dla akcji (ponieważ różne akcje mogą mieć zupełnie inne wyniki w grze), a także niektóre typowe implementacje przed i po akcji.
Więc ... czy istnieje bardziej akceptowany sposób na zrobienie tego, czy to brzmi dobrze?
źródło
Odpowiedzi:
Nie sądzę, aby istniał jeden zaakceptowany sposób wdrożenia tej koncepcji, ale naprawdę chciałbym podzielić się tym , jak zwykle sobie z tym radzę w moich grach. To trochę kombinacja polecenia wzorca projektowego i wzorca projektowego Composite .
Mam abstrakcyjną klasę bazową dla akcji, która jest niczym więcej niż opakowaniem wokół
Update
metody, która jest wywoływana dla każdej ramki, iFinished
flagą wskazującą, kiedy akcja się zakończyła.Używam również wzorca projektowania złożonego do tworzenia rodzaju akcji, które są w stanie hostować i wykonywać inne akcje. To także jest klasa abstrakcyjna. Sprowadza się do:
Następnie mam dwie implementacje akcji złożonych, jedną do wykonywania równoległego, a drugą do wykonywania sekwencyjnego . Ale piękno polega na tym, że ponieważ równoległość i sekwencja są działaniami, można je łączyć , aby tworzyć bardziej złożone przepływy wykonania.
I ten, który rządzi sekwencyjnymi działaniami.
W tym miejscu wystarczy po prostu stworzyć konkretne implementacje akcji i użyć
Parallel
iSequence
do kontrolowania przepływu wykonania. Zakończę przykładem:Z powodzeniem używałem tego systemu do prowadzenia całej rozgrywki w graficznej przygodzie, ale prawdopodobnie powinien on działać praktycznie na wszystko. Łatwo było również dodać inne typy akcji złożonych, które były używane do tworzenia pętli wykonawczych i warunkowych.
źródło
Draw
metoda jest już wbudowana w stan jednostki, a zmiany są automatyczne. W module renderującym w trybie zatrzymanym, takim jak Flash, można użyć obserwowalnego wzorca, aby wprowadzić zmiany w obiektach propagowane do obiektów wyświetlanych lub nawiązać połączenie ręcznie wewnątrz samego obiektu.Character
klasa maPosition
właściwość iDraw
metodę, która odczytuje aktualną wartośćPosition
i rysuje tam poprawny obraz. W tej sytuacji wystarczy zaktualizować wartośćPosition
, aby wynik był automatycznie widoczny na ekranie.Character
maPosition
właściwość, ale przekazuje renderowanie do jakiegośSprite
obiektu, który jest automatycznie renderowany przez wykres sceny lub coś takiego. W tej sytuacji musisz upewnić się, że zarówno pozycja postaci, jak i pozycja duszka są zawsze zsynchronizowane, co wymaga nieco więcej pracy. Jednak w obu przypadkach nie rozumiem, dlaczego menedżer akcji miałby mieć z tym coś wspólnego. :)