GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Conectar-se

Esqueci minha senha

Últimos assuntos
» [Ideia] Concurso para relembrar os bons tempos
por vinians Hoje à(s) 9:40

» GMBR 2020 (jogo comemorativo)
por Diemorth Hoje à(s) 9:24

» Rodar o jogo em iOS
por matheushdj Ontem à(s) 20:04

» [XCREATOR] [JAM] [UPD] Farm Defense
por vinians Qui 9 Jul 2020 - 23:31

» Dúvida sobre GameMaker
por Super Games Qui 9 Jul 2020 - 19:32

» Apresentação de Rojas231
por Super Games Qui 9 Jul 2020 - 19:17

» Vender extensões no marketplace da yoyo games?
por Willy Qui 9 Jul 2020 - 9:55

» [DOWNLOAD] Manual Game Maker 8 traduzido
por matheushdj Qua 8 Jul 2020 - 21:41

» Máquina de estado/State Machine no Unity
por theguitarmester Ter 7 Jul 2020 - 22:17

» Eu sou o MoisesBR
por GabrielXavier Ter 7 Jul 2020 - 22:04

» Melhor pontuação
por matheushdj Seg 6 Jul 2020 - 22:23

» Problemas com animação e ataque
por moisesBR Seg 6 Jul 2020 - 22:05

» Ideia para futuros concursos
por moisesBR Seg 6 Jul 2020 - 20:51

» Para quem quer mexer com a Godot
por Super Games Seg 6 Jul 2020 - 9:45

» MOON - [Indie Game Solo]
por vinians Seg 6 Jul 2020 - 8:40


Básicos do GameMaker: Timers

Ir em baixo

Básicos do GameMaker: Timers Empty Básicos do GameMaker: Timers

Mensagem por Super Games em Sex 19 Jun 2020 - 12:41


Básicos do GameMaker: Timers Timers_resourcespage
Básicos do GameMaker: Timers
(Original: GameMaker Basics: Timers)


  • Versão do GameMaker: GameMaker Studio 2 / Qualquer uma (eu acho)
  • Dificuldade: Iniciante
  • Requer Extensões: Não
  • Requer DLLs: Não
  • Tags: Timers / Cronômetros

-----------------------------------------------------------------------------------------

(Esta é uma tradução/adaptação minha de um tutorial de GameMaker que encontrei no site da YoYo Games, postado na área de desenvolvedores do site da Amazon, por Nathan Ranney. Todos os créditos a ele ^ ^)

E aí, pessoal! Eu costumo usar vários timers programados por mim mesmo, ao em vez de usar o sistema de alarmes incluso no GameMaker. Eu prefiro programar meus próprios timers por duas razões: Primeiro, os alarmes do GameMaker são meio limitados. Você só pode ter um certo número de alarmes por objeto. Segundo, alarmes não são muito "transparentes" e eu fico perdido tentando me lembrar do que eu estabeleci pro alarm[0], por exemplo. Nesta postagem, eu irei explicar como vocês podem criar seus próprios timers e como usar eles.

Visão geral e configuração

Então, o que é exatamente um timer? Um timer é um mecanismo que lhe permite contar, de forma progressiva (1, 2, 3 ...) ou regressiva (10, 9, 8 ...), até um certo valor que serve de gatilho para alguma coisa. Por exemplo: digamos que você tem um personagem que está envenenado. Dano por envenenamento geralmente é um dano progressivo, ao longo do tempo. Imagine que seu jogo roda a 60 frames por segundo e você decide que o valor do dano por envenenamento deve ser igual a 1. Seu personagem tem 100 de HP e seu código é assim:

Exemplo de código de envenenamento

Código:
poisonDamage = 1; //dano por envenenamento é igual a 1

if(poisoned){ //se estiver envenenado
   hp -= poisonDamage; //HP diminui conforme o valor estabelecido pro dano por envenenamento (que é 1)
}

Esse código não possui um timer, nem algum tipo de limitação, então ele diminui o HP do personagem a cada frame, o que significa que seu personagem que tem 100 de HP vai morrer em... 1,6 segundos. Isso que eu chamo de um veneno brabo. O que você realmente tem que fazer é contar regressivamente o dano por envenenamento a cada alguns segundos. O código pra isso é tipo assim:

Exemplo de código de envenenamento com timer

Código:
poisonDamage = 1; //dano por envenenamento é igual a 1

if(poisoned){ //se estiver envenenado
   poisonTick --; //timer do envenenamento diminui

   if(poisonTick <= 0){ //se a duração da ação for igual ou menor que 0
       hp -= poisonDamage; //HP diminui conforme o valor estabelecido pro dano por envenenamento (que é 1)
       poisonTick = 60; //timer do envenenamento volta/vai pra 60
   }
}

Nesse exemplo, eu estou usando uma nova variável, poisonTick, para determinar quando o dano por envenenamento será aplicado. Então agora, o que levava 1,6 segundos anteriormente, leva 100 segundos. O valor de poisonTick diminui em 1 a cada frame. Uma vez que o poisonTick chega em 0, a HP do personagem é reduzida conforme o valor de poisonDamage e o poisonTick volta pro seu limite, que é 60. Fazer isso requer um pouco mais de gerenciamento do que usar alarmes, mas é muito mais versátil.

Para usar timers dessa maneira, você precisa ter pelo menos uma variável, que é a variável que vai armazenar seja lá o que for que você estiver contando. No exemplo acima, a variável é poisonTick. Eu altamente recomendo que você use uma segunda variável quando você redefinir sua variável contada. Vou mostrar isso num dos exemplos abaixo.

Mais exemplos

Outra vantagem de se usar timers manuais é que você pode usar uma mesma variável de um timer para vários casos. Eu frequentemente uso uma variável chamada actionDur (duração da ação) nos meus jogos para determinar por quanto tempo qualquer uma das ações do personagem pode ser executada. Digamos que um personagem tem duas ações, um ataque e um dash, ambas dependentes de um timer. O personagem está bloqueado pra qualquer uma das ações pela duração do timer. Você pode usar dois timers para gerenciar isso, como attackDur (duração do ataque) e dashDur (duração do dash), ou você pode usar um único timer para ambas ações. Dê uma olhada no exemplo a seguir:

Timer multi uso

Código:
actionDurMax = 60; //duração máxima da ação é igual a 60
actionDur = actionDurMax; //duração da ação é igual a duração máxima da ação

if(attack){ //se estiver atacando
   actionDur --; //duração da ação diminui
   
   if(actionDur <= 0){ //se a duração da ação for igual ou menor que 0
       actionDur = actionDurMax; //duração da ação volta pra duração máxima
       attack = false; //não está atacando
   }
}

if(dash){ //se estiver usando o dash
   actionDur --; //duração da ação diminui
   
   if(actionDur <= 0){ //se a duração da ação for igual ou menor que 0
       actionDur = actionDurMax; //duração da ação é igual a duração máxima da ação
       dash = false; //não está usando o dash
   }
}

Como você pode ver, ambas ações podem usar as mesmas variáveis de timer. Fique atento ao fato de que, se você estiver usando uma mesma variável de timer em vários lugar, cada uso do timer deve ser completamente independente dos outros. Então, usando o exemplo novamente o exemplo acima, eu devo ter certeza de que as variáveis do ataque e do dash não podem ser verdadeiras ao mesmo tempo (ou seja: ambas ações não podem acontecer simultaneamente). Se ambas variáveis forem verdadeiras ao mesmo tempo, a contagem de actionDur será duas vezes mais rápida. Eu altamente recomendo que você configure uma máquina de estados para seu personagem, o que vai te ajudar a gerenciar onde cada código está rodando.

Você também pode contar de forma progressiva com seus timers, o que muda um pouco a estrutura. É meio que uma preferência pessoal se você decidi contar progressivamente ou regressivamente. Você pode se encontrar em alguns casos onde uma das formas é mais vantajosa do que a outra.

