2012-06-17 24 views
5

Hey, bunun hakkında zaten birkaç mesaj olduğunu biliyorum, ancak hala sahip olduğum sorun için yeterli bir yanıt bulamıyorum.zaman damgası ve kaydırma hızının hesaplanması

Sadece yeni kakao ve iOS için, ilk iOS oyunumu geliştirmenin tam ortasındayım. Bu oyunda bir kullanıcının tokat hızını hesaplayabilmek istiyorum. Ben tokatlamak hareket ardışık dokunuşlar arasındaki mesafeyi bulmakta hiç zorluk yaşıyorum ama touchesMoved: içinde

  • dokunuşlar arasında geçen zamanı belirleyen zorluk yaşıyorum ben şimdiki dokunuşla hesaplamaları yapmak hem de takip touchesEnded: bir UITouch

  • geçen önceden kaydedilmiş dokunmatik şimdi tokatlamak hızını hesaplamak istiyorum ama böyle bir şey yapmak zaman:

    çift timeDelay = event.timestamp - self.previousTouch.timestamp;

bu her zaman iki damgaları aslında aynı DEĞİLDİR olduğunu görmek mümkün değilim gcc kullanarak Ancak 0.

döndürür. Ayrıca, denetledikten sonra, bu olayların NSTimeInterval değerlerinin ~ 10^(- 300) büyüklüğünde olduğunu gördüm. Bir NSTimeInterval'ın sistem başlangıcından beri saniyeler bildirmesi beklendiği gibi bu garip görünüyor.

Ayrıca, önceki dokunuştaki NSDate'i takip etmeyi ve [NSDate timeIntervalSinceNow] ile birlikte kullanmayı denedim. Bu, her seferinde 6 civarında bir değer döndüren daha da garip sonuçlar verdi. Yine, timerIntervalSinceNow bir NSTimeInterval döndürdüğünden, bu değer çok tuhaftır.

Zaman damgaları hakkında neyi anlamadım? olaylar? Bu konuda herhangi bir yardım çok takdir edilecektir! Zaman ayırdığınız için Teşekkür

bazı destek kodu: sampleController.h yılında

: sampleController.m yılında

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

:

@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 için bu vardır kaydeder "UIGestureRecognizer" için yerleşik işlevsellik. –

cevap

4

UIPanGestureRecognizer bir velocityInView proerty sahip olduğunu sen olabilir kullanım bul. Dokümanlar bu ray wenderlich tutorial bilgisini de bulabilirsiniz.

(ve bu bir şaplak değil -. Ama birkaç google aramaları şey bu tür üzerindeki malzemenin yükleri açmak tüm saç çekme büyük yaşam soruları ;-)

+0

UIPanGestureRecognizer'ın farkındayım, ancak bununla da sorun yaşıyorum. Belki üzerinde çalıştığım şeyler hakkında biraz daha fazla bilgi; Oyun bir tuğla kabı çeşididir ve bu yüzden sürekli olarak dokunuyorumBegan kullanır: ve dokunurMaced: paddle vb durumunu güncellemek için. Hedefin hareket seçici yönteminin içinde [sender velocityInView:] kullanarak kaydırma hızını yalnızca güncellemek için UIPanGestureRecognizer kullanmayı denedim.Bununla birlikte, bunu yaparken, bir UIPanGesture ne zaman tanınıyorsa, o zaman nasıl yapılır? Tavsiye? –

+0

Üzgünüz, cancelsTouchesInView özellik hakkında bilgi verdi. Şimdi mükemmel çalışıyor. –

+0

sıralanmış olsun sevindim! –