отметка времени и расчет скорости пролистывания

Эй, я знаю, что уже есть несколько сообщений об этом, но я все еще не могу найти адекватного ответа на проблему, с которой я сталкиваюсь.

Я новичок в какао и iOS, и я нахожусь в процессе разработки своей первой игры для iOS. В этой игре я хотел бы иметь возможность рассчитать скорость удара пользователя. У меня нет проблем с поиском расстояния между последовательными касаниями в движении пальцем, но я испытываю трудности с определением времени, прошедшего между касаниями

in touchesMoved: I do calculations with the current touch as well as keep track of the last previously recorded touch as a UITouch

in touchesEnded: I now want to calculate the speed of swipe, but when I do something like:

double timeDelay = event.timestamp - self.previousTouch.timestamp;

это всегда возвращает 0.

Однако, используя gcc, я могу видеть, что две метки времени на самом деле НЕ одинаковы. Кроме того, после проверки я увидел, что значения NSTimeInterval для этих событий были на уровне ~ 10 ^ (- 300). Это кажется странным, так как NSTimeInterval должен сообщать о секундах с момента запуска системы, не так ли?

Я также пытался отслеживать NSDate предыдущего касания и использовать его вместе с [NSDate timeIntervalSinceNow]. Это дало еще более странные результаты, возвращая значение около 6 каждый раз. Опять же, так как timerIntervalSinceNow возвращаетNSTimeIntervalэто значение очень странное.

Что я не понимаю о метках времени? События? Любая помощь по этому вопросу будет принята с благодарностью! Спасибо за ваше время

некоторый поддерживающий код:

В sampleController.h:

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

В 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
}
 Evan Mulawski17 июн. 2012 г., 02:50
iOS5 имеет эту функцию, встроенную вUIGestureRecognizer.

Ответы на вопрос(1)

Решение Вопроса

UIPanGestureRecognizer имеетvelocityInView Это может быть полезным. ДокументыВот

Также вы можете найти этот луч wenderlichруководство познавательный.

(и это не чмок - но несколько поисковых запросов в Google приводят к большому количеству материалов по этому виду вещей. Сохраняет всю привлекательность для больших жизненных вопросов ;-)

 17 июн. 2012 г., 16:50
рад, что вы получили это отсортировано!
 17 июн. 2012 г., 16:30
извините, узнал о свойстве cancellsTouchesInView. Работает отлично сейчас.
 22 июн. 2012 г., 00:41
Кроме того, я нахожу, что показатель скорости по умолчанию раздражает, потому что, если вы поворачиваете, останавливаете и затем отпускаете палец, скорость является значением до остановки, тогда как мне бы хотелось, чтобы оно равнялось нулю, если вы действительно остановились. Я единственный, кого это так раздражает?
 17 июн. 2012 г., 16:26
Мне известно о UIPanGestureRecognizer, но у меня тоже проблемы с этим. Возможно, еще кое-что о том, над чем я работаю; игра представляет собой разновидность кирпичной мензурки, и поэтому я постоянно использую touchesBegan: и touchesMoved: для обновления состояния весла и т. д. Я пытался использовать UIPanGestureRecognizer, чтобы только обновить скорость смахивания, используя [sender SpeedInView:] внутри целевого метода выбора действий. Однако при этом всякий раз, когда UIPanGesture распознается, он прерывает touchesMoved: функциональность, как-то. Совет?

Ваш ответ на вопрос