Timer progressivo

Código:
actionDur = 0; //duração da ação é igual a 0
actionDurMax = 60; //duração máxima da ação é igual a 60

if(attack){ //se estiver atacando
   actionDur ++; //duração da ação aumenta
   
   if(actionDur >= actionDurMax){ //se a duração da ação for igual ou maior que a duração máxima
       actionDur = 0; //duração da ação volta pra 0
       attack = false; //não está atacando
   }
}

Há algumas pequenas diferenças aí. Nosso timer começa em 0, ao em vez de começar no seu limite, e conta de forma progressiva até ele (dããã).

Então, o que acontece se você deseja usar um único timer para múltiplas ações, mas essas ações possuem durações diferentes? A forma mais fácil de fazer isso, se você está usando a mesma configuração que a deste tutorial, é definir o ponto inicial do seu timer quando a ação acontece. Usando novamente como exemplo a ação de ataque, vamos ver como isso deve funcionar:

Duração diferente pro timer com uma única variável

Código:
actionDur = 0; //duração da ação igual a 0
actionDurMax = 60; //duração máxima da ação é igual a 60

if(attack_button){ //se o botão de ataque for pressionado
   attack = true; //está atacando
   actionDur = 30; //duração da ação é igual a 30
}

if(attack){ //se estiver atacando
   actionDur ++; //duração da ação aumenta
   
   if(actionDur >= actionDurMax){ //se a duração da ação for igual ou maior que a duração máxima
       actionDur = 0; //duração da ação volta pra 0
       attack = false; //não está atacando
   }
}

Nesse exemplo, nós tivemos que usar um novo bloco de códigos. Nós adicionamos a variável attack_button, que serve pra ação de se pressionar o botão de ataque no jogo. Quando tal botão é pressionado, a variável do ataque se torna verdadeira, e actionDur é estabelecida como sendo 30. Por padrão, actionDur é 0 e nós estamos substituindo esse valor quando o botão de ataque é pressionado. Entretanto, quando se ataca, actionDur ainda está contando progressivamente até sua duração máxima, actionDurMax. A diferença é que dessa vez, ao em vez da contagem começar em 0, ela começa em 30. Isso efetivamente diminui pela metade a duração da nossa ação de ataque. Aqui está mais um exemplo, mas usando duas ações:

Múltiplas ações com durações diferentes pro timer

Código:
actionDur = 0; //duração da ação
actionDurMax = 60; //duração máxima da ação é igual a 60

if(attack_button){ //se o botão de ataque for pressionado
   attack = true; //está atacando
   actionDur = 30; //duração da ação é igual a 30
}

if(attack){ //se estiver atacando
   actionDur ++; //duração da ação aumenta
   
   if(actionDur >= actionDurMax){ //se a duração da ação for igual ou maior que a duração máxima
       actionDur = 0; //duração da ação volta pra 0
       attack = false; //não está atacando
   }
}

if(dash_button){ //se o botão de dash for pressionado
   dash = true; //está usando o dash
   actionDur = 10; //duração da igual é igual a 10
}

if(dash){ //se estiver usando o dash
   actionDur ++; //duração da ação aumenta
   
   if(actionDur >= actionDurMax){//se a duração da ação for igual ou maior que a duração máxima
       actionDur = 0; //duração da ação volta pra 0
       dash = false; //não está usando dash
   }
}

Recursos adicionais


-----------------------------------------------------------------------------------------

Isso é tudo sobre timers. Apesar de exigirem um pouco mais de gerenciamento do que alarmes, timers são muito mais flexíveis e possuem uma configuração bem mais "transparente". Obrigado por dedicar um pouco do seu tempo para ler tudo isso.

Obrigado e até a próxima! flw
Super Games
Super Games

Games Ranking : Nota D

Notas recebidas : D
Data de inscrição : 10/06/2010
Reputação : 11
Número de Mensagens : 2727
Prêmios : Básicos do GameMaker: Timers Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker Studio 1.4
  • Outros


Voltar ao Topo Ir em baixo

Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum