O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Barra carrega ao apertar tecla - RM2K

Iniciado por [COB], 18/06/2020 às 11:21

18/06/2020 às 11:21 Última edição: 18/06/2020 às 11:24 por [COB]
Olá pessoal!

Estou tentando implementar uma barra de carregamento, que vai sendo preenchida conforme o jogador aperta uma tecla, repetidamente, durante um período de tempo. (Estou utilizando o RPG Maker 2000).

Visualmente, o preenchimento da barra se da através de pictures.

Estou tendo problema com uso do timer. Eu gostaria que, se o jogador não apertasse a tecla, a barra fosse diminuindo gradativamente com o passar do tempo. E quanto mais vezes o jogador apertar a tecla, mais rápido a barra se enche.

P. ex.: 3 apertos na tecla, em 1 segundo, fazem a barra subir um grau. Se não houver aperto de tecla ou demorar a apertar, a barra diminui.


*Imagem meramente ilustrativa.

O que eu consegui fazer até o momento é que a cada aperto da tecla, a barra carregue um estágio. E que após um período determinado de tempo, caso cheia, a barra some.

Alguém saberia/poderia me ajudar?

Grato.

Eu não lembro como fiz isso, mas provavelmente foi por Destiny Script. Por eventos, eu não faço ideia, no momento.

Dá uma olhada nesse link, espero que possa te ajudar: MK2k Mortal Kombat Pack.

Esse sistema tá presente em um dos mini-jogos do Mortal Kombat, e eu recriei essa parte há um bom tempo.

Há dois sites meus que você pode conhecer mais sobre o Destiny Script e o que eu gosto de fazer no 2k usando ele.

Caveira RPG Maker

Unique Destiny

Qualquer dúvida, estou à disposição.
Unique Destiny | um novo conceito de RPG Maker 2000!

Obrigado pelo retorno, Avenger_B7!

Não tenho afinidade com o Destiny Script, mas com ctza olharei o conteúdo do link com mais detalhe!

A idéia seria algo por eventos mesmo, mas...

Valeu!!!

Uma dica que eu dou para esses tipos de sistemas que manipulam entrada de teclas é: separar o método das teclas em uma thread. O que isso significa? Uma bandeira de pirata? Não! É nada mais e nada menos que você colocar em um processo paralelo rodando junto com o sistema em si.
Eu fiz um programinha básico aqui pra vc ver como que ficaria seu sistema. Como os requisitos da sua dúvida foram bem precisos, tive a minuciosidade em atender cada detalhe dado pelo seu exemplo. É claro que vc pode alterar do jeito que vc preferir e o código já está programado justamente para facilitar sua manutenção. Além é claro do fato de ter separado os métodos em Eventos comuns também ajudou no print porque a quantidade de linhas encaixaram certinho dentro de uma tela só.  :XD:

Primeiro eu fiz a inicialização dos valores trabalhados neste sistema. Este evento será o entrypoint do seu sistema.Para que o mesmo se inicie, basta você chamar este primeiro evento comum.


Este é o loop principal do seu sistema. Aqui teremos 3 etapas:

  • Receber a quantidade de teclas pressionada em um intervalo.
  • Decrementar a barra caso não houve incremento na mesma.
  • Validar estado da barra. Se ela estiver cheia, o sistema se encerra.


Método responsável por fazer o decremento da barra.


Método responsável pelo incremento da barra.


Aqui é o método que vai tratar a velocidade das teclas pressionadas. Paralelamente a este método, um outro método está acontecendo em outra thread (logo após esse print). Esse método fará um loop de 1 segundo. Como é um sistema que exige velocidade da parte do usuário, eu precisei armazenar o tempo em uma variável. Enquanto o método Wait a gente consegue manipular décimos de segundo, agora nós vamos trabalhar com centésimos de segundo, o que vai melhorar ainda mais a precisão do seu sistema.

Se o jogador pressionar a tecla pelo menos 3 vezes dentro deste intervalo, a barra será incrementada. Se ele conseguir pressionar 6 vezes em 1 segundo, incrementará para 2. Essa variação depende de valor que armazenamos em [0003: keysPerPoint]. Se você quer que o jogador precise pressionar mais rápido, basta aumentar esse valor. Se você achou que ficou rápido demais e precisa abaixar o ritmo, basta diminuir aquele valor que este método se comportará de forma dinâmica.

