Macchina a stati finiti in C ++


16

Così, ho letto molto su utilizzando FSM per fare la gestione dello stato di gioco, cose come quello che un FSM è, e l'utilizzo di un camino o un insieme di stati per la costruzione di uno. Ho passato tutto questo. Ma sono bloccato a scrivere un'implementazione reale e ben progettata di un FSM a tale scopo. In particolare, come si risolve in modo chiaro il problema della transizione tra stati, (come) uno stato dovrebbe essere in grado di utilizzare i dati di altri stati e così via. Qualcuno ha qualche suggerimento su come progettare e scrivere un'implementazione in C ++ o, meglio ancora, esempi di codice?


tag modificati in base a questa discussione in meta: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

Risposte:


12

Ho scritto un FSM basato su un capitolo di "Sviluppo di giochi multigiocatore di massa" a cura di Thor Alexander. All'interno è presente un capitolo intitolato "Macchine a stati paralleli per personaggi credibili". Questo è scritto in Python, ma i concetti sono facilmente traducibili in C ++. Consiglio vivamente di verificarlo, anche se si tratta di stati dei personaggi, non di stati del gioco.

Quello che ho creato è qui: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager cerca StateManager per i dettagli di implementazione, ma fondamentalmente hai diversi 'stati di base' che puoi uso. Quindi da lì hai gli stati specifici in cui passi come personaggio, quindi ogni stato è una classe. Quindi controlla se puoi passare da uno stato a un altro e poi su 'invio' fai il tuo passaggio, puoi anche facilmente fare cose come inserire eventi dopo esserti trasferito in uno stato. Finora ho scoperto che ha funzionato davvero bene per il gioco.

Quello che ho implementato è ciò che il libro chiama una macchina a stati paralleli, che è essenziale che più fsm stiano lavorando insieme, in questo caso puoi passare a uno stato, che blocca tutti gli altri stati (cioè: CreatureState_Dead). Non approfondirò troppo i dettagli poiché non penso che ti sarebbe davvero di aiuto, ma se vuoi posso approfondire.


1
Sembra che il codice sia stato spostato su: github.com/swganh/mmoserver/tree/master/src/ZoneServer/…
DK_


8

Programmazione dell'intelligenza artificiale dei giochi per esempio (http://www.ai-junkie.com/books/toc_pgaibe.html) ha un'implementazione di esempio che è piuttosto semplice e gestisce solo le basi. Le transizioni vengono gestite in una singola chiamata di metodo (prima Enter (), quindi Esegui () ogni aggiornamento, Exit () durante la transizione)> Non so di cosa avresti bisogno oltre a quello. Vorrei implementare transizioni più complicate come stati propri che sono progettati per eseguire una sola volta e passare allo stato successivo in sequenza.

Prenderò una coltellata e presumo che tu stia guardando gli FSM per l'IA, se è così ti consiglio di dare un'occhiata agli alberi comportamentali. AIGameDev ha alcuni grandi articoli su di esso.


1
Quell'esempio è disponibile anche sul suo sito: ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon

5

Se la magia del modello C ++ e i potenziali lunghi tempi di compilazione non sono un problema per te e hai già installato Boost con cui lavorare :

Boost ora ha una libreria di macchine meta-stato (efficiente in termini di velocità e dimensioni ) che ha il vantaggio di permetterti di impostare la tabella di transizione separatamente dalle strutture degli stati : hai una tabella che descrive quando passare da uno stato all'altro . Devi solo leggerlo per capire cosa sta succedendo nella macchina a stati.

L'altro vantaggio è che è stato testato da diverse aziende anche in software integrati con software ad alte prestazioni (vedere la mailing list boost per i dettagli). Poiché l'implementazione è già presente, potrebbe essere una buona scelta se hai bisogno di un'implementazione della macchina a stati generica che funzioni solo (tm).

Supporta anche stati ortogonali (stati paralleli) e altre utili funzioni basate su UML.

Fornisce anche diversi modi per esprimere la tabella di transizione, uno sperimentale ma interessante dal punto di vista espressivo (sebbene limitato dalle attuali prestazioni del compilatore - peccato!)

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.