Máquina de estado finito em C ++

16

Então, eu li muito sobre o uso de FSMs para gerenciar o estado do jogo, coisas como o que é um FSM e o uso de uma pilha ou conjunto de estados para criar um. Eu já passei por tudo isso. Mas estou empolgado em escrever uma implementação real e bem projetada de um FSM para essa finalidade. Especificamente, como alguém resolve claramente o problema da transição entre estados, (como) um estado pode usar dados de outros estados e assim por diante. Alguém tem alguma dica sobre como projetar e escrever uma implementação em C ++, ou melhor ainda, exemplos de código?

Electro
fonte
tags editadas com base nesta discussão em meta: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

Respostas:

12

Eu escrevi um FSM baseado em um capítulo no "Massively Multiplayer Game Development", editado por Thor Alexander. Dentro, há um capítulo chamado "Máquinas de Estado Paralelo para Personagens Críveis". Isso está escrito em python, mas os conceitos são facilmente traduzíveis em C ++. Eu recomendo verificar isso, mesmo que seja sobre estados de personagem, não sobre jogo.

O que eu criei está aqui: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager procure no StateManager para obter detalhes da implementação, mas basicamente você tem 'estados base' diferentes. usar. Então, a partir daí, você tem os estados específicos para os quais faz a transição como personagem; portanto, cada estado é uma classe. Em seguida, você verifica se pode fazer a transição de um estado para outro e, em seguida, ao pressionar 'enter', você também pode fazer coisas como colocar eventos depois de passar para um estado. Descobri que isso funcionou muito bem para o jogo até agora.

O que eu implementei é o que o livro chama de máquina de estado paralelo, essencial para vários fsm trabalharem juntos. Nesse caso, você pode fazer a transição para um estado, que bloqueia todos os outros estados (por exemplo: CreatureState_Dead). Não vou detalhar muito mais, pois acho que isso realmente não ajudaria, mas se você quiser, posso elaborar.

Kyle C
fonte
1
Parece que o código foi movido para: github.com/swganh/mmoserver/tree/master/src/ZoneServer/…
DK_
URL corrigida: StateManager.cpp StateManager.h
Higor E.
8

A programação da IA ​​do jogo por exemplo (http://www.ai-junkie.com/books/toc_pgaibe.html) possui um exemplo de implementação bastante simples e que lida apenas com o básico. As transições são tratadas em uma única chamada de método (primeiro Enter (), depois Execute () a cada atualização, Exit () ao fazer a transição)> Não sei o que você precisa além disso. Eu implementaria transições mais complicadas como estados próprios que são projetados apenas para executar uma vez e passar para o próximo estado em sequência.

Vou dar uma facada e presumir que você esteja procurando FSMs para IA; se assim for, recomendo que você dê uma olhada nas árvores de comportamento. O AIGameDev tem ótimos artigos.

michael.bartnett
fonte
1
Esse exemplo também está disponível em seu site: ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon
5

Se a mágica do modelo C ++ e os longos tempos de compilação potenciais não forem um problema para você e você já tiver o Boost instalado para trabalhar :

O Boost agora possui uma biblioteca de metadados-máquinas eficiente ( em velocidade e tamanho ) que tem a vantagem de permitir que você defina a tabela de transição separadamente das estruturas de estados : você possui uma tabela que descreve quando ir de qual estado para outro estado . Você só precisa ler para entender o que está acontecendo na máquina de estado.

A outra vantagem é que ele foi testado por várias empresas, mesmo em softwares incorporados com software de alto desempenho (consulte a lista de emails de aumento para obter detalhes). Como a implementação já está lá, pode ser uma boa opção se você precisar de uma implementação genérica de máquina de estado que Just Works (tm).

Ele também suporta estados ortogonais (estados paralelos) e outros recursos úteis baseados em UML.

Ele também fornece várias maneiras de expressar a tabela de transição, uma sendo experimental, mas interessante no lado da expressividade (embora limitada pelo desempenho atual do compilador - que pena!)

Klaim
fonte