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 sua jogabilidade cresce, você eventualmente precisará de objetos que se comportem de maneira diferente, dependendo do que estão fazendo atualmente. Um inimigo pode estar parado, patrulhando, perseguindo, atacando, atordoado ou morto. Uma porta pode estar fechada, abrindo, aberta ou trancada. Uma luta contra um chefe pode passar por várias fases.

É aqui que as Máquinas de Estado se tornam úteis.

image.png

Na imagem acima, você pode ver o inimigo padrão que o Cave cria para o novo projeto, com sua Máquina de Estado aberta na parte direita. Estamos dentro do estado "wander" que possui estados internos, como "random selector" (o estado inicial, representado pela cor verde), "go to random" e "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 lógica bricks.

Uma máquina de estado ajuda a organizar o comportamento em estados claros, em vez de escrever um grande script cheio de condições não relacionadas.

Nesta lição, você irá 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 On Enter, On Update, e On Exit funcionam.
  • Como Python e Lógica Bricks podem ser usados dentro de estados e transições.

O objetivo é entender o modelo mental primeiro. Uma vez que isso faça sentido, o editor se torna muito mais fácil de usar.

O que é um Estado?

Um estado descreve o que um objeto está fazendo atualmente.

image.png

Por exemplo, um inimigo pode ter estes estados:

  • Idle
  • Patrol
  • Chase
  • Attack
  • Dead

Apenas um desses estados deve controlar o inimigo ao mesmo tempo. Se o inimigo está em Patrol, ele não deve também estar executando o comportamento de ataque. Se ele está em Dead, não deve continuar perseguindo o jogador.

Isso torna a jogabilidade mais fácil de entender, pois cada estado tem um trabalho claro.

Estado O que pode fazer
Idle Ficar parado e esperar.
Patrol Mover entre pontos.
Chase Mover em direção ao jogador.
Attack Tocar uma animação de ataque e causar dano.
Dead Desabilitar movimento e tocar uma animação de morte.

Em vez de perguntar "o que o inimigo deve fazer neste instante?" a partir de um grande script, 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 estado de um estado para outro.

image.png

Por exemplo:

  • Idle para Patrol quando o inimigo deve começar a se mover, após um temporizador.
  • Patrol para Chase quando o jogador é detectado.
  • Chase para Attack quando o inimigo está perto o suficiente.
  • Attack para Chase quando o ataque termina.
  • Qualquer estado para Dead quando a saúde 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 se concentrar em atacar, enquanto a transição decide quando é hora de entrar ou sair desse estado.

Por que as Máquinas de Estado Hierárquicas Ajudam

O Cave usa uma abordagem de máquina de estado hierárquica. Isso significa que os estados podem ser organizados dentro de outros estados. Isso é útil porque muitos comportamentos compartilham uma ideia comum de pai.

Por exemplo, um inimigo poderia 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 você a evitar repetir a 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 à medida que sua jogabilidade fica mais complexa, a hierarquia ajuda a manter a lógica limpa.

O Componente de Máquina de Estado

Para usar uma máquina de estado em uma cena, uma entidade precisa de um Componente de Máquina de Estado.

O componente conecta a entidade a um ativo de Máquina de Estado. O ativo define os estados, transições e lógica, enquanto o componente executa essa lógica na entidade durante a jogabilidade.

Isso é semelhante a outros sistemas do Cave:

Ativo Componente
Python Script Componente Python o executa.
Animação Componente de Animação a reproduz.
Máquina de Estado 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 AI de inimigo.

Um ativo de máquina de estado pode ter propriedades, como você pode ver indo até a aba de propriedades, e essas propriedades podem ser alteradas localmente no componente de máquina de estado, permitindo que você crie máquinas de estado modulares que têm configurações diferentes em diferentes tipos de entidades.

Eventos de Estado

Cada estado pode reagir a três momentos importantes:

Evento Quando é executado Uso comum
On Enter Quando o estado começa. Reiniciar temporizadores, inicializar variáveis, tocar uma 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 poderia funcionar assim:

  • On Enter: tocar a animação de ataque.
  • On Update: esperar pelo 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 autocontido.

Python Dentro dos Estados

Máquinas de estado podem usar Python para lógica.

Dentro de cada código Python do Estado, o Cave fornece variáveis úteis como entity e scene, para que o estado possa controlar a entidade que possui o Componente de Máquina de Estado.

Por exemplo, um estado poderia tocar um som ao ser ativado:

cave.playSound("Enemy Alert", volume=0.8)

Ou poderia ler uma propriedade da entidade:

health = entity.properties.get("health", 100)

Isso mantém a lógica do estado próxima ao comportamento a que pertence.

Python Dentro das Transições

Transições também podem usar Python. Para a lógica Python da transição, o Cave utiliza uma variável chamada result. Se result se tornar True, a transição pode acontecer. Por exemplo, uma transição para um estado Dead poderia verificar a saúde assim:

health = entity.properties.get("health", 100)
result = health <= 0

Uma transição de Chase para Attack poderia verificar a distância se seu script ou propriedades do inimigo fornecerem 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 mover 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 a transformação do jogador e a transformação da entidade em duas variáveis no estado de entrada de onde esta transição está vindo para economizar um pouco de recursos, uma vez que estaria em cache e não precisaríamos mais obter esses dados a cada frame.

Lógica Bricks Dentro das Máquinas de Estado

Máquinas de estado também podem usar Lógica Bricks.

Isso é útil quando você deseja construir um comportamento visualmente em vez de escrever código Python. Para muitas tarefas de jogabilidade, Lógica Bricks são uma maneira muito acessível de conectar eventos, condições e ações.

Elas funcionam da mesma forma que foi explicado acima para o código Python dentro do estado ou para uma transição. Os Lógica Bricks do Estado e os Lógica Bricks da Transição já estão inicializados com os blocos que você precisa para começar.

Você pode misturar Python e Lógica Bricks dependendo do que parecer mais claro para o comportamento que você 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 de comportamento claros.

Bons exemplos incluem:

  • IA de inimigo.
  • Fases de chefe.
  • Portas e objetos interativos.
  • Fluxo de missão ou quest.
  • Progresso de cutscene.
  • Estados de habilidade de personagem.

Você pode não precisar de uma máquina de estado para objetos pequenos de uma única ação. Se um coletável toca apenas um som e desaparece, um pequeno script em Python ou configuração de Lógica Brick pode ser suficiente.

O que você deve lembrar

Uma máquina de estado organiza a jogabilidade em estados e transições.

Os estados descrevem o que está acontecendo atualmente. As transições decidem quando mudar para algo diferente. 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 geralmente torna a lógica mais fácil de entender e mais fácil de expandir.