Lembre-se: 1 segundos = 100 cents (centésimos de segundo).
Além do mais, há uma peculiaridade logo no final. Muita gente fala que o Wait de 0.0s não vale nada. Muito pelo contrário. Um wait de 0.0s equivale a aproximadamente 15 milésimos de segundo, que é o tempo suficiente do seu processador dar aquela bufadinha antes de receber o próximo processo. E como variáveis do RPG Maker não trabalha com pontos flutuantes, precisamos arredondar para um número inteiro, sendo assim o seu ciclo será incrementado a 2, para arredondar 15 milésimos para 20 milésimos.


Essa é a thread que invocamos lá no momento da inicialização do sistema, ativando o switch [0002: keyThreadEnabled]. Este método vai receber a quantidade de vezes que a tecla ENTER foi pressionada. Para prevenir que o jogador trapaceie mantendo a tecla pressionada, programei de tal forma onde a entrada da tecla será validada somente se o jogador apertar e soltar utilizando uma pequena técnica como pode ver no print abaixo.
Este evento, por estar em uma outra thread, ocorrerá em paralelo ao loop principal do sistema, portanto não há de se preocupar com este loop pois ele não afetará o loop principal.


Este evento aqui vai tratar e validar o estado da barra. Se a barra estiver cheia, o sistema se encerra, senão o loop continua. Aqui você pode dar um feedback dizendo que a barra foi cheia, ou simplesmente ir para o próximo processo. Eu não sei se isso está em uma batalha ou em um mini-game, mas eu recomendo que aqui você apenas quebre o loop e em um outro evento você faça a próxima etapa do seu jogo para que consiga reaproveitar esse sistema em outros momentos no seu jogo.


Basicamente foi isso que eu pensei.
Espero que tenha conseguido resolver seu problema.
Qualquer dúvida, é só responder aqui.

Abraço!

Incrível, Dr.XGB!

Muito obrigado pelo seu tempo, pelo nível de detalhes e pela boa vontade!

Independente de eu conseguir implementar ou não, vc merece um ouro por cada evento demonstrado rsrs

Vou seguir o passo a passo minuciosamente!

Em breve eu volto para dar a notícia se consegui fazer dar certo por aqui..

Obrigado mesmo!

Abração!!

Voltei!

Mas tô com outro imbróglio agora...

Como conciliar este sistema com as pictures da barra? (Tenho 15 pictures que mostram o crescimento da barra e não tô sabendo como devo inseri-las neste sistema)

Alguma luz, doc.XGB? Abraço!

Citação de: [COB] online 04/07/2020 às 21:05
Voltei!

Mas tô com outro imbróglio agora...

Como conciliar este sistema com as pictures da barra? (Tenho 15 pictures que mostram o crescimento da barra e não tô sabendo como devo inseri-las neste sistema)

Alguma luz, doc.XGB? Abraço!

Neste caso, as pictures podem ficar em uma outra thread, ou seja, um outro evento comum em processo paralelo, onde vc vai determinar qual será a imagem a ser mostrada de acordo com o valor da barra. Para que seu sistema funcione de acordo com o gráfico das barras, o valor máximo precisa ser 15 pra bater certinho.
Essa thread será acionada quando o switch [0001: BEGIN] for acionado. Ou vc pode criar seu próprio switch, mas não se esqueça de ativar no momento em que o sistema for chamado e desativar quando o sistema se encerrar.

Exemplo:
<> IF [0001: barValue] == 0
  <> Mostra a picture da barra vazia
: ENDIF
<> IF [0001: barValue] == 1
  <> Mostra a picture da barra com 1 ponto
: ENDIF
...
<> IF [0001: barValue] == 15
  <> Mostra a picture da barra cheia
: ENDIF

Obrigado pelo retorno, Doc.!

Infelizmente ainda tô falhando na missão.. xD

Vou descrever exatamente o processo:
- Um evento de batalha acabou de ser encerrado (por herói derrotado ou inimigo com 50% de hp). ✓
- Charset do herói caido no chão. ✓
- Mostrar na tela a picture com a barra de carregamento e indicar ao jogador que deve apertar enter até a barra carregar completamente, durante 5 segundos ( tá mais ou menos/fail) ×
- Se o jogador conseguir carregar a barra em 5 segundos, o herói levanta e pode tentar combater de novo. Caso contrário, Game Over (tá mais ou menos/fail) ×

A situação é essa aí. Eu consigo fazer a barra aparecer mas tô falhando miseravelmente em fazê-la funcionar.

