2010-10-04 3 views
0

suffit.Lorsque l'utilisateur a deux doigts sur l'écran et en soulève un, je ne veux rien qu'il se passe

comme le dit le titre, je suis un peu d'un cornichon.

Voici donc les grandes lignes de mon problème. J'ai ce navire droit. Il repose au centre en bas de l'écran (240,0). Lorsque l'utilisateur touche à droite à un point supérieur à 240, le navire se déplace vers la droite. Et à gauche si l'utilisateur touche à un point inférieur à 240. CEPENDANT c'est génial quand il n'y a qu'un seul doigt sur l'écran à la fois. J'en ai besoin là où l'utilisateur touche à droite, ne lève pas le doigt, puis touche à gauche (OH CRAPHE IL Y A DEUX DOIGTS SUR L'ECRAN) le vaisseau continue de bouger jusqu'à ce qu'ils lèvent leur doigt droit, puis soudainement le vaisseau se déplace vers la gauche le deuxième contact.

J'utilise des minuteries pour ajouter/soustraire un certain nombre de cours x de coordonnées pour l'obtenir pour se déplacer.

C'est ce que j'ai en un mot: (Ne riez pas ou déteste, je suis un noob)

-(void)moveShipLeft:(id)sender { 

shipView.center = CGPointMake(shipView.center.x - 2, 320 - (shipView.image.size.height/2)); 

} 
-(void)moveShipRight:(id)sender { 

shipView.center = CGPointMake(shipView.center.x + 2, 320 - (shipView.image.size.height/2)); 

} 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch *touch = [[event allTouches] anyObject]; 
CGPoint location = [touch locationInView:touch.view]; 

if (240 < location.x){rightTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(moveShipRight:) userInfo:nil repeats:YES];} 
if (240 > location.x){leftTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(moveShipLeft:) userInfo:nil repeats:YES];} 

[shipView setCenter:shipView.center]; 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 


    if (rightTimer != nil)    //Kill the timer that goes right upon touch removal 
    [rightTimer invalidate]; 
    rightTimer = nil; 

    if (leftTimer != nil)    //Kill the timer that goes left on touch removal 
    [leftTimer invalidate]; 
    leftTimer = nil; 
} 

Je suis en train de reproduire entièrement les contrôles pour le jeu « Radiant » si son de l'aide. Je t'aimerai sérieusement pour toujours si tu aides.

Juste pour clarifier les choses, je veux que cela se produise:

  1. utilisateur touche le côté droit de l'écran
  2. navire se déplace à droite
  3. utilisateur touche côté gauche de l'écran avec le deuxième doigt
  4. alors que la navire est toujours en mouvement à droite parce que l'utilisateur n'a pas levé leur premier contact, l'utilisateur soulève alors le premier contact
  5. alors le navire change instantanément bien sûr de se déplacer à gauche vers le deuxième contact

en ce moment je touche à plusieurs permis, maintenant il fonctionne comme ceci:

  1. utilisateur touche le côté droit de l'écran
  2. navire se déplace à droite
  3. utilisateur touche côté gauche de l'écran avec deuxième doigt
  4. navire déplace vers la gauche, puis l'utilisateur ascenseur premier contact
  5. navire est arrêté dans ses voies, même si l'utilisateur n'a pas levé le deuxième contact

Répondre

0

Tout d'abord, de ne pas activer le leftTimer si le RightTouch n'est pas libéré.

Vous pouvez configurer deux touches globales. Donc, si [touchez locationInView: auto.vue] position blah est> 250 globalRightTouch = toucher. Pareil pour gauche. Puis, lorsque vous appuyez sur le côté droit - vous affectez le toucher à la droite globale, et le vaisseau commence à se déplacer vers la droite - puis vous touchez le côté gauche simultanément - donc une autre touche commence à commencer - alors vous l'attribuez au globalLeftTouch. Ensuite, vous pouvez aller quelque chose comme: if (! GlobalRightTouch) {start leftTimer) et vice versa.

Dans votre fonction touhcesEnded - vous dites à la fonction leftTimer de tuer si elle n'est pas nulle à la fin de la touche - donc même si vous avez encore le toucher gauche - vous dites aux deux temporisateurs de tuer sur n'importe quelle touche. Vous avez juste besoin d'être un peu plus précis avec vos touches terminées.

Puis dans vos touches a pris fin le code que vous devez aller quelque chose le long de ce qui suit:

UITouch *touch = [[event allTouches] anyObject]; 

    if (rightTimer != nil && touch == globalRightTouch){    //Kill the timer that goes right upon touch removal 
    [rightTimer invalidate]; 
    rightTimer = nil; 
    if(globalLeftTouch) 
    leftTimerStartFunction //I dont know what your variables are sorry 
    } 

    if (leftTimer != nil && touch == globalLeftTouch){    //Kill the timer that goes left on touch removal 
    [leftTimer invalidate]; 
    leftTimer = nil; 
    if(globalRightTouch){ 
     rightTimerStartFunction //I dont know what you variables are sorry 
    } 
} 
} 

donc essentiellement que vous voulez dire - Si je lâchai une touche - vérifier que l'on est et de tuer la minuterie pour cette touche si elle n'est pas nulle et s'il y a une autre touche actuellement sur l'écran - démarrer la minuterie pour ce côté.

Hope this helps,

Cheers,

Michael

+0

merci, je suis assez sûr que cela fonctionnerait. J'ai juste un peu travaillé ça dans ma tête et ça semblait aller. Alors qu'est-ce que je mettrais exactement dans mes contacts a commencé. Je pense que j'ai une idée mais ça ne marche pas comme je le veux. Merci beaucoup pour votre aide, je l'apprécions beaucoup^_^ –

+0

Je suppose que si elle rend plus facile le navire ne doit pas aller vers le deuxième contact jusqu'à ce que l'utilisateur lève leur premier contact –

+0

pas problemos, l'espoir tout fonctionne pour vous :) –

0

Chaque UITouch est unique à partir du moment que l'utilisateur commence à toucher jusqu'à ce qu'ils arrêtent. Donc, votre problème est vraiment cette ligne:

UITouch *touch = [[event allTouches] anyObject]; 

Vous ne voulez pas seulement une touche. Vous voulez une touche qui soit la même que celle vers laquelle vous vous êtes dirigé, si elle existe. Cherchez ce contact dans l'ensemble, et si ce n'est pas le cas, commencez à vous déplacer vers un autre contact.

0

Voici un vrai/pseudo version du code - aide ... espérons qu'il

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)even{ 
UITouch *touch = [touches anyObject]; 

if(touch.x < 240){ 
    globalTouchLeft = touch; 
    if(!globalTouchRight){ 
     startLeftTimer; //again I don't know what your timere/variable is 
    } 
}else if(touch.x >= 240){ 

    globalTouchRight = touch; 
    if(!globalTouchLeft){ 
     startRightTimer; //again I don't know what your timere/variable is 
    } 

    } 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 

    UITouch *touch = [touches anyObject]; 

    if(touch == globalLeftTouch){ 
     stopLeftTimer 
     globalLeftTouch = nil; 

     if(globalRightTouch){ 
      startRightTimer; 
     } 

    } 

    if(touch == globalTouchRight){ 
     stopRightTimer 
     globalRightTouch = nil; 

     if(globalLeftTouch){ 
      startLeftTimer; 
     } 
    } 
} 

acclamations,

Michael O'Brien

+0

d'accord! merci l'homme, je pense que je l'ai eu! –

Questions connexes