2014-10-24 10 views
5

Ho un gioco in cui oggetti circolari spuntano dalla parte inferiore dello schermo e vorrei poterli scorrere per sfiorarli nella direzione del mio scorrimento. Il mio problema è che non so come calcolare il vettore/direzione del colpo per far sì che l'oggetto circolare si muova nella giusta direzione con la giusta velocità.Kit Sprite - Determina il vettore del gesto di scorrimento per colpire lo sprite

Il vettore statico "(5,5)" che sto utilizzando deve essere calcolato dalla velocità di scorrimento e dalla direzione dello scorrimento. Inoltre, ho bisogno di fare in modo che, una volta stabilito il primo contatto con l'oggetto, non accada più, per evitare di colpire due volte l'oggetto. Ecco quello che sto facendo attualmente:

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

for (UITouch *touch in touches) { 
    CGPoint location = [touch locationInNode:self]; 

    SKNode* node = [self nodeAtPoint:location]; 
    [node.physicsBody applyImpulse:CGVectorMake(5, 5) atPoint:location]; 
} 
} 

risposta

9

Ecco un esempio di come rilevare un gesto di scorrimento:

In primo luogo, definire le variabili di istanza per memorizzare la posizione di partenza e il tempo.

CGPoint start; 
    NSTimeInterval startTime; 

In contatto, salvare la posizione/ora di un evento di tocco.

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

    /* Avoid multi-touch gestures (optional) */ 
    if ([touches count] > 1) { 
     return; 
    } 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    // Save start location and time 
    start = location; 
    startTime = touch.timestamp; 
} 

Definire i parametri del gesto di scorrimento. Regolarli di conseguenza.

#define kMinDistance 25 
#define kMinDuration 0.1 
#define kMinSpeed  100 
#define kMaxSpeed  500 

In touchesEnded, determinare se il gesto del utente è stato un colpo confrontando le differenze tra di partenza e le posizioni finali e timestamp.

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

    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    // Determine distance from the starting point 
    CGFloat dx = location.x - start.x; 
    CGFloat dy = location.y - start.y; 
    CGFloat magnitude = sqrt(dx*dx+dy*dy); 
    if (magnitude >= kMinDistance) { 
     // Determine time difference from start of the gesture 
     CGFloat dt = touch.timestamp - startTime; 
     if (dt > kMinDuration) { 
      // Determine gesture speed in points/sec 
      CGFloat speed = magnitude/dt; 
      if (speed >= kMinSpeed && speed <= kMaxSpeed) { 
       // Calculate normalized direction of the swipe 
       dx = dx/magnitude; 
       dy = dy/magnitude; 
       NSLog(@"Swipe detected with speed = %g and direction (%g, %g)",speed, dx, dy); 
      } 
     } 
    } 
} 
+0

il tuo capo! Grazie Fratello! –

+0

Funziona come il trascinamento senza scorrere. –

+0

@ iTroyd23 regolare 'kMinSpeed' e' kMaxSpeed' (e le altre costanti) secondo necessità – 0x141E

0

Nel touchesBegan salvare la posizione touch come CGPoint è possibile accedere a tutta la vostra app.

In touchesEnded calcolare la distanza e la direzione del tocco iniziale (tocca Fine) e il tocco finale (tocca Fine). Quindi applicare l'impulso appropriato.

Per evitare di colpire due volte, aggiungere un can bool che si imposta su NO quando l'impulso viene applicato e si imposta su SÌ quando si è pronti a colpire di nuovo. Prima di applicare l'impulso, assicurati che canHit sia impostato su SÌ.

+0

Lo capisco, ma sto facendo fatica a capire il codice per questo. Potresti fornire un esempio di codice? –

1

C'è un altro modo per farlo, è possibile aggiungere un gesto padella e quindi ottenere la velocità da esso:

Prima aggiungere gesto padella nella vista:

UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)]; 
    [self.view addGestureRecognizer:gestureRecognizer]; 

quindi gestire il gesto:

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer 
{ 
    if (recognizer.state == UIGestureRecognizerStateBegan) { 
     CGPoint location = [recognizer locationInView:recognizer.view]; 
     if ([_object containsPoint:location]){ 
      self.movingObject = YES; 
      <.. object start moving ..> 
     } 

    } else if (recognizer.state == UIGestureRecognizerStateChanged) { 

     if (!self.movingObject) 
      return; 

     CGPoint translation = [recognizer translationInView:recognizer.view]; 
     object.position = CGPointMake(object.position.x + translation.x, object.position.y + translation.y); 

     [recognizer setTranslation:CGPointZero inView:recognizer.view]; 

    } else if (recognizer.state == UIGestureRecognizerStateEnded) { 

     if (!self.movingObject) 
      return; 

     self.movingObject = NO; 
     float force = 1.0f; 
     CGPoint gestureVelocity = [recognizer velocityInView:recognizer.view]; 
     CGVector impulse = CGVectorMake(gestureVelocity.x * force, gestureVelocity.y * force); 

     <.. Move object with that impulse using an animation..> 
    } 
} 
Problemi correlati