Eu segui o passo que vc praticamente desenhou pra mim, mas posso ter interpretado algo errado, sei lá.. (tô usando a versão do don Miguel então as nomenclaturas tão diferentes).

Se facilitar me ajudar, posso fazer umas prints do que eu fiz..

No mais, gostaria de parabeniza-lo pelo curso que está fazendo no YouTube! Já tô inscrito no canal e acompanhando!

Abraço!

07/07/2020 às 13:36 #8 Última edição: 07/07/2020 às 13:37 por Dr.XGB
Isso, os prints vão me ajudar a achar o problema mais rápido.

Pelo que entendi agora, vc chamou a barra de pictures mas o sistema não acontece, certo?

No momento em que a barra aparece para começar o sistema, o evento comum BEGIN foi chamado? Pois é ele que dará a entrada para o sistema todo acontecer.

Sobre o último item, você vai ter que precisar fazer um contador de 5 segundos em uma outra thread quando este sistema for chamado, ou seja, quando o switch [0001: BEGIN] for ativado. Aí esse contador precisa ser com variável. Se usar Wait de 5.0s, pode bugar seu sistema, então por segurança é bom fazer um contador, igualzinho no evento GetKeyPressAmount, só que com outras variáveis e com a condição pra 500.

Lá no Evento BEGIN, você coloca:
<> Change Variable: [xxxx: <nome da sua variável>] - Set 500


Vamos fazer agora um contador regressivo. Crie um novo evento comum de Processo Paralelo, cujo switch para rodar essa thread é [0001: BEGIN] esteja ativado.
<>IF [xxxx: <nome daquela variável declarada>] - 0 below (padrão Rm2k 1.07, do Don Miguel)
  <> Game Over
  <>
: END
<> Change Variable: [xxxx: <nome daquela mesma variável>] - 2 (subtrai a variável pra 2 pra dminuir 1 centésimo de segundo)
<> Wait: 0.0s
<>


Se o problema ainda persistir, manda um print das linhas de comandos pra poder fazer uma análise mais profunda do problema  :ok:

Opa! Voltei Doutor!

E trouxe as prints rsss

Por favor, assim que puder, dê uma olhada e me ajude a encontrar o erro.. No editor de evento no mapa, após o comando Start Battle, estou usando o Call Event InicioBarra.. está correto?


EVENT: InicioBarra


EVENT: BarUpdate


EVENT: BarDecrease


EVENT: BarIncrease


EVENT: GetKeyPressAmount


EVENT: KeyThread


EVENT: CheckBarValue


EVENT: ChargeBar


Já estou ansioso pelo Módulo II do seu curso no Youtube!!!

Abração!

15/07/2020 às 11:54 #10 Última edição: 15/07/2020 às 11:56 por Dr.XGB
Achei alguns erros na implementação do código:

Citação de: [COB] online 15/07/2020 às 11:08
EVENT: GetKeyPressAmount



  • A condição que vc usou para testar a quebra do laço foi se [0081: barValue] for maior ou igual a 100. O que na verdade devemos fazer esse teste com [0087: centsTime]
  • Todas essas instruções devem estar dentro do ciclo, senão não tem como a gente testar a passagem de centésimos de segundo, causando um loop infinito e, consequentemente, travando o seu jogo.
    Pode-se notar que o segundo IF, o Wait e a incrementação da variável está fora do ciclo, pois estas instruções estão logo após o :END Cycle. Na verdade era pra ficar depois do :END Case lá do primeiro IF dentro do loop.


Citação de: [COB] online 15/07/2020 às 11:08
Já estou ansioso pelo Módulo II do seu curso no Youtube!!!

Abração!
Que bom que vc tá curtindo o curso. Basicamente estou quase acabando de gravar o módulo I inteiro. A partir da semana que vem deixaremos a teoria e começaremos com os exercícios  :XD:

27/07/2020 às 12:19 #11 Última edição: 28/07/2020 às 10:03 por [COB]
Opa! Obrigado pelo retorno, Doc.!

O evento já teve uma evolução considerável! Mas ainda estou tropeçando em algumas coisas, veja só:

