Inteligência de inimigos: perseguição, patrulha e máquinas de estado
Um inimigo que só anda em linha reta é entediante. O que torna um adversário interessante é o comportamento: ele patrulha, percebe o jogador, persegue, talvez desista e volte ao posto. A boa notícia é que “inteligência” em jogos quase nunca é complicada — é um punhado de condicionais bem organizadas.
Patrulha: ir e voltar
O comportamento mais básico é patrulhar entre dois pontos. Uma variável local direção (1 ou -1) controla o sentido, e o inimigo inverte ao chegar nos limites:
sempre:
adicione (velocidade × direção) a x
se posição x > limiteDireito: mude direção para -1
se posição x < limiteEsquerdo: mude direção para 1Inverter a direção também é o momento de espelhar a fantasia com “aponte para a direção 90/-90” no estilo de rotação esquerda-direita.
Detecção: percebendo o jogador
O reporter “distância até [ator]” é o sentido do inimigo. Compare com um raio de detecção para decidir se ele “viu” o jogador:
se (distância até Jogador) < 150:
// o jogador entrou no campo de visão
mude estado para "perseguindo"
senão:
mude estado para "patrulhando"Para um campo de visão direcional (só enxerga para a frente), combine a distância com uma comparação entre a posição X do jogador e a direção do inimigo. Assim dá para passar por trás sem ser visto.
Perseguição
Perseguir é mover-se em direção ao jogador. A forma mais suave usa a diferença de posições, como vimos no tutorial de movimento:
mude alvoX para (atributo x de Jogador)
se alvoX > posição x: adicione velocidadePerseguicao a x
se alvoX < posição x: adicione (-velocidadePerseguicao) a xDeixe a velocidade de perseguição um pouco maior que a de patrulha — a aceleração comunica ao jogador que o inimigo o detectou, criando tensão.
Máquinas de estado
Quando o inimigo tem vários comportamentos (patrulhar, perseguir, atacar, recuar), organize tudo com uma variável estado e um “Se” para cada valor. Isso é uma máquina de estados — o padrão que a indústria inteira usa para IA de jogos:
sempre:
se estado = "patrulhando": ... // anda ida e volta; vê o jogador → "perseguindo"
se estado = "perseguindo": ... // corre até o jogador; perto demais → "atacando"
se estado = "atacando": ... // golpeia; jogador fugiu → "patrulhando"Cada estado faz uma coisa e decide para qual estado transicionar. Adicionar um comportamento novo é adicionar um “Se” — a complexidade cresce de forma controlada, sem virar um emaranhado de condições.
Toques finais
- ▸Use clones para popular a fase com vários inimigos que compartilham os mesmos scripts mas têm estado próprio.
- ▸Adicione um pequeno atraso aleatório nas decisões para os inimigos não se moverem como um bloco sincronizado.
- ▸Avise o jogador: um balão de “!” ou uma mudança de cor ao detectar deixa o comportamento legível e justo.
Pronto para colocar em prática?
Abrir o editor