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

Esqueci-me da senha

Últimos assuntos
» player não consegue andar
por lovn7 Qui 21 Nov 2024, 13:33

» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22

» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31

» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23

» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49

» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58

» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36

» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36

» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33

» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51

» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28

» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18

» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08

» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10

» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16

» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40

» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01

» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45

» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34

» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28

» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48

» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54

» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14

» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50


Básicos do GameMaker: Timers

Ir para baixo

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

Mensagem por Super Games 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 C

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

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 1 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker 8.0 ou 8.1
  • Game Maker Studio 1.4
  • Game Maker Studio 2.0
  • Java
  • Godot
  • Javascript
  • C ou C++


Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos