Página 1 de 1
mouse click asynchronous
Enviado: Qui Fev 08, 2018 1:08 pm
por irlansn
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á!
Re: mouse click asynchronous
Enviado: Qui Fev 08, 2018 7:03 pm
por All-x
@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!
Re: mouse click asynchronous
Enviado: Sex Fev 09, 2018 11:54 am
por irlansn
@
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
Re: mouse click asynchronous
Enviado: Sex Fev 09, 2018 1:36 pm
por All-x
Agora entendi mais claramente. Estou sem um Android aqui pra testar. Mas tente desligar o clique duplo com:
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!
Re: mouse click asynchronous
Enviado: Sex Fev 09, 2018 2:30 pm
por irlansn
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 e
released ocorram em steps diferentes (embora ainda seja tolice, é só colocar para o
pressed ser processado antes do
released
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 e
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.
Re: mouse click asynchronous
Enviado: Sáb Fev 10, 2018 9:42 pm
por All-x
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!
Re: mouse click asynchronous
Enviado: Sáb Fev 10, 2018 10:26 pm
por SirPug
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!
Re: mouse click asynchronous
Enviado: Dom Fev 11, 2018 12:28 am
por irlansn
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!