2012-06-17 4 views
5

Hey Ich weiß, es gibt bereits ein paar Posts darüber - aber ich kann immer noch keine angemessene Antwort für das Problem finden, das ich habe.timestamp und berechnende Geschwindigkeit eines Swipe

Nur neu für Kakao und iOS, ich bin gerade dabei, mein erstes iOS-Spiel zu entwickeln. In diesem Spiel möchte ich in der Lage sein, die Geschwindigkeit eines Wischens eines Benutzers zu berechnen. Ich habe keine Schwierigkeiten, den Abstand zwischen den aufeinanderfolgenden Berührungen in der Swipe-Bewegung zu finden, aber Schwierigkeiten habe, die Zeit zwischen den Berührungen

  • in touchesMoved: verstrichene Bestimmung ich tun Berechnungen mit der aktuellen Note sowie zu verfolgen die letzte zuvor aufgezeichnete Note als UITouch

  • in touchesEnded: mag ich nun die Geschwindigkeit der Swipe berechnen, aber wenn ich so etwas wie:

    Doppelverzögerungszeit = event.timestamp - self.previousTouch.timestamp;

diese gibt immer 0 zurück

jedoch gcc Ich bin in der Lage zu sehen, dass die beiden Zeitstempel in der Tat sind nicht das gleiche. Außerdem habe ich bei der Inspektion gesehen, dass die NSTimeInterval-Werte für diese Ereignisse in der Größenordnung von ~ 10^(- 300) lagen. Das scheint seltsam, da ein NSTimeInterval Sekunden nach dem Systemstart berichten soll, oder?

Ich habe auch versucht, das NSDate der vorherigen Berührung zu verfolgen und es in Verbindung mit [NSDate timeIntervalSinceNow] zu verwenden. Dies ergab noch seltsamere Ergebnisse und ergab jedes Mal einen Wert um 6. Da timerIntervalSinceNow eine NSTimeInterval zurückgibt, ist dieser Wert sehr merkwürdig.

Was verstehe ich nicht über Zeitstempel? Veranstaltungen? Jede Hilfe zu diesem würde sehr geschätzt werden! Vielen Dank für Ihre Zeit

einige Stützcode:

In sampleController.h:

@property(nonatomic) UITouch* previousTouch 
@property(nonatomic) UITouch* currentTouch 

In sampleController.m:

@synthesize previousTouch = _previousTouch, currentTouch = _currentTouch; 
... 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
     self.currentTouch = [[event allTouches] anyObject]; 
     // do stuff with currentTouch 
} 
... 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
     self.previousTouch = self.currentTouch; 
     self.currentTouch = [[event allTouches] anyObject]; 
     // do stuff with currentTouch 
} 
... 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
     float distanceMoved = [self.touch locationInView:self.playView].x - 
       [self.touch previousLocationInView:self.playView].x; 
     // attempt 1 
     double timeElapsed = self.currentTouch.timestamp - self.previousTouch.timestamp; 

     // attempt 2 
     double timeElapsed = event.timestamp - self.previousTouch.timestamp; 

     // do stuff with distanceMoved and timeDelay 
} 
+0

iOS5 ;-) Lebensfragen hat dies Funktionalität, die in 'UIGestureRecognizer' integriert ist. –

Antwort

4

Die UIPanGestureRecognizer hat eine velocityInView proerty damit ihr Fundsache. Docs sind here

Auch finden Sie diese ray wenderlich tutorial informativ.

(und das ist kein Klaps -. Aber ein paar Google-Suchen aufdrehen Lasten des Materials auf diese Art der Sache speichert alle Haareziehen für die die größeren

+0

Ich bin mir der UIPanGestureRecognizer bewusst, habe aber auch Probleme damit. Vielleicht etwas mehr Hintergrund zu dem, woran ich arbeite; das spiel ist von einer brick-beaker-vielfalt, und als solche verwende ich ständig touchesBegan: und touchesMoved: um den zustand des paddle ect zu aktualisieren. Ich habe versucht, einen UIPanGestureRecognizer zu verwenden, um die Geschwindigkeit des Wischens mit [sender velocityInView:] innerhalb der Aktionselektormethode des Ziels nur zu aktualisieren.Allerdings, wenn dies getan wird, wann immer ein UIPanGesture erkannt wurde, unterbricht es die touchesMoved: Funktionalität einige wie. Rat? –

+0

Entschuldigung, habe über die Eigenschaft cancelsTouchesInView herausgefunden. Funktioniert jetzt perfekt. –

+0

froh, dass Sie es sortiert haben! –