1- Eu gostaria que a contagem do timer aparecesse na tela, para que o jogador saiba que ele tem tempo para executar a ação de apertar o botão. (Eu chamei a função do timer e marquei a opção para aparecer na tela (Ta OK). MAS essa função está num evento à parte (no mapa). Pode ser aí mesmo ou há algum lugar mais indicado no sistema da BARRA pra "chamar" esse timer? (Ta funcionando legal mas não sei se pode causar algum lag.)

2- A única questão envolvendo a barra que ainda não ta ok, é o fato dela não diminuir caso o botão não seja apertado. Tipo, se eu apertar o botão 3x em 1 seg, a barra sobe um grau (ta OK). Após isso se eu não apertar o botão, a figura da barra fica estática (ela não diminui) - Se eu apertar novamente o botão 3 vezes, sobe mais um grau (a figura da barra fica estática novamente)- e por aí vai.

A minha dúvida mesmo é como "chamar" as pictures da barra diminuindo (se um "else" no evento ChargeBar resolve) ou se devo fazer mais uma thread para isso.

Se puder dar uma luz aí, ficarei mto grato!


Tava agora mesmo acompanhando o curso e os videos de switches! Show de "boolean"!!!

Abraço.

Citação de: [COB] online 27/07/2020 às 12:19
1- Eu gostaria que a contagem do timer aparecesse na tela, para que o jogador saiba que ele tem tempo para executar a ação de apertar o botão. (Eu chamei a função do timer e marquei a opção para aparecer na tela (Ta OK). MAS essa função está num evento à parte (no mapa). Pode ser aí mesmo ou há algum lugar mais indicado no sistema da BARRA pra "chamar" esse timer? (Ta funcionando legal mas não sei se pode causar algum lag.)
Olha, por ser um evento de sistema, ou seja, que ele pode acontecer em qualquer mapa, é sempre recomendável chamar as funções via Evento Comum, que aí no mapa você só terá trabalho de chama-las através de um evento. Lag pode não causar, mas com certeza, muita dor de cabeça pra dar manutenção depois kkkkk !!

Citação de: [COB] online 27/07/2020 às 12:19
2- A única questão envolvendo a barra que ainda não ta ok, é o fato dela não diminuir caso o botão não seja apertado. Tipo, se eu apertar o botão 3x em 1 seg, a barra sobe um grau (ta OK). Após isso se eu não apertar o botão, a figura da barra fica estática (ela não diminui) - Se eu apertar novamente o botão 3 vezes, sobe mais um grau (a figura da barra fica estática novamente)- e por aí vai.

A minha dúvida mesmo é como "chamar" as pictures da barra diminuindo (se um "else" no evento ChargeBar resolve) ou se devo fazer mais uma thread para isso.
Nesse caso então, parece que gerou conflito na troca de imagem da barra ao pôr em outra thread. Então é mais seguro que esse evento que troca a imagem da barra não seja atualizada constantemente, mas sim chama-la sempre que a barra incrementar e decrementar. Em outras palavras, o evento ChargeBar deixará de ser Processo Paralelo e agora ele será do tipo Call. Aí lá nos eventos BarIncrease e BarDecrease, lá na última instrução de cada um, chame esse evento para que a barra seja atualizada.

Fala, Doc.!

Tô eu garrado aqui de novo :ded:

Então... não funcionou não  :aiaiai: To quase largando pra lá e deixando do jeito que tá mesmo, com a barra estática. Visualmente não é exatamente o que queria mas ta aceitável rs

Agora outra coisa.. Junto com esse evento da barra, existe outro processo que é o de uma picture (escrito ENTER) piscando na tela, que indica que o jogador precisa pressionar rapidamente a tecla para carregar a barra.

Pra isso, fiz um loop, que é ativado pela switch BEGINBarra, rústicamente mostrado abaixo:

wait 0.1
Show picture
wait 0.2
Erase picture
wait 0.1

Só que essa "animação" (do ENTER piscando) ativada junto com o evento da barra, ta causando com um lagzinho.. A picture não some e aparece corretamente.

Alguma dica de como tentar melhorar isso? Tentei usar o "Call Event" (a picture roda sem travar, mas não to sabendo onde colocar esse Call pra rodar junto com a Barra).

Abraço!

Citação de: [COB] online 07/08/2020 às 11:40

Pra isso, fiz um loop, que é ativado pela switch BEGINBarra, rústicamente mostrado abaixo:

wait 0.1
Show picture
wait 0.2
Erase picture
wait 0.1

Só que essa "animação" (do ENTER piscando) ativada junto com o evento da barra, ta causando com um lagzinho.. A picture não some e aparece corretamente.


Eu fiz algo parecido, mas não durante o jogo e sim na intro.
Ao invés de "mostrar imagem" e "apagar imagem" já tentou o "mostrar imagem" e "mover imagem"?