Il motivo principale per l'utilizzo del modello di progettazione del comando per l'IA del gioco

2

Ho esaminato tutti gli schemi di progettazione nel contesto del modulo di programmazione del gioco questo libro , prima di iniziare il mio prossimo grande progetto . A parte questo, ho letto su di loro in un contesto più generale. Quello che ho difficoltà a comprendere è lo schema di comando, in particolare la parte sull'utilizzo di AI per il gioco .

L'autore dice:

The decoupling here between the AI that selects commands and the actor code that performs them gives us a lot of flexibility. We can use different AI modules for different actors. Or we can mix and match AI for different kinds of behavior. Want a more aggressive opponent? Just plug-in a more aggressive AI to generate commands for it. In fact, we can even bolt AI onto the player’s character, which can be useful for things like demo mode where the game needs to run on auto-pilot.

Questa parte mi fa pensare che il punto principale dell'uso del pattern di comando sia la capacità di mescolare diversi moduli AI con diversi attori. Questa funzionalità non è realizzabile con una semplice interfaccia? In tutti gli altri libri più generali i principali vantaggi di questo modello sono: posticipazione dell'esecuzione, comandi di accodamento, registrazione e annullamento della funzionalità.

Quindi riassumendo: lo schema di comando è utile per disaccoppiare l'IA del gioco per gli attori anche se non ho bisogno di alcuna funzionalità di base che fornisce?

    
posta Wojtek Wencel 15.10.2018 - 19:18
fonte

2 risposte

2

Solo per estendere un po 'la risposta già eccellente di Robert Harvey in un modo che potrebbe fare un po' più clic con te:

Isn't this functionality achievable with a simple interface? In all the other, more general books the main benefits of this pattern are: postponing the execution, queuing commands, logging and undo functionality.

In questo caso stai utilizzando direttamente il ricevitore invece di avere questa astrazione da comando nel mezzo.

Let's say I crate an ICommandable interface instead of using the commands. How is that different functionally? I know that it's different structurally: I'm completely omitting the [Command object] part, but I can't see what's the decoupling advantage here. In both cases I need to know what's the receiver, when creating the command/calling the interface function. Am I missing something?

Innanzitutto, se vuoi introdurre nuovi comandi sul tuo sistema, allora richiederebbe modifiche centralizzate piuttosto intrusive all'interfaccia ICommandable . Inoltre ogni nuova funzione aggiunta a quell'interfaccia dovrebbe essere implementata da ogni concreto Commandable che implementa quell'interfaccia che potrebbe rendere tali estensioni particolarmente costose se ne hai più di una.

In secondo luogo, non ti permette di inserire nuove funzionalità tra invoker e ricevitore. Annullamento e registrazione, accodamento e parallelizzazione sono solo alcuni esempi del tipo di funzionalità che potresti voler aggiungere (e anche possibilmente con il senno di poi) tra invoker e ricevitore.

Nel mio caso, oltre a tutto ciò, abbiamo anche i comandi che vengono registrati da terze parti i cui plug-in sono caricati dagli utenti in fase di runtime (usiamo il modello factory per consentire tale registrazione e l'istanziazione dei comandi per nome). La registrazione di un nuovo comando fa sì che tale comando venga visualizzato automaticamente nell'interfaccia utente e ora sia accessibile sia al codice nativo che al nostro linguaggio di scripting incorporato. Consente a tale comando di essere richiamato in vari modi dagli utenti, facendo clic sugli elementi della GUI o digitando i comandi nella console "command" (scripting) o scrivendo uno script nel proprio file e aggiungendolo come plugin o scrivendo un plugin C ++ e costruendolo e caricandolo dinamicamente. Probabilmente non hai bisogno di tutti questi campanelli e fischietti, ma sono ulteriori esempi di quali tipi di comportamenti ricchi si possono ottenere con lo schema di comando quando lo si combina con factory.

Ma anche tornando alla funzionalità che puoi inserire nel fratempo, nel nostro caso poiché i plug-in scritti da terze parti (che potrebbero non scrivere sempre il codice più sonoro) possono registrare i comandi per l'esecuzione, alcuni plugin mal scritti potrebbero avere una tendenza per arrestare il crash portando con sé la nostra applicazione host in fiamme. Quindi in realtà avviamo un processo separato ed eseguiamo il comando lì con IPC per sincronizzare le modifiche se tale comando ha esito positivo. Ciò ha avuto l'effetto pratico di rendere la nostra applicazione host quasi "a prova di crash".

E questo è solo un altro esempio di funzionalità che puoi inserire tra invocatore e ricevente. È molto utile per la mia esperienza e fornisce un sacco di respiro in questo modo per quello che considero un costo iniziale piuttosto banale (anche se potrei considerarlo banale in parte perché ho usato questo modello di base in una forma o nell'altra per fin da quando posso ricordare)

    
risposta data 10.12.2018 - 14:38
fonte
6

Isn't this functionality achievable with a simple interface?

Non proprio. C'è anche un oggetto nel pattern che funge da intermediario tra il chiamante e il destinatario.

[Caller] --> [Interface] --> [Command object] --> [Receiver]

È qui che entra in gioco il disaccoppiamento. Il chiamante non sa nulla del ricevitore, né il ricevitore sa nulla del chiamante. Un altro bit del software che conosce sia il ricevitore che il chiamante collega gli oggetti in fase di runtime.

Questo modello si presenta frequentemente nelle tecnologie dell'interfaccia utente come WPF, dove vengono utilizzati gli oggetti Command invece degli eventi ordinari. Facilita l'utilizzo di Model-View-ViewModel (MVVM), in cui l'interfaccia utente è disgiunta dalla logica di business sottostante.

Is the command pattern useful for decoupling game AI for the actors even if I don't need any core functionality it provides?

Bene, il disaccoppiamento è la "funzionalità di base" fornita da Command, quindi dovrai decidere se hai bisogno di quel livello di disaccoppiamento o meno.

Ulteriori letture
Modello di comando su Wikipedia

    
risposta data 15.10.2018 - 19:31
fonte