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.
Flws!
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
mouse click asynchronous
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á!
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
@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):
Para cada toque um circulo vermelho será desenhado.
Espero que lhe ajude.
FLWS!
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.
}
}
Espero que lhe ajude.
FLWS!
Re: mouse click asynchronous
@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
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
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!
Código: Selecionar todos
device_mouse_dbclick_enable(false);
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
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:
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.
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.
}
}
Re: mouse click asynchronous
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!
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
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:
Espero que tenha ajudado,
Abraço!
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;
}
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.
C#, HTML, PHP, MySQL, Python e C.
Minhas paixões:
Programação, Pixel Art, Música, Design em geral.
Re: mouse click asynchronous
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)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!
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.
Oi amigo! Primeiro seja bem vindo ao GM haha, e eu já testei ambas as possibilidades, aparentemente o evento funciona da mesma forma.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:Espero que tenha ajudado,Código: Selecionar todos
function tela_tocada (posX,posY){ caracter = reconhecer_car(posX,posY); texto += caracter; }
Abraço!
Flws!
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes