programowanie wydarzeń z historii gry

28

Opracowałem silnik gry w c / c ++ i DirectX.

Mam silnik kafelkowy map, animowane duszki gracza / NPC, rozmawiam z NPC, menu i zmieniającymi się poziomami, ale nie ma gry, po prostu wydaje się pusta.

Rozglądałem się i wciąż słyszę modne odpowiedzi, ale chcę wiedzieć, jak zaimplementować historię w mojej grze.

Niektórzy ludzie powiedzieli, że plik zapisu zawiera flagi regulujące każdą możliwą akcję / stan dostępny w grze, ale to brzmi absurdalnie.

To trochę ambitne, ale staram się uzyskać grę podobną do starszych gier Pokemon / Final Fantasy.

Czy ktoś wie, jak działają te gry lub jaka jest teoria?

Szukałem od dłuższego czasu i naprawdę doceniłbym każdy wkład ludzi.

Skeith
źródło

Odpowiedzi:

19

Historia twojej gry prawdopodobnie powinna mieć postać automatu skończonego (lub jakiegoś rozszerzonego FSA). Kiedy zdarzają się pewne zdarzenia, powinieneś przejść do nowego stanu. W ten sposób będziesz musiał tylko przechowywać bieżący stan i wszelkie informacje, które są potrzebne, aby wiedzieć, gdzie przejść dalej w FSA (wraz ze szczegółami gracza, takimi jak pozycja, zdrowie itp.).

Na przykład, jeśli całkowicie uprościć gry Pokemon, odznaki na siłowni stanowią główną gałąź FSA. Zaczynasz w stanie 0, w którym nie masz odznak, a gdy pokonujesz liderów siłowni, przechodzisz przez stany, do stanu 1, do stanu 2 itd. Aby zaktualizować jednostki gry do obecnego stanu, wystarczy uzyskać aby spojrzeć na obecny stan. Na przykład, NPC poza 3. siłownią sprawdzi, w jakim jesteś stanie, zobaczysz, że jesteś w stanie odpowiadającym posiadaniu 3 odznak i odpowiednio zareaguje (być może „Dobrze zrobione!”).

Nie musisz przechowywać stanu wszystkiego na świecie; tylko stan historii. Same podmioty wiedzą, jak reagować w zależności od aktualnego stanu.

Joseph Mansfield
źródło
ciekawe podejście i podoba mi się, że będzie musiał je wypróbować, ale w jaki sposób śledziłbyś poboczne zadania, które nie zależą od przebiegu historii?
To naprawdę zależy od stopnia skomplikowania twojej historii. Może być najłatwiej mieć wiele FSA (jeden dla każdej podstacji) lub może być konieczne skomplikowane rozgałęzienie. Musisz usiąść i nakreślić swoją historię jako mapę drogową. Kiedy zrozumiesz, w jaki sposób wszystko się przeplata, zastanów się, jak możesz zapisać bieżący stan (lub stany, jeśli może on występować w więcej niż jednym na raz). Niektóre rzeczy będą musiały być przechowywane osobno, na przykład pozycje NPC (jeśli trzeba je uratować) i zdrowie niektórych postaci, ponieważ nie są one zależne od historii.
w tym FSA, o którym mówisz, gdzie znajdę wyjaśnienie tego, najlepiej uproszczonego i bez innych teorii powiązanych.
Skeith,
Możesz dowiedzieć się wszystkiego o automatach stanowych w dowolnym miejscu, ale przez 99,9% czasu nie będzie o grach. Książka wprowadzająca na temat obliczeń nauczy Cię o nich, ale tak naprawdę nie potrzebujesz tak wielu szczegółów. Musisz tylko zrozumieć koncepcję przebywania w stanach i przemieszczania się między nimi, gdy zdarzają się określone zdarzenia. Odpowiedź @ pwny'ego to po prostu powiedzenie tego samego w inny sposób. Czytanie o FSA będzie świetnym sposobem na poznanie koncepcji automatów państwowych. Tylko Google na wprowadzenie do maszyn stanowych!
Joseph Mansfield,
7

