Módulo 6 · Aula 6.4 · Achar o caminho: Personagem de caminho
| Carga horária | Dificuldade | Ferramenta | Competências |
|---|---|---|---|
| 8 h/a | ⭐⭐⭐ | GDevelop 5 | C2, C5 |
Objetivos de aprendizagem
- Explicar por que "andar em linha reta até o jogador" não funciona com obstáculos.
- Usar os comportamentos Personagem de caminho (no inimigo) e Obstáculo para a busca de caminho (nas cercas).
- Mandar o inimigo para um ponto com Mover para uma posição e saber quando ele chegou.
- Recalcular o caminho de tempos em tempos, não a cada quadro.
- Impedir que o jogador atravesse as cercas.
Pré-requisitos
Aula 6.3.
Materiais
Computador com o GDevelop; o Cajueiral.
Conceitos
Linha reta não basta. Na Aula 3.7 o redemoinho ia direto até o jogador com uma força. Com uma cerca no meio, ele ficaria preso nela. É preciso um caminho que dê a volta.
Grade virtual. O comportamento divide a cena em quadradinhos (células) e procura uma sequência de células livres do inimigo até o destino. As células ocupadas por objetos com Obstáculo para a busca de caminho ficam proibidas.
Personagem de caminho (baseado em grade). Comportamento do inimigo. Propriedades usadas no Cajueiral:
| Propriedade (como aparece) | Valor | Por quê |
|---|---|---|
| Largura da célula / Altura da célula | 16 | células menores dão caminhos mais justos |
| Permitir diagonais | não | sem diagonais o cão não "corta a ponta" das cercas (ver a história abaixo) |
| Rotacionar objeto | não | o cão é visto de lado; virar o desenho é feito por evento |
| Velocidade máxima | trocada por evento | patrulha e perseguição têm velocidades diferentes |
Obstáculo para a busca de caminho. Comportamento das cercas, com Obstáculo impenetrável marcado.
Ações e condições. Mover para uma posição (aparece como "Mover Cao para X;Y") calcula e começa o caminho. Destino alcançado ("Cao chegou ao seu destino") avisa a chegada. Trajetória encontrada diz se existe caminho.
Recalcular com calma. Perseguindo, o jogador se mexe; o caminho precisa ser refeito. Fazer isso todo quadro (60 vezes por segundo) gasta processamento à toa. O Cajueiral refaz a cada 0,4 s, com o temporizador "Rota".
A história da diagonal (aconteceu de verdade). Na primeira versão o cão podia andar na diagonal. O teste automático mediu a posição dele contornando uma cerca: ao fazer a curva, o desenho do cão passava por cima da ponta da cerca. Com Permitir diagonais desligado, o caminho vira "em L" e o cão contorna sem raspar. O teste passou a conferir isso.
O jogador também não atravessa. O jogador usa Movimento em TopDown, que não conhece cercas. Um evento resolve: colisão com Cerca → ação Separa objetos ("Mova Jogador para longe de Cerca").
Exemplos
| Situação | Sem caminho | Com caminho |
|---|---|---|
| jogador atrás de uma cerca | cão encosta na cerca e para | cão dá a volta pela ponta |
| jogador num corredor | cão tenta atravessar a parede | cão entra pela abertura |
Tutorial passo a passo
Parte A. Obstáculos (30 min)
- No objeto
Cerca: Adicionar um comportamento → Obstáculo para a busca de caminho (baseado em grade). - No
Cao: Personagem de caminho (baseado em grade). Ajuste células 16, diagonais desligadas, rotacionar desligado.
Parte B. Ir até um ponto (60 min)
- Teste simples: No começo da cena → Mover para uma posição o
CaoatéJogador.X(),Jogador.Y(). - Visualizar com o jogador atrás de uma cerca. O cão dá a volta?
- Troque para o destino da patrulha (a conta da Aula 6.3).
Parte C. Perseguir com calma (60 min)
- Temporizador de cena
"Rota"iniciado no começo da cena. - Evento:
Estado="persegue"e"Rota"≥ 0,4 → Mover para uma posição até o jogador. - Evento logo abaixo:
"Rota"≥ 0,4 → reiniciar"Rota".
Parte D. Diagonais e cerca do jogador (60 min)
- Experimento: ligue Permitir diagonais e observe o cão contornando a ponta de uma cerca bem de perto. Desligue e compare. Registre no diário.
- Evento: Colisão Jogador com Cerca → Separa objetos Jogador de Cerca. Tente atravessar uma cerca com as setas.
Parte E. Ver o caminho (30 min)
- Desafio de depuração: mostre num texto provisório se a Trajetória encontrada é verdadeira. Coloque o jogador num lugar fechado por cercas: o que acontece?
Imagens
- Captura real, grupo "Jogador" com Separa objetos e o começo da fase com "Mover Cao para ...":
recursos/imagens/gdevelop/captura-cajueiral-regras-1.png
. - Captura real, recalcular a cada 0,4 s:
recursos/imagens/gdevelop/captura-cajueiral-regras-2.png
.
Indicação da interface
| Item | Onde fica |
|---|---|
| Comportamentos de caminho | Adicionar um comportamento; pesquise "caminho" |
| Propriedades do comportamento | aba Comportamentos do objeto |
| Mover para uma posição, Destino alcançado, Trajetória encontrada | ações e condições do objeto Cao, grupo do comportamento de caminho |
| Separa objetos | ações do objeto Jogador, grupo de posição (pesquise "separa") |
O código completo
Grupo "Jogador" (parte):
Comentário: A cerca não deixa o jogador passar: se encostou, é empurrado para fora.
Jogador está em colisão com Cerca → Mova Jogador para longe de Cerca (somente Jogador será movido)
Grupo "Cão: máquina de estados" (parte):
Comentário: Perseguindo: recalcula o caminho até o jogador a cada 0.4 s (não precisa ser todo quadro).
A variável Estado de Cao = "persegue"
O temporizador "Rota" ≥ 0.4 segundos → Mover Cao para Jogador.X();Jogador.Y()
O temporizador "Rota" ≥ 0.4 segundos → Iniciar (ou resetar) o temporizador "Rota"Explicação do código
- O reinício do temporizador fica num evento separado e depois do "Mover". Assim ele é reiniciado uma vez só, para a cena toda, e todos os cães que estão perseguindo recalculam no mesmo quadro, antes do reinício.
- O destino é a posição do canto do jogador (
Jogador.X(),Jogador.Y()). É perto o bastante para a colisão acontecer.
Resultado esperado (testado)
Teste automático no Cajueiral: com o cão à direita de uma cerca e o jogador à esquerda, a perseguição encontrou um caminho de 5 pontos passando por baixo da ponta da cerca (y ≥ 384), e o desenho do cão não se sobrepôs à cerca em nenhum momento (tolerância de 6 px); o jogador segurando a seta contra a cerca parou antes dela.
Problemas comuns
| Sintoma | Causa | Solução |
|---|---|---|
| O cão atravessa a cerca | falta Obstáculo na cerca | adicionar o comportamento na cerca |
| O cão raspa na ponta das cercas | diagonais permitidas | desligar Permitir diagonais |
| O cão não sai do lugar | nenhum caminho possível (destino dentro de obstáculo ou fechado) | conferir Trajetória encontrada; mudar o destino |
| O jogo fica lento com muitos inimigos | recalculando todo quadro | temporizador de 0,3 a 0,5 s |
| O cão gira de cabeça para baixo | Rotacionar objeto ligado | desligar |
| Teste "teletransportando" o cão não funciona | o comportamento recoloca o objeto no caminho dele | depois de mudar a posição, mandar um Mover para uma posição novo |
Exercício guiado
Uma cena de 800 × 600 com células de 16 × 16 tem quantas células? E com células de 32? (Resposta: 50 × 37,5, então cerca de 1.900; com 32, 25 × 19, uns 475. Células maiores calculam mais rápido, mas o caminho fica mais "quadrado".)
Desafio individual
Faça o cão desistir também se não existir caminho até o jogador (condição Trajetória encontrada invertida).
Desafio avançado (opcional)
Experimente o comportamento de navegação "baseado em navmesh", que aparece na mesma lista. Compare com o de grade e registre diferenças. Este caminho não foi testado no curso.
Critérios de avaliação
- Cão contornando cercas para perseguir e voltar.
- Recalcular com temporizador.
- Jogador sem atravessar cercas.
Checklist de conclusão
Extensão
Geografia: aplicativos de mapa também procuram caminhos. Peça a um aplicativo a rota a pé da escola até a praça e compare com a rota que você faria. Por que podem ser diferentes?