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 3 · Aula 3.8 · Tempo, telas e recorde

Carga horáriaDificuldadeFerramentaCompetências
12 h/a⭐⭐⭐GDevelop 5 (gdevelop.io)C2, C3

Objetivos de aprendizagem

  1. Usar temporizador de cena para limitar a partida a 60 segundos.
  2. Criar as cenas Inicio e Fim e trocar de cena com eventos.
  3. Usar variáveis globais para levar a pontuação de uma cena para outra.
  4. Guardar o recorde da sessão.
  5. 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

CenaMostraSai paraQuando
Iniciotítulo e instruçõesJogo[Espaço] ou toque
Jogoa partidaFim60 s ou vidas = 0
Fimpontos e recordeJogo[Espaço] ou toque, depois de 1 s

Tutorial passo a passo

Parte A. O relógio (60 min)

  1. No evento No começo da cena da cena Jogo, adicione Iniciar (ou redefinir) um temporizador de cena com o nome "Tempo" (com aspas).
  2. Troque a velocidade do redemoinho para 60 + TimerElapsedTime("Tempo") * 1.5 (Aula 3.7).
  3. No placar, acrescente ao fim: + " Tempo: " + ToString(max(0, ceil(60 - TimerElapsedTime("Tempo")))).

Parte B. Variáveis globais (30 min)

  1. Gerenciador do projeto → Configurações do jogo → Variáveis globais. Crie Recorde (número, 0) e UltimaPontuacao (número, 0).

Parte C. Fim da partida (60 min)

  1. Novo evento. Condição: Valor de um temporizador de cena → "Tempo" → ≥ → 60. Ações: Alterar valor da variável UltimaPontuacao "definir como" Pontos; Alterar a cena → "Fim".
  2. Outro evento. Condição: Valor da variável Vidas ≤ 0. Mesmas duas ações.

Parte D. Cena Fim (90 min)

  1. Gerenciador → Cenas → + (Adicionar uma cena). Nome Fim.
  2. Objetos: FundoTitulo (Sprite com fundo_titulo.png), Texto FimTitulo ("Fim da colheita!", 52), Texto Resultado (vazio, 28), Texto JogarDeNovo ("Aperte ESPAÇO ou toque para jogar de novo", 22).
  3. 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)

  1. Nova cena Inicio, com FundoTitulo, Titulo e Instrucoes.
  2. Dois eventos: Tecla liberada "Space" → Alterar a cena "Jogo"; Botão do mouse liberado "Left" → Alterar a cena "Jogo".
  3. 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)

  1. 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

ItemOnde fica
Variáveis globaisgerenciador do projeto → Configurações do jogo
+ de nova cena (Adicionar uma cena)gerenciador do projeto, à direita do título Cenas
Bandeirinha da cena inicialao lado do nome da cena, no gerenciador
Subeventobotã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 UltimaPontuacao antes de trocar de cena? Porque Pontos é 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çãoResultado
Começocena Inicio; [Espaço] leva para Jogo
Placar no começo"Sementes: 0 Vidas: 3 Tempo: 60"
Perder as 3 vidasvai para Fim; recorde = pontos da partida
Toque logo que o Fim abreignorado
Toque depois de 1 svolta para Jogo com Pontos 0 e Vidas 3
Tempo chega a 60 svai para Fim
Partida pior que o recorderecorde não diminui

Problemas comuns

SintomaCausaSolução
A tela final mostra 0 sempreusou Pontos na cena Fimusar UltimaPontuacao (global)
O jogo pula direto da Inicio para a Fimusou "pressionada" e o mesmo aperto passou por duas telasusar Tecla liberada e a espera de 1 s
Recorde nunca mudaa comparação não está como subevento do começo, ou está ao contrárioUltimaPontuacao > Recorde
O tempo não volta a 60 na nova partidafaltou iniciar o temporizador no começo da cenaIniciar (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.