Tengo una pregunta rápida en relación con toques de seguimiento en el iPhone y me parece no ser capaz de llegar a una conclusión sobre este tema, por lo que cualquier sugerencia/ideas son muy apreciados:iPhone: Seguimiento/Identificación de toques individuales
I quiere ser capaz de rastrear e identificar toques en el iphone, es decir. básicamente, cada toque tiene una posición inicial y una posición actual/movida. Los toques se almacenan en un std :: vector y se eliminarán del contenedor cuando terminen. Su posición se actualizará una vez que se muevan, pero todavía quiero hacer un seguimiento de dónde empezaron inicialmente (reconocimiento de gestos).
Estoy obteniendo los toques de [event allTouches], es decir, el NSSet no está clasificado y parece que no puedo identificar los toques que ya están almacenados en el std :: vector y me refiero a los toques en el NSSet (entonces sé cuáles terminaron y se eliminarán, o se han movido, etc.)
Aquí está mi código, que funciona perfectamente con solo un dedo en la pantalla táctil, por supuesto, pero con más de uno , Obtengo resultados impredecibles ...
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
[self handleTouches:[event allTouches]];
}
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
[self handleTouches:[event allTouches]];
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
[self handleTouches:[event allTouches]];
}
- (void) touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
[self handleTouches:[event allTouches]];
}
- (void) handleTouches:(NSSet*)allTouches
{
for(int i = 0; i < (int)[allTouches count]; ++i)
{
UITouch* touch = [[allTouches allObjects] objectAtIndex:i];
NSTimeInterval timestamp = [touch timestamp];
CGPoint currentLocation = [touch locationInView:self];
CGPoint previousLocation = [touch previousLocationInView:self];
if([touch phase] == UITouchPhaseBegan)
{
Finger finger;
finger.start.x = currentLocation.x;
finger.start.y = currentLocation.y;
finger.end = finger.start;
finger.hasMoved = false;
finger.hasEnded = false;
touchScreen->AddFinger(finger);
}
else if([touch phase] == UITouchPhaseEnded || [touch phase] == UITouchPhaseCancelled)
{
Finger& finger = touchScreen->GetFingerHandle(i);
finger.hasEnded = true;
}
else if([touch phase] == UITouchPhaseMoved)
{
Finger& finger = touchScreen->GetFingerHandle(i);
finger.end.x = currentLocation.x;
finger.end.y = currentLocation.y;
finger.hasMoved = true;
}
}
touchScreen->RemoveEnded();
}
¡Gracias!
Estoy de acuerdo con usted. Divido mi código en los métodos apropiados. Sin embargo, mi problema es que necesito crear un enlace entre Obj-C y C++ y la arquitectura de mi juego requiere que la información sea sondeada en lugar de ser manejada una vez que se desencadenan los eventos. Es por eso que estoy almacenando los toques en un vector STL. De todos modos, su información sobre el objeto UITouch que es persistente en el tiempo ayudó mucho. Ahora, estoy usando la dirección del objeto como clave para identificar de forma única un toque. Funciona de maravilla. Gracias. – FlorianZ
"Si recibes el toque en touchesBegan, sabes que el toque está en UITouchPhaseBegan" - ¿en serio? A mí me suena mal: a partir de los documentos de Apple, parecen decir lo contrario: con MultiTouch, un toque de toques podría ser de cualquier fase. – Adam
@ Adam, es posible que esté malinterpretando. Aunque los toques que están contenidos dentro del evento pueden estar en otra fase. Se garantiza que todos los toques dentro del parámetro "toques" estarán en la fase especificada. De la Guía de manejo de eventos: "Si por alguna razón le interesan los toques en la secuencia multitouch actual que no han cambiado desde la última fase o que están en una fase diferente a los del conjunto pasado, puede solicitarlos del objeto UIEvent pasado ". –