Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

mouse click asynchronous

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
irlansn
Programador
Programador
Reações: 0
Mensagens: 11

mouse click asynchronous

Mensagem por irlansn » Qui Fev 08, 2018 1:08 pm

Olá a todos!

Seguinte, indo direto ao ponto, eu estou desenhando um teclado dentro de meu jogo, mas estou com um problema de delay, depois de muitos testes, eu entendi o problema:
Está na configuração em "steps". Minha room está configurada para 60fps (e em meu celular está rodando em cerca de 55/60fps), mas quando estamos digitando com 2 mãos, conseguimos ser mais rápidos que isso (por incrível que pareça), e quando existe mais de 1 estimulo de clique dentro de um step, ele conta apenas 1, ignorando a existência do outro.  (eu reduzi para 5fps, pra conseguir notar isso)

Ex: Digamos que em um step, eu clique no "a" e no "b", ele contará apenas o clique em "a". Ou quando escrevemos a mesma letra então, que é ainda mais rápido, ele come varias letras, se eu clicar em "a" mais de uma vez no step, ele contará apenas um clique. E isso tem deixado o teclado muito incomodo, mesmo em 60fps. (Todo mundo que testa reclama disso, até mesmo leigos em programação/design) 

A melhor solução que pensei, foi usar os eventos asynchronous, já que eles ignoram justamente a existência de steps... Mas nenhum deles parece servir para isso que quero. 

Oque posso fazer? 

Não tenho problemas em os dados serem computados por steps, digo, que ele pegue a informação que fora escrito no teclado apenas no final do step. A questão é, preciso que ele reconheça que fora feito mais de um clique, uma especie de ds_list/ds_map que me desse a quantidade de cliques e localização mouse_x e mouse_y de cada um deles, de cada clique que fora feito entre um step e outro.  

Espero que haja solução! Grato desde já!

Avatar do usuário
All-x
Administrador
Administrador
Reações: 8
Mensagens: 621
Localização: Dourados-MS

Contato:

Re: mouse click asynchronous

Mensagem por All-x » Qui Fev 08, 2018 7:03 pm

@irlansn, tudo certo?

O GMS pode capturar 5 toques no mesmo Step. 

O problema é que você está utilizando as funções e variáveis destinadas ao mouse: mouse_check*, mouse_x, mouse_y e etc (Não haveria problema caso não houvesse o multi-touch).

O correto é utilizar as funções device_mouse_*:

Device Input

Faça um teste, cole isto no Draw (De preferência em um projeto separado):

Código: Selecionar todos

// Para todos os toques
for (var tt = 0; tt < 5; tt++)
{
    // Se tocar
    if device_mouse_check_button(tt, mb_left)
    {
        // Desenha circulo
        draw_circle_colour(
                           device_mouse_x(tt),      // Posição X
                           device_mouse_y(tt),      // Posição Y
                           128,                     // Raio do circulo
                           c_red, c_red,            // Cores
                           false);                  // Apenas contorno? Não.
    }
}
Para cada toque um circulo vermelho será desenhado.

Espero que lhe ajude.

FLWS!
Começando com o Game Maker? Olhou para assinatura certa!

Imagem

Tutoriais e vídeo aulas de programação! Clique no Banner e confira!

Avatar do usuário
irlansn
Programador
Programador
Reações: 0
Mensagens: 11

Re: mouse click asynchronous

Mensagem por irlansn » Sex Fev 09, 2018 11:54 am

@Alex FC, tudo certo! E contigo?

Cara, primeiro obrigado pela atenção, mas infelizmente não soluciona o problema, eu já havia verificado esta função tbm, mas ela funciona apenas com toques simultâneos.


Colocando a room em 2fps podemos verificar isso com clareza:

Se vc colocar 2 dedos ou mais na tela ao mesmo tempo, no fim do step ele irá reconhecer a existência dos 2 toques, mas, se você clicar em 2 locais diferentes dentro do mesmo step em tempos diferentes, ele reconhecerá apenas o primeiro toque ainda. 

