2012-06-17 19 views
5

Hola, sé que ya hay algunas publicaciones sobre esto, pero todavía no puedo encontrar una respuesta adecuada para el problema que estoy teniendo.marca de tiempo y velocidad de cálculo de un deslizamiento

Recién comenzada en cocoa e iOS, estoy desarrollando mi primer juego de iOS. En este juego, me gustaría poder calcular la velocidad de deslizamiento de un usuario. Estoy teniendo problemas para encontrar la distancia entre toques sucesivos en el movimiento de golpe, pero estoy teniendo dificultades para determinar el tiempo transcurrido entre los toques

  • en touchesMoved: hago cálculos con el toque actual, así como un seguimiento de el último toque previamente grabado como un UITouch

  • en touchesEnded: ahora quiere calcular la velocidad del golpe, pero cuando hago algo como:

    doble timedelay = event.timestamp - self.previousTouch.timestamp;

esta siempre devuelve 0.

Sin embargo, el uso de gcc que soy capaz de ver que las dos marcas de tiempo no son de hecho el mismo. Además, al inspeccionar vi que los valores de NSTimeInterval para estos eventos tenían una magnitud de ~ 10^(- 300). Esto parece extraño ya que se supone que NSTimeInterval debe informar los segundos desde el inicio del sistema, ¿no es así?

También he intentado hacer un seguimiento del NSDate del toque anterior y usarlo junto con [NSDate timeIntervalSinceNow]. Esto arrojó resultados aún más extraños, devolviendo un valor alrededor de 6 cada vez. Nuevamente, dado que timerIntervalSinceNow devuelve NSTimeInterval, este valor es muy extraño.

¿Qué no entiendo sobre las marcas de tiempo? ¿eventos? ¡Cualquier ayuda en esto sería muy apreciada! Gracias por su tiempo

algún código de apoyo:

En sampleController.h:

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

En 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 tiene esta funcionalidad incorporada en 'UIGestureRecognizer'. –

Respuesta

4

El UIPanGestureRecognizer tiene un proerty velocityInView que puede encontrar uso Los documentos son here

También puede encontrar este ray wenderlich tutorial informativo.

(y esto no es un golpe -., Pero unas cuantas búsquedas de Google apareció un montón de material en este tipo de cosas guarda todos los tirones de pelo para las preguntas de la vida de los más grandes ;-)

+0

Conozco el UIPanGestureRecognizer pero también tengo problemas con eso. Quizás más información sobre en qué estoy trabajando; el juego es de una variedad de brick-beaker, y como tal estoy constantemente usando touchesBegan: y touchesMoved: para actualizar el estado de la paleta ect. He intentado utilizar un UIPanGestureRecognizer para actualizar únicamente la velocidad de barrido utilizando [sender velocityInView:] dentro del método de selección de acciones del objetivo.Sin embargo, al hacer esto, cada vez que se reconoce un UIPanGesture, interrumpe la funcionalidad touchesMoved: de alguna forma. ¿Consejo? –

+0

lo siento, me enteré de la propiedad cancelesTouchesInView. Funciona perfectamente ahora –

+0

¡me alegra que lo haya ordenado! –

Cuestiones relacionadas