Cave: Guia de Introdução
Máquinas de Estado Hierárquicas
Lesson 17 of 19 • 25 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
À medida que seu gameplay cresce, você eventualmente precisará de objetos que se comportem de forma diferente dependendo do que estão fazendo no momento. Um inimigo pode estar ocioso, patrulhando, perseguindo, atacando, atordoado ou morto. Uma porta pode estar fechada, abrindo, aberta ou trancada. Uma luta contra boss pode passar por várias fases.
É aqui que as Máquinas de Estado se tornam úteis.

Na imagem acima, você pode ver o inimigo padrão que o Crave cria para o novo projeto, com sua Máquina de Estado aberta ao lado direito. Estamos dentro do estado "wander" que possui estados internos, como o "random selector" (o estado inicial, representado pela cor verde), o "go to random" e o "idle". Você pode ver as transições entre os estados representadas pelas setas, e que cada estado pode ter sua própria lógica, seja em Python, como mostrado na imagem, ou em logic bricks.
Uma máquina de estados ajuda a organizar o comportamento em estados claros ao invés de escrever um grande script cheio de condições não relacionadas.
Nesta lição, você aprenderá:
- O que é um Estado.
- O que é uma Transição.
- Por que máquinas de estado hierárquicas são úteis.
- Como o Componente de Máquina de Estado do Cave se encaixa em uma entidade.
- Como funcionam
On Enter,On UpdateeOn Exit. - Como Python e Logic Bricks podem ser usados dentro de estados e transições.
O objetivo é entender primeiro o modelo mental. Depois que isso fizer sentido, o editor fica muito mais fácil de usar.
O Que É Um Estado?
Um estado descreve o que um objeto está fazendo no momento.

Por exemplo, um inimigo pode ter estes estados:
IdlePatrolChaseAttackDead
Normalmente, apenas um desses estados deve controlar o inimigo por vez. Se o inimigo estiver em Patrol, ele não deve também executar o comportamento de ataque. Se estiver em Dead, não deve continuar perseguindo o jogador.
Isso facilita raciocinar sobre o gameplay porque cada estado tem uma responsabilidade clara.
| Estado | O Que Pode Fazer |
|---|---|
Idle |
Ficar parado e esperar. |
Patrol |
Mover-se entre pontos. |
Chase |
Mover-se em direção ao jogador. |
Attack |
Executar uma animação de ataque e causar dano. |
Dead |
Desabilitar movimento e tocar animação de morte. |
Ao invés de perguntar "o que o inimigo deve fazer neste frame?" em um script enorme, você pode perguntar "em qual estado o inimigo está atualmente?"
O Que É Uma Transição?
Uma transição é a regra que move a máquina de estados de um estado para outro.