Grato novamente pela atenção! 
flws

Avatar do usuário
All-x
Administrador
Administrador
Reações: 8
Mensagens: 621
Localização: Dourados-MS

Contato:

Re: mouse click asynchronous

Mensagem por All-x » Sex Fev 09, 2018 1:36 pm

Agora entendi mais claramente. Estou sem um Android aqui pra testar. Mas tente desligar o clique duplo com:

Código: Selecionar todos

device_mouse_dbclick_enable(false); 
E depois ao invés de usar device_mouse_check_button_pressed(tt, mb_left) para checar o clique use device_mouse_check_button_pressed(tt, mb_any).

Dessa forma, creio que o que seria o toque duplo que funcionaria como botão direito do mouse seja detectado, por isso o uso do mb_any.

Teste e me diga se funcionou, também fiquei curioso.

FLWS!
Começando com o Game Maker? Olhou para assinatura certa!

Imagem

Tutoriais e vídeo aulas de programação! Clique no Banner e confira!

Avatar do usuário
irlansn
Programador
Programador
Reações: 0
Mensagens: 11

Re: mouse click asynchronous

Mensagem por irlansn » Sex Fev 09, 2018 2:30 pm

Infelizmente, nada ainda.

E depois desse teste, acho que o problema é ainda maior, se eu pressionar e retirar antes do step terminar/começar o próximo (uma única vez), ele n conta nem mesmo que fora pressionado essa única vez. Coloquei o speed da room para 1fps apenas, para ver isso de forma bem nítida. 

Com device_mouse_check_button_released(), o mesmo problema. 

