Jak mogę wdrożyć system poleceń w grze przygodowej typu „wskaż i kliknij”?

11

Tworzę grę przygodową typu „wskaż i kliknij”, a obecnie próbuję znaleźć najlepszy sposób na wdrożenie systemu dowodzenia.

Załóżmy interfejs w stylu Monkey Island lub Maniac Mansion, z paletą czasowników i obiektów w scenie i ekwipunku. Klikając je, tworzysz zdanie do wykonania.

na przykład możesz kliknąć, look ata następnie drzewo, aby „spojrzeć na drzewo” lub kliknąć jabłko, a następnie give, a następnie dziewczynę, aby „dać jabłko dziewczynie”.

Istnieją trzy możliwe formy zdania:

  • verb, na przykład „zapisz”
  • verb noun, na przykład „podnieś jabłko”, „spójrz na ośmiornicę”
  • verb noun noun, na przykład „podaruj wściekły pies”, „użyj łomu z słoikiem do marynowania”

W różnych sytuacjach chcę, aby akcja była wykonywana przez różne obiekty.

Na przykład w przypadku giveczasownika może być zdefiniowana domyślna akcja, która powoduje, że postać mówi coś w stylu „wolałbym się do tego przyczepić”, lub wściekły pies może zdefiniować akcję, w której zjada wszystko, co chcesz mu dać .

Jeśli interfejs ma działać jak Maniac Mansion, to budujesz zdanie, a następnie każesz go wykonać (w Maniac Mansion, albo klikając zdanie, albo klikając ponownie ostatnią klikniętą rzecz).

Jeśli ma działać jak Monkey Island, zdanie wykonuje się, gdy jest kompletne, co stwarza problem dla czasowników, usektóre czasami mogą mieć jeden rzeczownik, a innym razem dwa.

Jak więc wdrożyłbyś system, który sobie z tym poradzi?

SpoonMeiser
źródło
1
Wydaje się, że istnieją trzy typy czasownika, jeden typ dla rzeczowników zerowych, drugi dla dwóch itd. Nie są to ta sama klasa obiektów. Nie można „patrzeć na ośmiornicę z marynowanym słoikiem”, więc lookjest to czasownik z pojedynczym rzeczownikiem itp.
tenpn

Odpowiedzi:

10

Może być łatwiejszy w użyciu, jeśli odwrócisz kolejność wyboru. Tak więc użytkownik klika rzeczownik, a następnie gra wyświetla zestaw czasowników, które można wykonać na tym rzeczowniku. Jeśli czasownik wymaga obiektu (tj. „Daj ___”), gra czeka na wybranie obiektu przez użytkownika przed wykonaniem akcji.

Coś jak:

  1. Użytkownik klika cheeseburgera.
  2. Gra pokazuje menu: „podnieś, zjedz, popatrz, daj ___”.
  3. Użytkownik wybiera opcję „oddaj ___”.
  4. Gra mówi „komu dać?” i czeka, aż użytkownik kliknie inny rzeczownik (lub przycisk Anuluj).
  5. Użytkownik klika małpy.
  6. Gra daje cheeseburgera małpce.

Pod względem implementacji każdy obiekt w grze musi mieć dane do:

  1. Który zestaw czasowników możesz do niego zastosować.
  2. W przypadku czasowników pozwala na pobranie obiektu, który zestaw obiektów można zastosować.
  3. Dla każdej pary czasowników lub obiektów czasownikowych zachowanie należy wykonać, gdy użytkownik to zrobi.

Ponieważ gramatyka tak naprawdę nie jest zagnieżdżona ani nic, nie powinieneś potrzebować czegoś tak skomplikowanego jak wzorzec tłumacza.

hojny
źródło
+1, zarówno po stronie modelowania rzeczy, jak i po stronie interfejsu rzeczy. Tak, głównie mam zgadzając bo to jest jak ja to zrobię, ale lubię tę odpowiedź.
drhayes
Jeśli się zgodzimy, to oczywiście obydwoje musimy mieć rację. ;)
wspaniały
Czy zatem uważasz, że zachowanie, które należy wykonać, powinno być zawsze określone przez pierwszy rzeczownik?
SpoonMeiser
1
Tak, myślę, że wiele rzeczowników będą dzielić zachowanie (tak, że „pick up” byłoby użyć tego samego kodu do podnoszenia różnych przedmiotów), ale ma to sens, aby była ona aż do rzeczownika określić zestaw czasowników, które mogą być stosowane do tego. Biorąc pod uwagę, że zestaw rzeczowników jest bardzo duży (każda rzecz w grze), a zestaw czasowników niewielki (prawdopodobnie garść operacji), myślę, że sensowne jest, aby użytkownik wybrał rzeczownik jako pierwszy, ponieważ powoduje to, że kombinacje są mniejsze szybko. I pragmatycznie pozwala użytkownikowi kliknąć coś, aby zainicjować interakcję, a nie jakieś słowo.
hojny
Jest to rodzaj pełnego przyspieszenia.
Jari Komppa,
2

Przedstawiam uproszczone rozwiązanie. Oczywiście można go przedłużyć.

Myślę, że prosta lista (czasownik, obiekt1, obiekt2) rozwiązałaby to:

  • jeśli gracz kliknął obiekt (czasownik) „użyj” i kliknął obiekt „balon”, a gracz kliknął obiekt „pompa” i istnieje tryplet („użyj”, „balon”, „pompa”), wówczas „użyłeś balon z pompą”
  • Czasami object2 miałby NULL, jak w „use hel” (use, hel, NULL)
  • Wymagaj od gracza, aby najpierw kliknął czasownik obiektowy
  • jeśli gracz kliknie coś, co do siebie nie pasuje, powie „Nie mogę tego zrobić, to nonsens”
  • Oczywiście po każdym kliknięciu należy sprawdzić, czy sekwencja jest poprawna.

Jak obsługiwać wartości domyślne:

  • Jeśli pierwsze kliknięcie nie dotyczy obiektu czasownika, wyszukaj możliwe domyślne działanie.
  • Jednym ze sposobów przechowywania wartości domyślnych byłoby utworzenie kwadrupletu (czasownik, obiekt1, obiekt2, jest domyślny)
  • Innym sposobem ich przechowywania byłoby posiadanie listy domyślnych trojaczków
  • ...

Kilka przykładów:

  • (użycie, balon, pompa)
  • (daj, John, ziemniak)
  • (spacer, piranie, NULL)
  • (użycie, balon w ekwipunku, pompa)
  • (otwarte, od drzwi do dachu, NULL), domyślnie .... przykład domyślnej akcji

Można go przedłużyć:

  • dodaj kilka zdarzeń, które mają zostać uruchomione (daj graczowi coś, gracz powie „Nie mogę tego zrobić, ponieważ jestem potężnym piratem”, rozpocznij scenkę przerywnikową, zmień coś w świecie ...)
  • dodaj kilka warunków wstępnych. Czasami balon może być w klatce, więc musisz wyrazić „jeśli balon nie jest w klatce”. Myślę, że mogę podejść do tego za pomocą rachunku zdarzeń lub prologu lub zrobić to za pomocą wskaźnika funkcji ...
  • czasami zdanie w wierszu poleceń nie brzmiałoby „spójrz na dziurę”, ale zostało przepisane na „spójrz w dziurę”, wymaga to tylko zmiennej :)
użytkownik712092
źródło
1

Występują tutaj dwa problemy: interpretacja danych wejściowych gracza w drzewie składni, a następnie sprawdzenie tego drzewa.

Na pierwszym etapie chciałbym, aby każdy przycisk czasownika tworzył konkretną instancję czasownika pochodzącą z jakiegoś interfejsu czasownika. Do tej instancji zostaną przekazane kolejne rzeczowniki lub czasowniki w celu weryfikacji. Jeśli jest poprawny, dołącza rzeczownik do wewnętrznego drzewa składni, w przeciwnym razie odrzuca z odpowiednim błędem.

Po każdym naciśnięciu przycisku możesz zapytać drzewo czasownika, czy jest w prawidłowym stanie, aby kontynuować (dla danych wejściowych w stylu Monkey Island).

Po przejściu do drugiego etapu konkretny czasownik byłby odpowiedzialny za parsowanie własnego drzewa i aktualizowanie stanu gry.

Bardziej złożone rozwiązanie polegałoby na parsowaniu drzewa zewnętrznie do czasownika. Każdy element drzewa byłby odpowiedzialny za małe działania, które razem przyniosły pożądany rezultat. Takie podejście pozwoliłoby na tworzenie bardziej pojawiających się zdań z małych bloków konstrukcyjnych.

Sprawdź wzorzec interpretera , aby uzyskać więcej informacji na temat etapu analizy.

tenpn
źródło
1
Nie sądzę, że interpretacja danych graczy jest problemem. Z pewnością nie ma nic bardziej wymagającego niż analizowanie wkładu w tekstową przygodę. Naprawdę pytanie sprowadza się do tego, w jaki sposób zaprojektowałbyś hierarchię obiektów i interakcje, aby zapewnić maksymalną elastyczność w zakresie tego, który obiekt określa rzeczywistą akcję do wykonania.
SpoonMeiser