Por exemplo:
- De
IdleparaPatrolquando o inimigo deve começar a se mover, após um temporizador. - De
PatrolparaChasequando o jogador é detectado. - De
ChaseparaAttackquando o inimigo está próximo o suficiente. - De
AttackparaChasequando o ataque termina. - De qualquer estado para
Deadquando a vida chega a zero.
A transição não é o comportamento em si. É a decisão que diz "agora devemos mudar de estado."
Essa separação é importante. O estado Attack pode focar em atacar, enquanto a transição decide quando é hora de entrar ou sair desse estado.
Por Que Máquinas de Estado Hierárquicas Ajudam
O Cave usa uma abordagem de máquinas de estado hierárquicas. Isso significa que estados podem estar organizados dentro de outros estados. Isso é útil porque muitos comportamentos compartilham uma ideia pai comum.
Por exemplo, um inimigo pode ser organizado assim:
Alive
Idle
Patrol
Chase
Attack
Dead
Os estados Idle, Patrol, Chase e Attack pertencem ao estado mais amplo Alive. Isso torna a estrutura mais fácil de entender e pode ajudar a evitar a repetição da mesma lógica em vários lugares.
Para um projeto iniciante, você pode começar com uma máquina de estado simples e plana. Mas conforme o gameplay fica mais complexo, a hierarquia ajuda a manter a lógica limpa.
O Componente de Máquina de Estado
Para usar uma máquina de estados em uma cena, uma entidade precisa de um Componente de Máquina de Estado.
O componente conecta a entidade a um asset de Máquina de Estado. O asset define os estados, transições e lógica, enquanto o componente executa essa lógica na entidade durante o gameplay.
Isso é semelhante a outros sistemas do Cave:
| Asset | Componente |
|---|---|
| Python Script | Componente Python o executa. |
| Animation | Componente de Animação a reproduz. |
| State Machine | Componente de Máquina de Estado a executa. |
Na prática, isso significa que sua entidade inimiga pode ter um Componente de Máquina de Estado, e esse componente pode executar uma máquina de estado de IA inimiga.
Um asset de máquina de estado pode ter propriedades, como você pode ver indo na aba de propriedades, e essas propriedades podem ser alteradas localmente no componente da máquina de estado, permitindo criar máquinas de estado modulares que têm configurações diferentes para vários tipos de entidades.
Eventos de Estado
Cada estado pode reagir a três momentos importantes:
| Evento | Quando Executa | Uso Comum |
|---|---|---|
On Enter |
Quando o estado começa. | Resetar temporizadores, inicializar variáveis, tocar animação, escolher um alvo. |
On Update |
Enquanto o estado está ativo. | Mover, verificar distâncias, atualizar temporizadores. |
On Exit |
Ao sair do estado. | Parar efeitos, limpar valores temporários. |
Por exemplo, um estado Attack pode funcionar assim:
On Enter: tocar animação de ataque.On Update: esperar o momento do golpe ou callback da animação.On Exit: limpar a flag de ataque.
Isso faz com que cada estado pareça um pequeno comportamento auto-contido.
Python Dentro dos Estados
Máquinas de estado podem usar Python para lógica.
Dentro do código Python de cada Estado, o Cave fornece variáveis úteis como entity e scene, para que o estado possa controlar a entidade que possui o Componente da Máquina de Estado.
Por exemplo, um estado poderia tocar um som quando iniciado:
cave.playSound("Enemy Alert", volume=0.8)
Ou ele poderia ler uma propriedade da entidade:
health = entity.properties.get("health", 100)
Isso mantém a lógica do estado próxima do comportamento a que pertence.
Python Dentro das Transições
Transições também podem usar Python. Para a lógica em Python nas transições, o Cave usa uma variável chamada result. Se result se tornar True, a transição pode ocorrer. Por exemplo, uma transição para o estado Dead pode checar a vida assim:
health = entity.properties.get("health", 100)
result = health <= 0
Uma transição de Chase para Attack poderia checar distância se seu script ou propriedades do inimigo fornecem esse valor:
player = scene.get("Player")
playerPos = player.getTransform().getWorldPosition()
entityPos = entity.getTransform().getWorldPosition()
distanceToPlayer = (playerPos - entityPos).length()
result = distanceToPlayer < 2.0
Os dados exatos dependem do seu jogo, mas a ideia é sempre a mesma: a transição decide se é hora de mudar de um estado para outro.
DICA: Durante uma transição, todas as variáveis locais definidas no estado de onde a transição está vindo estão disponíveis para você. Então, no exemplo anterior, onde calculamos a distância entre a entidade e o jogador, poderíamos armazenar o transform do jogador e o transform da entidade em duas variáveis no evento on-enter do estado de onde essa transição vem, para economizar alguns recursos, já que esses dados ficariam em cache e não precisaríamos recuperá-los a cada frame.
Logic Bricks Dentro das Máquinas de Estado
Máquinas de estado também podem usar Logic Bricks.
Isso é útil quando você deseja construir comportamento visualmente ao invés de escrever código Python. Para muitas tarefas de gameplay, os Logic Bricks são uma forma bem acessível de conectar eventos, condições e ações.
Eles funcionam exatamente da mesma forma explicada acima para o código Python dentro do estado ou para uma transição. Os Logic Bricks do Estado e os Logic Bricks da Transição já estão inicializados com os bricks que você precisa para começar.
Você pode misturar Python e Logic Bricks dependendo do que parecer mais claro para o comportamento que está construindo. Se um Estado ou Transição tiver ambos, então ambos serão executados e a transição ocorrerá se um OU o outro acontecer.
Quando Usar uma Máquina de Estado
Use uma máquina de estado quando um objeto tiver modos claros de comportamento.
Bons exemplos incluem:
- IA inimiga.
- Fases de boss.
- Portas e objetos interativos.
- Fluxo de missão ou quest.
- Progressão de cutscenes.
- Estados de habilidades de personagem.
Você pode não precisar de uma máquina de estado para objetos muito simples de uma ação só. Se um item pego apenas toca um som e desaparece, um pequeno script Python ou configuração de Logic Bricks pode ser suficiente.
O Que Você Deve Lembrar
Uma máquina de estado organiza o gameplay em estados e transições.
Estados descrevem o que está acontecendo no momento. Transições decidem quando trocar para outro estado. On Enter, On Update e On Exit ajudam a manter cada estado focado e legível.
Para comportamentos simples, um script pode ser suficiente. Para comportamentos com múltiplos modos, uma máquina de estado normalmente torna a lógica mais fácil de entender e expandir.