Módulo 3 · Aula 3.8 · Tempo, telas e recorde
| Carga horária | Dificuldade | Ferramenta | Competências |
|---|---|---|---|
| 12 h/a | ⭐⭐⭐ | GDevelop 5 (gdevelop.io) | C2, C3 |
Objetivos de aprendizagem
- Usar temporizador de cena para limitar a partida a 60 segundos.
- Criar as cenas Inicio e Fim e trocar de cena com eventos.
- Usar variáveis globais para levar a pontuação de uma cena para outra.
- Guardar o recorde da sessão.
- Evitar que um toque acidental pule a tela final.
Pré-requisitos
Aulas 3.5 a 3.7.
Materiais
Computador com o GDevelop; o seu projeto; fundo_titulo.png.
Conceitos
Temporizador de cena. Um cronômetro com nome. Iniciar (ou redefinir) um temporizador de cena zera e liga. Valor de um temporizador de cena compara quantos segundos passaram. A expressão TimerElapsedTime("Tempo") dá esse número para usar em contas.
Contagem regressiva. O placar mostra quanto falta: ceil(60 - TimerElapsedTime("Tempo")). ceil arredonda para cima (59,2 vira 60). max(0, ...) impede que apareça número negativo no último quadro.
Troca de cena. Alterar a cena fecha a cena atual e abre outra. Tudo da cena que fecha é esquecido, inclusive as variáveis de cena.
Variável global. Fica no projeto, não na cena, e sobrevive à troca de cena. No Sementes: UltimaPontuacao (os pontos da partida que acabou) e Recorde. Elas ficam em Variáveis globais, no gerenciador do projeto.
Recorde da sessão. O recorde dura enquanto o jogo estiver aberto. Fechou a janela, zera. Guardar para sempre é conteúdo do Módulo 6.
Tecla liberada e botão liberado. Usar "liberada" em vez de "pressionada" na troca de tela evita que o mesmo aperto pule duas telas.
Exemplos
| Cena | Mostra | Sai para | Quando |
|---|---|---|---|
| Inicio | título e instruções | Jogo | [Espaço] ou toque |
| Jogo | a partida | Fim | 60 s ou vidas = 0 |
| Fim | pontos e recorde | Jogo | [Espaço] ou toque, depois de 1 s |
Tutorial passo a passo
Parte A. O relógio (60 min)
- No evento No começo da cena da cena Jogo, adicione Iniciar (ou redefinir) um temporizador de cena com o nome
"Tempo"(com aspas). - Troque a velocidade do redemoinho para
60 + TimerElapsedTime("Tempo") * 1.5(Aula 3.7). - No placar, acrescente ao fim:
+ " Tempo: " + ToString(max(0, ceil(60 - TimerElapsedTime("Tempo")))).
Parte B. Variáveis globais (30 min)
- Gerenciador do projeto → Configurações do jogo → Variáveis globais. Crie
Recorde(número, 0) eUltimaPontuacao(número, 0).
Parte C. Fim da partida (60 min)
- Novo evento. Condição: Valor de um temporizador de cena →
"Tempo"→≥→60. Ações: Alterar valor da variávelUltimaPontuacao"definir como"Pontos; Alterar a cena →"Fim". - Outro evento. Condição: Valor da variável
Vidas≤0. Mesmas duas ações.
Parte D. Cena Fim (90 min)
- Gerenciador → Cenas → + (Adicionar uma cena). Nome
Fim. - Objetos:
FundoTitulo(Sprite comfundo_titulo.png), TextoFimTitulo("Fim da colheita!", 52), TextoResultado(vazio, 28), TextoJogarDeNovo("Aperte ESPAÇO ou toque para jogar de novo", 22). - Eventos da cena Fim: veja o código completo abaixo. Atenção ao subevento: a comparação do recorde fica pendurada dentro do No começo da cena.
Parte E. Cena Inicio (60 min)
- Nova cena
Inicio, comFundoTitulo,TituloeInstrucoes. - Dois eventos: Tecla liberada
"Space"→ Alterar a cena"Jogo"; Botão do mouse liberado"Left"→ Alterar a cena"Jogo". - Torne Inicio a cena inicial. A cena inicial tem uma bandeirinha ao lado do nome; passando o mouse nela aparece a dica "Essa cena irá ser usada como a cena inicial." Para mudar qual cena tem a bandeirinha, abra o menu de três pontinhos da cena Inicio e procure a opção de cena inicial.
Parte F. Teste completo (60 min)
- Jogue 3 partidas: uma até o fim do tempo, uma perdendo as vidas, uma fazendo menos pontos que o recorde. Preencha a tabela do Resultado esperado.
Imagens
- Captura real, eventos 8 e 9 da cena Jogo:
recursos/imagens/gdevelop/captura-eventos-parte2.png
. - Captura real, eventos da cena Fim:
recursos/imagens/gdevelop/captura-eventos-fim.png
. - Captura real, tela final do jogo rodando:
recursos/imagens/gdevelop/sementes-tela-fim.png
.
Indicação da interface
| Item | Onde fica |
|---|---|
| Variáveis globais | gerenciador do projeto → Configurações do jogo |
| + de nova cena (Adicionar uma cena) | gerenciador do projeto, à direita do título Cenas |
| Bandeirinha da cena inicial | ao lado do nome da cena, no gerenciador |
| Subevento | botão de adicionar subevento na barra da folha, com o evento de cima selecionado |
O código completo
Cena Inicio
Comentário: Tela inicial: espera o jogador apertar Espaço ou tocar na tela.
Condição: Tecla "Space" foi liberada Ação: Alterar para a cena "Jogo"
Condição: O toque ou o botão do mouse "Left" foi solto Ação: Alterar para a cena "Jogo"Cena Jogo (os 9 eventos do jogo de referência)
1. No começo da cena
→ Pontos: definir como 0 · Vidas: definir como 3 · Iniciar o temporizador "Tempo"
2. Toque ou botão do mouse "Left" está pressionado (Aula 3.9)
subeventos: CursorX/CursorY comparados ao centro do Jogador → simular setas
3. Jogador está se movendo → animação "Andando"
(NÃO) Jogador está se movendo → animação "Parado"
Jogador.TopDownMovement::XVelocity() < 0 → Virar horizontalmente: sim
Jogador.TopDownMovement::XVelocity() > 0 → Virar horizontalmente: não
4. Jogador está em colisão com Semente
→ Deletar Semente · Pontos: adicionar 1 · Reproduzir o som sons/coleta.wav (som: Aula 3.10)
5. O número de Semente vivendo na cena < 3
→ Criar objeto Semente na posição RandomInRange(40, 740); RandomInRange(90, 540)
6. (sem condição)
→ Move Redemoinho em direção a Jogador.X(); Jogador.Y()
com a força instantânea de 60 + TimerElapsedTime("Tempo") * 1.5
7. Jogador está em colisão com Redemoinho
→ Vidas: subtrair 1 · Reproduzir o som sons/dano.wav
→ Posição do Redemoinho: mod(Jogador.X() + 400, 760); mod(Jogador.Y() + 250, 480) + 60
8. (sem condição)
→ Texto do Placar: "Sementes: " + ToString(Pontos) + " Vidas: " + ToString(Vidas)
+ " Tempo: " + ToString(max(0, ceil(60 - TimerElapsedTime("Tempo"))))
9. O temporizador "Tempo" ≥ 60 segundos → UltimaPontuacao: definir como Pontos · Alterar para a cena "Fim"
A variável Vidas ≤ 0 → UltimaPontuacao: definir como Pontos · Alterar para a cena "Fim"Cena Fim
Comentário: Tela final: atualiza o recorde e mostra o resultado.
No começo da cena → Iniciar (ou resetar) o temporizador "Espera"
subevento: A variável UltimaPontuacao > Recorde → Recorde: definir como UltimaPontuacao
(sem condição) → Alterar o texto de Resultado: definir como
"Sementes guardadas para o inverno: " + ToString(UltimaPontuacao) + NewLine() + "Recorde: " + ToString(Recorde)
Comentário: Espera 1 segundo antes de aceitar o toque, para ninguém pular a tela sem querer.
O temporizador "Espera" ≥ 1 segundos
subevento: Tecla "Space" foi liberada → Alterar para a cena "Jogo"
subevento: O toque ou o botão do mouse "Left" foi solto → Alterar para a cena "Jogo"Arquivo pronto: ../projetos/sementes-do-sertao/sementes-do-sertao.json.
Explicação do código
- Por que guardar em
UltimaPontuacaoantes de trocar de cena? PorquePontosé da cena Jogo e some quando ela fecha. - Por que o recorde é atualizado na cena Fim, e não na Jogo? Para ficar num lugar só. As duas formas de acabar a partida (tempo e vidas) caem na mesma tela.
- Por que esperar 1 segundo? Quem está tocando a tela para fugir do redemoinho pode soltar o dedo bem na hora em que a cena Fim abre e pular o resultado sem ver.
- Por que
NewLine()? Quebra a linha dentro do texto.
Resultado esperado (testado)
O teste automático (testes/gdevelop/) conferiu no motor do GDevelop:
| Situação | Resultado |
|---|---|
| Começo | cena Inicio; [Espaço] leva para Jogo |
| Placar no começo | "Sementes: 0 Vidas: 3 Tempo: 60" |
| Perder as 3 vidas | vai para Fim; recorde = pontos da partida |
| Toque logo que o Fim abre | ignorado |
| Toque depois de 1 s | volta para Jogo com Pontos 0 e Vidas 3 |
| Tempo chega a 60 s | vai para Fim |
| Partida pior que o recorde | recorde não diminui |
Problemas comuns
| Sintoma | Causa | Solução |
|---|---|---|
| A tela final mostra 0 sempre | usou Pontos na cena Fim | usar UltimaPontuacao (global) |
| O jogo pula direto da Inicio para a Fim | usou "pressionada" e o mesmo aperto passou por duas telas | usar Tecla liberada e a espera de 1 s |
| Recorde nunca muda | a comparação não está como subevento do começo, ou está ao contrário | UltimaPontuacao > Recorde |
| O tempo não volta a 60 na nova partida | faltou iniciar o temporizador no começo da cena | Iniciar (ou redefinir) um temporizador de cena |
Erro em "Fim" | nome da cena diferente (acento, maiúscula) | escrever igual ao nome da cena |
Exercício guiado
Sem rodar: o jogador fez 12, depois 7, depois 15 pontos. Qual o recorde depois de cada partida? (Resposta: 12, 12, 15.)
Desafio individual
Mostre na tela final uma mensagem diferente quando o recorde for batido: "Novo recorde!".
Desafio avançado (opcional)
Faça a tela final mostrar se a partida acabou por tempo ou por vidas. Dica: uma variável global de texto Motivo.
Critérios de avaliação
- As três cenas ligadas, com a Inicio como cena inicial.
- Tempo, vidas e recorde funcionando nas 3 partidas de teste.
- Explicação escrita de por que existem variáveis globais.
Checklist de conclusão
Extensão
Faça um cronômetro de prova: uma cena com contagem regressiva de 5 minutos e um aviso no último minuto. Use em uma atividade de outra matéria.