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
» Colisões não funcionando
por RastaMaan Ontem à(s) 19:49

» Como ajustar velocidade de cada frame da animação no game maker
por pequetux Ontem à(s) 16:45

» Preciso de ajuda
por AftonDuGrau Dom 21 Abr 2024, 20:18

» Como faz o evento drawn GUI, não se repetir?
por aminaro Sex 19 Abr 2024, 20:30

» PROBLEMAS COM FÍSICAS DE ÁGUA
por aminaro Ter 16 Abr 2024, 10:07

» Retorno da GMBR!!!
por Ralphed Sex 12 Abr 2024, 22:45

» JOGADOR PARANDO NO AR QUANDO ATACA
por aminaro Qua 10 Abr 2024, 13:51

» Problemas com texto interativo
por Kaaru72 Dom 07 Abr 2024, 11:31

» Erro escondido e indecifrável
por dev_gabize.azv Qui 04 Abr 2024, 10:11

» Mudar cor de apenas uma palavra
por Ralphed Sáb 30 Mar 2024, 00:39

» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27

» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30

» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17

» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18

» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34

» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13

» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18

» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12

» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02

» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55

» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42

» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56

» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49

» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21

» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21


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 : 2799
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
  • 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