Pular para o conteúdo
Jogos Digitais
Nesta página
  1. Objetivos de aprendizagem
  2. Pré-requisitos
  3. Materiais
  4. Conceitos
  5. Exemplos
  6. Tutorial passo a passo
  7. Imagens
  8. Indicação da interface
  9. O código completo
  10. Explicação do código
  11. Resultado esperado (testado)
  12. Problemas comuns
  13. Exercício guiado
  14. Desafio individual
  15. Desafio avançado (opcional)
  16. Critérios de avaliação
  17. Checklist de conclusão
  18. Extensão

Módulo 6 · Aula 6.3 · O cão de guarda: máquina de estados

Carga horáriaDificuldadeFerramentaCompetências
10 h/a⭐⭐⭐papel e GDevelop 5C1, C2

Objetivos de aprendizagem

  1. Desenhar uma máquina de estados (bolinhas e setas) para um inimigo.
  2. Guardar o estado de cada inimigo numa variável de objeto de texto.
  3. Programar cada seta como um evento: estado atual + condição → novo estado.
  4. 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
DeParaQuandoO que muda
patrulha ou voltaperseguejogador a menos de 150 pxdesenho Bravo, velocidade de perseguição, latido
perseguevoltajogador a mais de 260 pxdesenho Calmo, velocidade de patrulha, destino = posto
voltapatrulhachegou ao postosegue 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

JogoEstados de um inimigo
O Cajueiralpatrulha, persegue, volta
jogos de furtividadepatrulha, desconfiado, alerta, procurando
jogos de fantasma em labirintocaçando, espalhando, assustado, voltando para casa

Tutorial passo a passo

Parte A. No papel (60 min)

  1. Desenhe a máquina de estados do inimigo do seu Projeto 5, com bolinhas, setas e a condição em cada seta.
  2. Para cada estado, escreva o que o inimigo faz (velocidade, desenho, som).

Parte B. Variáveis (40 min)

  1. No objeto Cao, aba Variáveis: Estado (texto, "patrulha"), Ida (número, 1), P1X, P1Y, P2X, P2Y (números), UltimoX (número).
  2. 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)

  1. 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).
  2. Nas ações: Alterar valor da variável do objeto Estado para o novo estado, mais o que muda (animação, velocidade, som, destino).
  3. Para "patrulha ou volta → persegue", use Estado ≠ "persegue": uma condição só cobre os dois estados.
  4. 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)

  1. Último evento do grupo: compare Cao.X() com Cao.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

ItemOnde 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 objetoscondições do objeto Cao, grupo de posição; aparece como "Distância de Cao a Jogador está abaixo de 150 pixels"
Inverter condiçãomenu 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

SintomaCausaSolução
O cão fica "piscando" entre Bravo e Calmomesmo número para ver e desistir150 para ver, 260 para desistir
Todos os cães perseguem juntosEstado criada como variável de cenavariável do objeto
O cão persegue e nunca desistecondição de distância não foi invertidainverter a de 260
O cão patrulha só para um ladoIda não trocaIda = 1 - Cao.Variable(Ida)
Desenho vira sem pararevento de UltimoX antes da comparaçãoatualizar 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.