Confesso que por essa eu n esperava kkkk imaginei que ele retornava pelo menos os comandos feitos dentro do step. Eu imagino, que isso seja como uma especie de trava de segurança, que garanta que os comandos pressed released ocorram em steps diferentes (embora ainda seja tolice, é só colocar para o pressed ser processado antes do released  :bravo:

O mais triste, é que eu estou querendo isso por uma questão de design/fluidez em um teclado. E se eu fizer algum jogo que trabalhe propositalmente com fps bem baixos? Ele vai ignorar os comandos do player? Muito estranho isso. 

Abraços. 

EDIT:

Com o seguinte código: 

Código: Selecionar todos

// Para todos os toques
for (var tt = 0; tt < 5; tt++)
{
    // Se tocar
    if device_mouse_check_button_pressed(tt, mb_any)
    {
        // Desenha circulo
        draw_circle_colour(
                           device_mouse_x(tt),      // Posição X
                           device_mouse_y(tt),      // Posição Y
                           128,                     // Raio do circulo
                           c_red, c_red,            // Cores
                           false);                  // Apenas contorno? Não.
    }
}

for (var tt = 0; tt < 5; tt++)
{
    // Se tocar
    if device_mouse_check_button(tt, mb_any)
    {
        // Desenha circulo
        draw_circle_colour(
                           device_mouse_x(tt),      // Posição X
                           device_mouse_y(tt),      // Posição Y
                           110,                     // Raio do circulo
                           c_yellow, c_yellow,            // Cores
                           false);                  // Apenas contorno? Não.
    }
}

for (var tt = 0; tt < 5; tt++)
{
    // Se tocar
    if device_mouse_check_button_released(tt, mb_any)
    {
        // Desenha circulo
        draw_circle_colour(
                           device_mouse_x(tt),      // Posição X
                           device_mouse_y(tt),      // Posição Y
                           100,                     // Raio do circulo
                           c_blue, c_blue,            // Cores
                           false);                  // Apenas contorno? Não.
    }
}
Eu pudi confirmar minha teoria, pressed released ocorrem em steps diferentes, obrigatoriamente. device_mouse_check_button ocorre desde o pressed e se mantem até o toque ser removido, e também não ocorre no mesmo step do released. 

Avatar do usuário
All-x
Administrador
Administrador
Reações: 8
Mensagens: 621
Localização: Dourados-MS

Contato:

Re: mouse click asynchronous

Mensagem por All-x » Sáb Fev 10, 2018 9:42 pm

Cara, realmente sem um Android aqui pra testar fica complicado. Independente de quando o evento é detectado o segundo toque deveria ser detectado como device #1 (Sendo o primeiro device #0). Não sei se há essa limitação de que cada step reconheça um device diferente e não encontrei essa informção. Precisaria testar.

Só postei pra não deixar sem resposta. Recomendo que poste a dúvida na GMC também. Assim que conseguir um Android aqui eu tento (O Meu é Windows Phone).

FLWS!
Começando com o Game Maker? Olhou para assinatura certa!

Imagem

Tutoriais e vídeo aulas de programação! Clique no Banner e confira!

Avatar do usuário
SirPug
Novato
Novato
Reações: 0
Mensagens: 15

Re: mouse click asynchronous

Mensagem por SirPug » Sáb Fev 10, 2018 10:26 pm

Cara, acredito que não vá ser de muita ajuda pois sou bem leigo em Game Maker, mas e se ao em vez de você usar steps que verifiquem se a tela está sendo tocada você tenha um evento que ocorre ao tocar na tela?

Assim você pode guardar em uma lista onde os caracteres inseridos atraves de uma função tipo:

Código: Selecionar todos

function tela_tocada (posX,posY){
caracter = reconhecer_car(posX,posY);
texto += caracter;
}
Espero que tenha ajudado,
Abraço!
Linguagens que já programei / programo:
C#, HTML, PHP, MySQL, Python e C.

Minhas paixões:
Programação, Pixel Art, Música, Design em geral.

Avatar do usuário
irlansn
Programador
Programador
Reações: 0
Mensagens: 11

Re: mouse click asynchronous

Mensagem por irlansn » Dom Fev 11, 2018 12:28 am

Alex FC escreveu:Cara, realmente sem um Android aqui pra testar fica complicado. Independente de quando o evento é detectado o segundo toque deveria ser detectado como device #1 (Sendo o primeiro device #0). Não sei se há essa limitação de que cada step reconheça um device diferente e não encontrei essa informção. Precisaria testar.

Só postei pra não deixar sem resposta. Recomendo que poste a dúvida na GMC também. Assim que conseguir um Android aqui eu tento (O Meu é Windows Phone).

FLWS!
Eu tbm esperava isso, testei isso até antes de criar esse post/tópico kkkkk mas, pelo que eu testei e entendi, o segundo toque é acionado apenas se este for feito simultaneamente (independente do time de steps). Inclusive, nas funções de desenvolver do Android, tem a opção de ver umas informações sobre os locais de toque, e uma delas, é o número de ponteiros simultâneos, acredito que o GM pegue essa informação e ative os demais ponteiros assim, apenas quando o Android passar que há mais de 1 toque simultâneo (especulações apenas, não achei nada nos manuais)

Vou fazer isso de postar na GMC, quem sabe alguém não aparece com uma solução.

Mas obrigado pela atenção! De vdd.

SirPug escreveu:Cara, acredito que não vá ser de muita ajuda pois sou bem leigo em Game Maker, mas e se ao em vez de você usar steps que verifiquem se a tela está sendo tocada você tenha um evento que ocorre ao tocar na tela?

Assim você pode guardar em uma lista onde os caracteres inseridos atraves de uma função tipo:

Código: Selecionar todos

function tela_tocada (posX,posY){
caracter = reconhecer_car(posX,posY);
texto += caracter;
}
Espero que tenha ajudado,
Abraço!
Oi amigo! Primeiro seja bem vindo ao GM haha, e eu já testei ambas as possibilidades, aparentemente o evento funciona da mesma forma.

Flws!

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes