Entrar
Últimos assuntos
» player não consegue andarpor 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
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Básicos do GameMaker: Timers
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!
Super Games- Games Ranking :
Notas recebidas : C
Data de inscrição : 10/06/2010
Reputação : 36
Número de Mensagens : 2800
Prêmios :
x 0 x 0 x 0
x 0 x 1 x 0
x 0 x 0 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++
Tópicos semelhantes
» Básicos do GameMaker - Tremer a Tela
» not enough timers avaliable-o que é isso??
» GameMaker e GameMaker: Studio
» Comandos Basicos
» Movimentos básicos
» not enough timers avaliable-o que é isso??
» GameMaker e GameMaker: Studio
» Comandos Basicos
» Movimentos básicos
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos