Come posso implementare un sistema di comando per un gioco di avventura in stile punta e clicca?


11

Sto realizzando un gioco di avventura punta e clicca e attualmente sto cercando di capire il modo migliore per implementare un sistema di comando.

Supponi un'interfaccia in stile Monkey Island o Maniac Mansion, con una tavolozza di verbi e oggetti nella scena e nell'inventario. Cliccando su questi, si crea una frase da eseguire.

ad esempio, è possibile fare clic su look ate quindi su un albero per ottenere "guardare l'albero" o fare clic su una mela, givequindi su una ragazza per ottenere "dare una mela a una ragazza".

Esistono tre forme possibili di frase:

  • verb, ad esempio "salva"
  • verb noun, ad esempio "raccogli la mela", "guarda il polpo"
  • verb noun noun, ad esempio "dai sottaceto al cane rabbioso", "usa il piede di porco con il barattolo di sottaceto"

In diverse situazioni, voglio che l'azione sia eseguita da diversi oggetti.

Ad esempio, per il giveverbo, potrebbe esserci un'azione predefinita definita che induce il personaggio a dire qualcosa del tipo "Preferirei aggrapparmi a quello", oppure il cane rabbioso potrebbe definire un'azione in cui mangia qualsiasi cosa tu tenti di dargli .

Se l'interfaccia deve funzionare come Maniac Mansion, allora costruisci la frase e poi digli di eseguirla (in Maniac Mansion, facendo clic sulla frase o facendo di nuovo clic sull'ultima cosa su cui hai fatto clic).

Se funziona come Monkey Island, la frase viene eseguita non appena completa, il che pone un problema per i verbi come useche a volte potrebbe prendere un nome e altre due volte.

Quindi come implementeresti un sistema che gestisce questo?


1
Sembra che ci siano tre tipi di verbo, un tipo per zero nomi, un altro per due, ecc. Non sono la stessa classe di oggetti. Non puoi "guardare il polpo con il barattolo di sottaceti", così lookè un verbo a nome singolo, ecc.
tenpn

Risposte:


10

Potrebbe risultare più semplice da utilizzare se si inverte l'ordine di selezione. Quindi l'utente fa clic su un sostantivo e quindi il gioco visualizza l'insieme di verbi che possono essere eseguiti su quel sostantivo. Se il verbo richiede un oggetto (ovvero "dare a ___", il gioco attende che l'utente selezioni l'oggetto prima di eseguire l'azione.

Qualcosa di simile a:

  1. L'utente fa clic su un cheeseburger.
  2. Il gioco mostra un menu: "raccogli, mangia, guarda, dai a ___".
  3. L'utente seleziona "dai a ___".
  4. Il gioco dice "dai a chi?" e attende che l'utente faccia clic su un altro nome (o un pulsante Annulla).
  5. L'utente fa clic su una scimmia.
  6. Il gioco dà il cheeseburger alla scimmia.

Per quanto riguarda l'implementazione, ogni oggetto nel gioco deve disporre di dati per:

  1. Quale set di verbi puoi applicare ad esso.
  2. Per i verbi consente di prendere un oggetto, quale set di oggetti può essere applicato.
  3. Per ogni verbo o coppia verbo-oggetto, il comportamento da eseguire quando l'utente lo fa.

Dato che la grammatica non si annida davvero o altro, non dovresti aver bisogno di qualcosa di complicato come un modello di interprete.


+1, sia sul lato della modellazione delle cose che sul lato dell'interfaccia delle cose. Sì, per lo più sono d'accordo perché è così che lo farei, ma mi piace questa risposta.
drhayes,

Se siamo d'accordo, allora chiaramente dobbiamo avere ragione entrambi. ;)
munifico

Quindi, in effetti, pensi che il comportamento da eseguire dovrebbe essere sempre definito dal primo nome?
SpoonMeiser,

