Módulo 6 · Aula 6.3 · O cão de guarda: máquina de estados
| Carga horária | Dificuldade | Ferramenta | Competências |
|---|---|---|---|
| 10 h/a | ⭐⭐⭐ | papel e GDevelop 5 | C1, C2 |
Objetivos de aprendizagem
- Desenhar uma máquina de estados (bolinhas e setas) para um inimigo.
- Guardar o estado de cada inimigo numa variável de objeto de texto.
- Programar cada seta como um evento: estado atual + condição → novo estado.
- Dar retorno ao jogador quando o estado muda (desenho, som, velocidade).
Pré-requisitos
Aulas 4.4 (variável de objeto) e 4.6 (estados do jogo).
Materiais
Papel e lápis; o Cajueiral aberto no GDevelop.
Conceitos
Máquina de estados. Um jeito de descrever comportamento: o inimigo está sempre em um estado, e só muda quando uma condição acontece. Na Aula 4.6 o jogo tinha estados (jogando, pausado). Agora cada cão tem os seus.
Os três estados do cão:
jogador a menos de 150 px
┌──────────┐ ─────────────────────────► ┌──────────┐
│ patrulha │ │ persegue │
└──────────┘ ◄──┐ ┌── └──────────┘
▲ │ jogador a menos │ jogador a mais
│ │ de 150 px │ de 260 px
│ │ ▼
│ ┌──────────┐ ◄───────────┘
└───── │ volta │
chegou ao └──────────┘
posto| De | Para | Quando | O que muda |
|---|---|---|---|
| patrulha ou volta | persegue | jogador a menos de 150 px | desenho Bravo, velocidade de perseguição, latido |
| persegue | volta | jogador a mais de 260 px | desenho Calmo, velocidade de patrulha, destino = posto |
| volta | patrulha | chegou ao posto | segue patrulhando |
Por que 150 para ver e 260 para desistir? Se fosse o mesmo número, o cão ficaria trocando de estado sem parar quando o jogador estivesse bem na fronteira. A diferença (chamada histerese) dá uma "folga".
Variável de objeto de texto. Estado vale "patrulha", "persegue" ou "volta". Cada cão tem a sua: um pode perseguir enquanto o outro patrulha.
Patrulha com uma conta. O cão vai e volta entre o ponto 1 (posto) e o ponto 2. Cada cão guarda os pontos em variáveis da instância (P1X, P1Y, P2X, P2Y) e uma variável Ida (0 = indo para o posto, 1 = indo para o ponto 2). O destino é:
P1X + Ida × (P2X − P1X)
Com Ida = 0 dá P1X; com Ida = 1 dá P2X. Ao chegar, Ida vira 1 − Ida. Um evento só, sem o problema do liga-desliga da Aula 4.6.
Retorno ao jogador. Mudar de estado sem mostrar nada é injusto: o jogador precisa perceber que foi visto. O cão troca para o desenho Bravo (orelhas em pé, olho vermelho) e late.
Exemplos
| Jogo | Estados de um inimigo |
|---|---|
| O Cajueiral | patrulha, persegue, volta |
| jogos de furtividade | patrulha, desconfiado, alerta, procurando |
| jogos de fantasma em labirinto | caçando, espalhando, assustado, voltando para casa |
Tutorial passo a passo
Parte A. No papel (60 min)
- Desenhe a máquina de estados do inimigo do seu Projeto 5, com bolinhas, setas e a condição em cada seta.
- Para cada estado, escreva o que o inimigo faz (velocidade, desenho, som).
Parte B. Variáveis (40 min)
- No objeto
Cao, aba Variáveis:Estado(texto,"patrulha"),Ida(número, 1),P1X,P1Y,P2X,P2Y(números),UltimoX(número). - Em cada instância de cão na cena, mude
P1X... para os pontos daquela instância (variáveis da instância, no painel de propriedades da instância).
Parte C. As setas (180 min)
- Para cada linha da tabela de transições, um evento com duas condições: Valor da variável do objeto
Estado(o estado de origem) e a condição da seta (Distância entre dois objetos ou Destino alcançado, Aula 6.4). - Nas ações: Alterar valor da variável do objeto
Estadopara o novo estado, mais o que muda (animação, velocidade, som, destino). - Para "patrulha ou volta → persegue", use
Estado≠"persegue": uma condição só cobre os dois estados. - Para "persegue → volta", use a condição Distância entre dois objetos com 260 e invertida ("não está abaixo de 260").
Parte D. Virar o desenho (40 min)
- Último evento do grupo: compare
Cao.X()comCao.Variable(UltimoX); se diminuiu, vira; se aumentou, desvira. Depois,UltimoX=Cao.X().
Imagens
- Captura real, grupo "Cão: máquina de estados" (comentários de cada seta, condições e ações):
recursos/imagens/gdevelop/captura-cajueiral-regras-1.png
e captura-cajueiral-regras-2.png.
Indicação da interface
| Item | Onde fica |
|---|---|
| Valor da variável do objeto (texto) | condições do objeto Cao |
| Sinal ≠ | lista de sinais do teste, na mesma condição |
| Distância entre dois objetos | condições do objeto Cao, grupo de posição; aparece como "Distância de Cao a Jogador está abaixo de 150 pixels" |
| Inverter condição | menu do botão direito na condição (ou o ícone de inverter); a condição invertida aparece com um sinal vermelho |
O código completo
Comentário: Patrulha ou volta → persegue: o jogador chegou a menos de 150 px.
A variável Estado de Cao ≠ "persegue"
Distância de Cao a Jogador está abaixo de 150 pixels
→ Alterar a variável Estado de Cao: definir como "persegue"
Alterar a animação de Cao: definir como "Bravo"
Alterar a velocidade máxima no percurso de Cao: definir como VelPerseguicao
Mover Cao para Jogador.X();Jogador.Y()
Reproduzir o som sons/latido.wav, vol.: 60, loop: não
Comentário: Persegue → volta: o jogador ficou a mais de 260 px. Volta para o posto (ponto 1).
A variável Estado de Cao = "persegue"
(NÃO) Distância de Cao a Jogador está abaixo de 260 pixels
→ Alterar a variável Estado de Cao: definir como "volta"
Alterar a animação de Cao: definir como "Calmo"
Alterar a velocidade máxima no percurso de Cao: definir como VelPatrulha
Alterar a variável Ida de Cao: definir como 0
Mover Cao para Cao.Variable(P1X) + Cao.Variable(Ida) * (Cao.Variable(P2X) - Cao.Variable(P1X));
Cao.Variable(P1Y) + Cao.Variable(Ida) * (Cao.Variable(P2Y) - Cao.Variable(P1Y))
A variável Estado de Cao = "volta" + Cao chegou ao seu destino → Estado de Cao = "patrulha"
A variável Estado de Cao = "patrulha" + Cao chegou ao seu destino → Ida de Cao = 1 - Cao.Variable(Ida)
Mover Cao para (a mesma conta)
Cao.X() < Cao.Variable(UltimoX) → Virar horizontalmente Cao: sim
Cao.X() > Cao.Variable(UltimoX) → Virar horizontalmente Cao: não
(sem condição) → Alterar a variável UltimoX de Cao: definir como Cao.X()Explicação do código
- Cada evento é uma seta do desenho. Se o código e o desenho não batem, um dos dois está errado.
- A seleção de instâncias (Aula 3.4) faz cada evento valer só para os cães que cumprem as condições: com três cães, cada um segue a sua máquina.
- "Volta → patrulha" vem antes de "patrulha → próximo ponto". Quando o cão chega ao posto voltando, a primeira muda o estado e, no mesmo quadro, a segunda já manda ele para o ponto 2.
Resultado esperado (testado)
Teste automático no Cajueiral: o cão começa em patrulha; ao chegar no ponto 2 troca Ida para 0 e sobe para o posto; com o jogador a menos de 150 px passa a persegue, com animação Bravo e velocidade 110; com o jogador a mais de 260 px passa a volta, Calmo, Ida = 0; ao chegar no posto volta a patrulha; andando para a esquerda, o desenho vira.
Problemas comuns
| Sintoma | Causa | Solução |
|---|---|---|
| O cão fica "piscando" entre Bravo e Calmo | mesmo número para ver e desistir | 150 para ver, 260 para desistir |
| Todos os cães perseguem juntos | Estado criada como variável de cena | variável do objeto |
| O cão persegue e nunca desiste | condição de distância não foi invertida | inverter a de 260 |
| O cão patrulha só para um lado | Ida não troca | Ida = 1 - Cao.Variable(Ida) |
| Desenho vira sem parar | evento de UltimoX antes da comparação | atualizar UltimoX por último |
Exercício guiado
Um cão com P1X = 380, P2X = 380, P1Y = 90, P2Y = 470 e Ida = 1. Para onde ele vai? E depois de chegar? (Resposta: (380, 470); depois Ida = 0 e ele vai para (380, 90).)
Desafio individual
Acrescente um quarto estado, "farejando": quando desiste, o cão fica 2 segundos parado no último lugar onde viu o jogador antes de voltar. Desenhe primeiro a máquina nova.
Desafio avançado (opcional)
Faça um cão "medroso": se o jogador estiver carregando uma vara (item), o cão foge em vez de perseguir. Quantos estados novos precisa?
Critérios de avaliação
- Desenho da máquina de estados igual ao código.
- Três estados funcionando com retorno visual e sonoro.
Checklist de conclusão
Extensão
Desenhe a máquina de estados de algo do dia a dia: um ventilador (desligado, velocidade 1, 2, 3), uma catraca de ônibus ou um semáforo de pedestre.