Módulo 3 · Aula 3.7 · O redemoinho: inimigo e vidas
| Carga horária | Dificuldade | Ferramenta | Competências |
|---|---|---|---|
| 10 h/a | ⭐⭐⭐ | GDevelop 5 (gdevelop.io) | C2, C3, C5 |
Objetivos de aprendizagem
- Mover um objeto em direção a outro usando forças.
- Diferenciar força instantânea de força permanente.
- Tirar uma vida na colisão e afastar o inimigo para não tirar várias vidas seguidas.
- Usar expressões com posição do objeto (
Jogador.X()) e a funçãomod.
Pré-requisitos
Aulas 3.5 e 3.6.
Materiais
Computador com o GDevelop; o seu projeto; ficha de teste com jogadores do Módulo 2.
Conceitos
Força. Um empurrão com direção e velocidade em pixels por segundo. A ação Adicionar uma força para se mover em direção a uma posição empurra o objeto para um ponto.
Instantânea ou permanente. Força instantânea vale só naquele quadro. Como o evento roda em todo quadro, o redemoinho recebe um empurrão novo a cada quadro, sempre apontando para onde o jogador está agora. Força permanente ficaria somando e o redemoinho sairia voando.
Perseguidor que acelera. A velocidade é 60 + TimerElapsedTime("Tempo") * 1.5: começa em 60 px/s e ganha 1,5 px/s a cada segundo. No fim dos 60 s chega a 150, ainda menor que os 200 do jogador. Fugir é sempre possível, mas fica mais difícil. É a curva de dificuldade do Módulo 2 em forma de conta.
Invencibilidade pelo afastamento. A colisão é verdadeira em todo quadro enquanto os dois se encostam. Se não fizermos nada, o jogador perde uma vida a cada 1/60 de segundo. Solução do jogo de referência: no mesmo evento, jogar o redemoinho para longe.
mod(a, b) dá o resto da divisão de a por b. mod(Jogador.X() + 400, 760) dá um ponto sempre a cerca de 400 px do jogador na horizontal, mas dentro da tela.
Exemplos
| Jogador em X | mod(X + 400, 760) | distância |
|---|---|---|
| 100 | 500 | 400 |
| 380 | 20 | 360 |
| 700 | 340 | 360 |
Tutorial passo a passo
Parte A. O redemoinho persegue (60 min)
- O temporizador
Tempoainda não existe; para já funcionar, escreva primeiro a velocidade fixa60. - Novo evento sem condição. Ação: Redemoinho → Adicionar uma força para se mover em direção a uma posição → X:
Jogador.X()→ Y:Jogador.Y()→ velocidade:60→ força: instantânea. - Visualizar. Fuja do redemoinho.
Parte B. Perder vida (60 min)
- Novo evento. Condição: Jogador → Colisão com Redemoinho.
- Ação: Alterar valor da variável →
Vidas→ "subtrair" →1. - Visualizar. As vidas despencam até números negativos. Por quê? (Ver Conceitos.)
- Na mesma colisão, adicione a ação Redemoinho → Posição → X "definir como"
mod(Jogador.X() + 400, 760)→ Y "definir como"mod(Jogador.Y() + 250, 480) + 60. - Visualizar. Agora cada encontro tira só 1 vida.
Parte C. Testar e ajustar (60 min)
- Três colegas jogam 1 minuto cada. Anote: quantas vezes foram pegos? Acharam fácil, justo ou difícil?
- Ajuste a velocidade (40, 60, 90) e repita com outras pessoas. Registre na ficha de teste.
Imagens
- Captura real, eventos 6 e 7 do jogo de referência ("Move Redemoinho em direção a Jogador.X(); Jogador.Y() com a força instantânea de 60 + TimerElapsedTime("Tempo") * 1.5 pixels" e a colisão com as três ações):
recursos/imagens/gdevelop/captura-eventos-parte2.png
.
Indicação da interface
| Item | Onde fica |
|---|---|
| Ação de força | janela de ações, objeto Redemoinho, grupo de movimento com forças (ou pesquisar "força") |
| Escolha instantânea / permanente | último campo da ação de força |
| Ação Posição | objeto Redemoinho, grupo de posição |
O código completo
Comentário: O redemoinho persegue o sertanejo e fica mais rápido com o tempo.
Condição: (nenhuma)
Ação: Move Redemoinho em direção a Jogador.X(); Jogador.Y()
com a força instantânea de 60 + TimerElapsedTime("Tempo") * 1.5 pixels
Comentário: Redemoinho pegou: perde 1 vida e o redemoinho é jogado para longe.
Condição: Jogador está em colisão com Redemoinho
Ações: Alterar a variável Vidas: subtrair 1
Altere a posição de Redemoinho: definir como mod(Jogador.X() + 400, 760) (eixo x),
definir como mod(Jogador.Y() + 250, 480) + 60 (eixo y)A velocidade com TimerElapsedTime funciona depois da Aula 3.8, quando o temporizador Tempo é ligado no começo da cena. Antes disso, use 60.
Explicação do código
- O redemoinho mira no canto de cima à esquerda do jogador (
X(),Y()), e não no centro. A diferença é pequena e não atrapalha. - A ordem das ações da colisão importa pouco aqui, mas é bom tirar a vida antes de mover: quem lê entende a causa antes do efeito.
- O teste automático do jogo de referência confere que o redemoinho chega mais perto, tira exatamente 1 vida e fica a mais de 250 px depois de pegar.
Resultado esperado
O redemoinho persegue sem parar. Cada vez que encosta, tira 1 vida e reaparece longe.
Problemas comuns
| Sintoma | Causa | Solução |
|---|---|---|
| Vidas caem várias de uma vez | falta a ação de afastar | adicionar Posição na colisão |
| O redemoinho sai voando e não volta | força permanente | trocar para instantânea |
| O redemoinho é mais rápido que o jogador | velocidade acima de 200 | reduzir ou aumentar a velocidade do jogador |
| Reaparece em cima do jogador | expressão de posição errada | conferir os parênteses do mod |
Exercício guiado
Calcule a velocidade do redemoinho aos 0, 20, 40 e 60 segundos. (Resposta: 60, 90, 120, 150 px/s.)
Desafio individual
Dê 2 segundos de invencibilidade depois de perder vida: o jogador pisca (ação de opacidade ou visibilidade) e a colisão não tira vida enquanto um temporizador Invencivel for menor que 2.
Desafio avançado (opcional)
Coloque um segundo redemoinho que aparece aos 30 segundos. Os dois usam o mesmo objeto; o evento de força já vale para os dois. Teste: ficou justo?
Critérios de avaliação
- Perseguição e perda de vida funcionando.
- Registro do teste com 3 pessoas e da velocidade escolhida, com justificativa.
Checklist de conclusão
Extensão
Na física, força tem direção e intensidade, como o empurrão do redemoinho. Converse com o professor de Física sobre vetores e mostre o redemoinho como exemplo.