1
Sì, penso che più nomi condivideranno il comportamento (in modo che "pick up" utilizzi lo stesso codice per raccogliere oggetti diversi), ma ha senso che sia fino al sostantivo per determinare l'insieme di verbi che possono essere applicati ad esso. Dato che l'insieme dei sostantivi è molto grande (ogni cosa nel gioco) e l'insieme dei verbi piccoli (probabilmente una manciata di operazioni), penso che abbia senso per l'utente scegliere prima un nome dal momento che conosce le combinazioni più in basso velocemente. E, pragmaticamente, consente all'utente di fare clic su una cosa per avviare un'interazione e non una parola.
munifico

Questo è un po 'come ha fatto a tutto gas.
Jari Komppa,

2

Vi presento una soluzione semplicistica. Può essere esteso ovviamente.

Penso che un semplice elenco di (verbo, oggetto1, oggetto2) lo risolva:

  • se il giocatore ha cliccato sull'oggetto (verbo) "usa" e ha fatto clic sull'oggetto "palloncino" e il giocatore ha cliccato sull'oggetto "pompa" ed esiste una tripletta ("usa", "impulso", "pompa"), allora "hai usato l'impulso con pompa"
  • A volte object2 sarebbe NULL come in "use helium" (use, helium, NULL)
  • Richiede al giocatore di fare prima clic sul verbo oggetto
  • se il giocatore fa clic su qualcosa che non corrisponde a nulla, dice "Non posso farlo, questa è una sciocchezza"
  • Ovviamente dovresti controllare dopo ogni clic se la sequenza è corretta.

Come gestire le impostazioni predefinite:

  • Se il primo clic non è sull'oggetto verb, cercare la possibile azione predefinita.
  • Un modo per memorizzare le impostazioni predefinite sarebbe creare quadruplet (verb, object1, object2, is-default)
  • Un altro modo per memorizzarli sarebbe quello di avere un elenco di terzine predefinite
  • ...

Qualche esempio:

  • (uso, impulso, pompa)
  • (dai, John, patate)
  • (cammina, piranha, NULL)
  • (uso, impulso in inventario, pompa)
  • (aperto, porta a tetto, NULL), impostazione predefinita .... esempio di azione predefinita

Può essere esteso:

  • aggiungi alcuni eventi da attivare (dai qualcosa al giocatore, il giocatore dirà "Non posso farlo perché sono un potente pirata", inizia a tagliare la scena, cambia qualcosa nel mondo ...)
  • aggiungere alcune precondizioni. A volte il pallone potrebbe essere in gabbia, quindi dovresti esprimere "se il pallone non è in gabbia". Penso che potrei affrontarlo con il calcolo dell'evento o il prologo o farlo con il puntatore a funzione ...
  • a volte la frase nella riga di comando non sarebbe "guarda nel buco" ma verrebbe riscritta per "guardare nel buco", questo richiede solo una variabile :)

1

Ci sono due problemi qui: interpretare l'input del giocatore in un albero di sintassi, quindi uscire da quell'albero.

Per la prima fase, ogni pulsante verbo creerebbe un'istanza verbo concreta derivata da un'interfaccia verbale. In quell'istanza verrebbero passati altri nomi o verbi per la convalida. Se valido, assocerebbe il nome al suo albero di sintassi interno, altrimenti rifiuterebbe con un errore appropriato.

Dopo aver premuto ogni pulsante, potresti chiedere all'albero dei verbi se era in uno stato valido per procedere (per l'input in stile Monkey Island).

Una volta al secondo stadio, il verbo concreto sarebbe responsabile dell'analisi del proprio albero e dell'aggiornamento dello stato del gioco.

Una soluzione più complessa implicherebbe analizzare l'albero esternamente al verbo. Ogni elemento dell'albero sarebbe responsabile di piccole azioni che insieme producevano il risultato desiderato. Questo approccio ti consentirebbe di creare frasi più emergenti da piccoli blocchi.

Controlla il modello dell'interprete per ulteriori informazioni sulla fase di analisi.


1
Non penso che interpretare l'input dei giocatori sia un problema. Certamente, non c'è niente di così sofisticato come analizzare l'input per un'avventura testuale qui. In realtà, la domanda si riduce a come progetteresti la gerarchia degli oggetti e le interazioni per consentire la massima flessibilità su quale oggetto definisce l'azione effettiva da eseguire.
SpoonMeiser,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.