Eu realmente não estou conseguindo entender o que significa a linha de código:
if (event.getAction() != MotionEvent.ACTION_MOVE && i != pointerIndex) {
// if it's an up/down/cancel/out event, mask the id to see if we should process it for this touch point
continue;
}
Alguém que já tenha estudado o livro ou que já implementou multitouch poderia me esclarecer?
Só tem isso de código? Provavelmente deva ter um else ou um for sobre ele.
Nesse código ele está forçando a repetição do laço caso o movimento feito pelo touch não seja o correto.
Tchauzin!
Rafagan_Abreu
Oi lina...
Na verdade, esse é o trecho do código que eu não estou entendendo. O código total pode ser visto no link que passei.
Lá, basicamente ele processa cada multitouch dentro do método onTouch. Se você der uma olhada, vai perceber que a variável pointerIndex somente é usada nesse trecho do código. E segundo o que ele diz no texto, ela deveria representar o próprio ID do touch atual, o que na verdade não acontece, pois capturamos o ID do touch recebido a partir do i no laço...
Então, pelo que pude analisar você não pode pegar o pointer pelo ‘i’ do FOR. Até porque o ‘i’ do for é uma variável contadora e possivelmente não representa (de forma alguma) o ID do touch atual.
Ao meu ver, o código abaixo está errado:
Deveria ser algo do tipo:
Provavelmente, o pointerIndex deverá ser “atualizado” pelo FOR, mas isso já é uma outra coisa que pode ou não ser verdade…
Tchauzin!
Rafagan_Abreu
Cara, ai é que está o jogo!
Esse livro é uma versão atualizada de um livro mais antigo chamado “Beggining Android Games”, e nesse livro, a solução para este problema do multitouch leva como consideração o pointerIndex como valor de índice…
Eu realmente não testei o código do livro antigo para ver, mas esse código desse livro é totalmente funcional, eu mesmo testei. Então a lógica não está errada.
Agora eu não sei por quê os caras mudaram a solução na versão nova pra essa
Rafagan_Abreu
E ai, descobriram alguma coisa?
Marky.Vasconcelos
Cada dedo que voce toca na tela dispara um evento e a cada dedo (ou ponteiro) é associado a um id, voce pode guarda-los para manter o track de todo o movimento.
Dentro de um mesmo MotionEvent voce consegue pegar o estado de todos os ponteiros através do id dele.
Rafagan_Abreu
Olá Marky…
Não entendi muito bem o que você quis dizer. Poderia me dar um exemplo?
Marky.Vasconcelos
Um exemplo seria que nem o Fruit Ninja (se nao conheçe: baixe-o) voce pode tocar quantos dedos quiser na tela e fazer movimento para cortar as frutas, a maneira de saber qual dedo se movimentou para onde é guardar cada pointerId para acompanhar os movimentos.
Rafagan_Abreu
Ah sim, ja joguei =)
Então, pensando nisso, porque ele está desviando o loop para a próxima iteração caso algo como isso aconteça?
Como pode event.getAction() != MotionEvent.ACTION_MOVE && i != pointerIndex indicar “guardar pointerId para acompanhar os movimentos se estiverem ocorrendo”, se a primeira condição do if é evitar que o mesmo seja processado, caso o tipo do evento seja ACTION_MOVE?
Marky.Vasconcelos
Por que se voce tiver com dois dedos na tela, um deles se mover, o onTouch será invocado, onde o ponteiro de um vai continuar parado e seu action não será ACTION_MOVE e o outro vai.
Rafagan_Abreu
huuuuummm…
Então essa condição basicamente serve para ignorar touchs na tela que já foram processados, mas que permaneceram na mesma condição, e então passar a processar os touchs que foram modificados no caso com Action Move.
Peguei o raciocínio?
A
A_H_Gusukuma
Olá
Se a ação não for ACTION_MOVE ele só vai processar o ponto tocado, e ignorar os outros pontos.
Rafagan_Abreu
Olá Gusukuma,
Você diz isso com base somente na condição? Por que ele ignoraria os demais pontos?
A
A_H_Gusukuma
Somente na condição.
Teria sentido tratar os outros pontos? Isso depende dos requisitos da lógica do game
Rafagan_Abreu
Bem, mas e como o código passaria dessa condição para registrar eventos de touch DOWN e UP?
Afinal, os eventos precisam ser inicializados antes de serem tratados a partir somente do movimento
A
A_H_Gusukuma
Creio que está misturando o conceito de movimento do jogador com o evento do game
Cada movimento do jogador gera evento(s) no app, que são diferenciados de acordo com as diferentes atitudes do jogador
Um toque, manter o dedo pressionado, deslizar sobre a tela, etc
Marky.Vasconcelos
Rafagan Abreu:
huuuuummm…
Então essa condição basicamente serve para ignorar touchs na tela que já foram processados, mas que permaneceram na mesma condição, e então passar a processar os touchs que foram modificados no caso com Action Move.