J'ai une petite question concernant les touches de suivi sur l'iPhone et je semble ne pas être en mesure de parvenir à une conclusion sur ce point, donc des suggestions/idées sont très appréciés:iPhone: Suivi/Identification des touches individuelles
I vouloir être en mesure de suivre et d'identifier les touches sur l'iPhone, c'est à dire. fondamentalement chaque contact a une position de départ et une position actuelle/déplacée. Les touches sont stockées dans un vecteur std :: et elles doivent être retirées du conteneur, une fois terminées. Leur position doit être mise à jour une fois qu'ils ont bougé, mais je veux quand même savoir où ils ont commencé (reconnaissance gestuelle). Je reçois les contacts de [event allTouches], le NSSet n'est pas trié et je ne suis pas en mesure d'identifier les touches qui sont déjà stockées dans le fichier std :: vector et je fais référence aux touches du fichier. NSSet (donc je sais lesquels sont terminés et doivent être enlevés, ou ont été déplacés, etc.)
Voici mon code, qui fonctionne parfaitement avec un seul doigt sur l'écran tactile, bien sûr, mais avec plus d'un , J'obtiens des résultats imprévisibles ...
- (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();
}
Merci!
Je suis d'accord avec vous. Je divise mon code en méthodes appropriées. Cependant, mon problème est que j'ai besoin de créer un lien entre Obj-C et C++ et que mon architecture de jeu nécessite que l'entrée soit interrogée au lieu d'être traitée une fois que les événements sont déclenchés. C'est pourquoi je stocke les touches dans un vecteur STL. De toute façon, vos informations sur l'objet UITouch étant persistantes au fil du temps ont beaucoup aidé. Maintenant, j'utilise l'adresse de l'objet comme clé pour identifier un contact de manière unique. Fonctionne comme un charme. Je vous remercie. – FlorianZ
"Si vous recevez le toucher dans les touchesBegan, vous savez que le toucher est dans UITouchPhaseBegan" - vraiment? Cela me semble faux - d'après les docs d'Apple, ils semblent dire le contraire: avec MultiTouch, une touche de touchesBegan pourrait être dans n'importe quelle phase. – Adam
@Adam vous pourriez être mal lu. Bien que les touches qui sont contenues dans l'événement peuvent être dans une autre phase. Toutes les touches du paramètre "touch" sont garanties dans la phase spécifiée. À partir du Guide de gestion des événements: «Si, pour une raison ou une autre, vous êtes intéressé par les touches de la séquence multitouch actuelle qui n'ont pas changé depuis la dernière phase ou qui se trouvent dans une autre phase que l'ensemble passé, vous pouvez les demander à partir de l'objet UIEvent transmis. " –