Możesz użyć zestawu możliwych stanów, w których znajduje się Twoja gra. Twoi NPC i twój świat będą świadomi tych stanów i odpowiednio zareagują / pokażą się. Możesz także zdefiniować zestaw wyzwalaczy, które będą aktywowane przez niektóre akcje / zdarzenia.

Na przykład pokonanie określonego przeciwnika aktywuje wyzwalacz A, który doda stan S do twojego świata, aw stanie S twoja postać zostanie porażona prądem, gdy wyjdzie z legowiska przeciwnika. Lub pada deszcz na zewnątrz. Lub znajdziesz rzadki cukierek. Dostajesz punkt.

Dzięki tym dwóm prostym dodatkom do gry możesz sprawić, że będzie o wiele bardziej „żywy”.

Upewnij się również, że utworzysz bogate tło dla swojego świata, postaci i fabuły oraz upewnij się, że gra jest spójna z tym tłem. Najpierw zaplanuj swoją historię.

Spróbuj także Gamedev

pwny
źródło
jest to możliwe, ale jestem pewien, że profesjonaliści mają lepsze, ponieważ to, co sujest, pociąga za sobą setki tysięcy booleanów i ints (próbowałem). po prostu nie uważam tego za realistyczne podejście do gry na dużą skalę. dzięki za link
Niekoniecznie wyobraź sobie 5 niezależnych stanów superpozycji. Otrzymasz 32 możliwe gałęzie za 5 booleanów. Myślę, że to rozsądne. Również systemy wyzwalaczy są używane w wielu profesjonalnych grach, szczególnie dlatego, że można następnie zachować zachowanie skryptów za pomocą serii wyzwalaczy.
pwny,
2

Jak wspomniano w sftrabbit, jest to idealna aplikacja dla maszyny stanów.

Zasadniczo masz strukturę drzewa. Każdy liść / węzeł zawiera informacje o bieżącym stanie oraz zasady przechodzenia do następnego stanu. Każdy węzeł może zawierać wiele wyjść, w zależności od stopnia złożoności potrzebnego przepływu fabuły / gry.

Dobrym, bardzo luźnym analogiem jest książka Wybierz własną przygodę . Każda strona zawiera tekst opisujący część historii oraz decyzje, które może podjąć gracz. Każda decyzja prowadzi do innej strony. Niektóre strony mogą zawierać linki do wcześniej odwiedzonych stron itp.

Stare tekstowe gry przygodowe, takie jak Zork i Leather Goddesses of Phobos , oraz niesławne gry Sierra * Quest ( SpaceQuest z Rogerem Wilco, woźny kosmiczny jest jednym z moich ulubionych ) używały bardzo prostej wersji tego typu systemu. Każdy pokój na mapie był stanem, z wyjściami połączonymi z innymi stanami lub pokojami. Pozyskanie elementu powoduje ustawienie flagi w globalnym obiekcie stanu. Każdy pokój sprawdzi te flagi, aby ustalić, które postacie lub przedmioty były dostępne w każdym pokoju.

Twoje stany mogą być zaimplementowane jako klasa lub struktura, każda z właściwościami dla:

Lista zasobów - lista wskaźników do grafiki w tle i wszystko, czego potrzebujesz, aby wyświetlić pokój / stan / poziom.

Warunki wejścia - osiągnięcia, które musiały zostać osiągnięte, aby wejść na poziom

Wyjścia - linki do każdego możliwego „następnego” wyjścia. Przykładami tego są północ, południe, wschód i zachód, ale możesz także włączyć drzwi1, teleportację itp. Podczas próby wyjścia z pokoju lub ustalenia, czy wyjście / drzwi są „otwarte”, gra może sprawdzić następny stan aby sprawdzić, czy warunki wejścia zostały spełnione, i zmienić sposób wyświetlania wyjścia na ekranie, lub po prostu nie pozwolić graczowi poruszać się w tym kierunku.

Jeśli chcesz się spodobać, możesz dołączyć inną wersję stanu z różnymi warunkami wejścia, co zmieniłoby sposób prezentacji pokoju graczowi lub działania dostępne w tym pokoju.

Twój ekran startowy, śmierć / gra nad ekranem itp. Mogą być stanami w systemie, podobnie do sposobu poruszania się między ekranami menu. W rzeczywistości, jeśli masz taki system menu, możesz go do tego użyć. Zamiast strzałek w górę / w dół i „enter”, aby poruszać się po menu, szukałeś określonych wydarzeń w obszarze gry, takich jak nadepnięcie na teleportację, zejście z prawej strony ekranu itp.

Z administracyjnego punktu widzenia zastanów się, czy możesz skorzystać z narzędzia administratora, które pozwoliłoby Ci utworzyć maszynę stanu. Dodawaj pokoje do mapy, twórz łącza między nimi, przypisuj zasoby, takie jak obrazy tła itp. Prawdopodobnie jest to przesada przy pierwszej próbie; zbyt łatwo jest zaabsorbować się budowaniem narzędzi administracyjnych i nigdy tak naprawdę nie ukończyć gry. Pamiętaj - nie piszesz oprogramowania pośredniego, ale grę.

Mam nadzieję że to pomoże.

3Dave
źródło
na tym przykładzie wyobraź sobie miasto. Mam plik, który zawiera układ kafelków, a także grafikę i rozmiar, listy NPC i podobne rzeczy. dodając plik, do gry dodawana jest nowa kamera miejska, pozwalająca innym wnieść swój wkład, lub też plan, ale plik staje się nieco pełny i złożony. jeśli cię rozumiem, umieściłbym wydarzenia, które mogą mieć miejsce w danym mieście, w tym pliku z flagami, aby śledzić postępy?
Skeith,
@Skeith tak, to brzmi jak rozsądne podejście.
3Dave
0

Kiedyś korzystałem z tego silnika gry o nazwie VERGE . Baw się z tym i zobacz, jak radzi sobie z wydarzeniami, bardzo mi się podoba. To zbyt open source, dzięki czemu można zobaczyć, w jaki sposób jego realizacji, tutaj . Oto krótki opis.

Każda mapa ma różne warstwy. Warstwy graficzne, których może być kilka. Warstwa niedrożności. A potem jest warstwa strefy. Warstwa strefy jest tutaj ważna. *

Każdy kafelek ma numer wskazujący, do której strefy należy. Każdą strefę można aktywować na dwa podstawowe sposoby. Albo strefa jest aktywowana po wejściu do niej gracza, albo ma tak zwaną aktywację sąsiadującą. Aktywacja sąsiednia oznacza, że ​​gdy gracz stoi obok jednego z kafelków strefy i naciska klawisz określony jako klucz aktywacyjny, strefa jest aktywowana.

Kiedy strefa jest aktywowana, wywołuje funkcję ze skryptu. Musisz więc osadzić jakiś język skryptowy. VERGE ma swój własny język o nazwie VergeC, a także pozwala lua. Sam wolę używać Pythona.

Po pokonaniu tej przeszkody masz teraz ogromną moc w skryptowaniu zdarzeń. Masz w pełni rozwinięty język programowania, w którym możesz przechowywać dane i zarządzać nimi, takie jak statystyki graczy, flagi historii itp.

* Istnieje również warstwa Entity. Istoty działają jak ruchome sąsiadujące aktywowane strefy.

Benjamin Lindley
źródło
to brzmi jak system używany w serii gier RPG. ale co, jeśli ten kafelek ma 5 różnych wydarzeń w zależności od tego, jak daleko jesteś w historii?
Skeith,
@Skeith Nie może. Z każdym kafelkiem jest związana tylko jedna strefa. I każda strefa ma tylko jedną funkcję skryptu, którą wywołuje. To nie jest problem. Pamiętaj, że masz tutaj w pełni rozwinięty język programowania. Informacje o tym, jak daleko jesteś w historii, będą przechowywane w zmiennej (lub kilku). Zatem podjęcie decyzji, co należy zrobić, polega na przetestowaniu tej zmiennej w skrypcie i podjęciu odpowiedniego działania na podstawie jej wartości.
Benjamin Lindley,
@Skeith: Chociaż możesz dodać opcję zmiany strefy, do której należy płytka.
Benjamin Lindley,