2012-06-17 27 views
5

Hey Tôi biết đã có một vài bài viết về điều này - nhưng tôi vẫn không thể tìm thấy một câu trả lời đầy đủ cho vấn đề tôi đang gặp phải.dấu thời gian và tốc độ tính toán của một swipe

Chỉ mới đối với ca cao và iOS, tôi đang phát triển trò chơi iOS đầu tiên của mình. Trong trò chơi này, tôi muốn có thể tính toán tốc độ vuốt của người dùng. Tôi đang gặp khó khăn trong việc tìm kiếm không có khoảng cách giữa chạm liên tiếp trong chuyển động swipe, nhưng đang gặp khó khăn trong việc xác định thời gian trôi qua giữa chạm

  • trong touchesMoved: tôi làm các phép tính với các liên lạc hiện tại cũng như theo dõi ghi nhận trước đó liên lạc cuối cùng như một UITouch

  • trong touchesEnded: bây giờ tôi muốn để tính toán tốc độ của swipe, nhưng khi tôi làm điều gì đó như:

    timeDelay đôi = event.timestamp - self.previousTouch.timestamp;

này luôn trả về 0.

Tuy nhiên, sử dụng gcc Tôi có thể thấy rằng hai timestamps là trong thực tế không giống nhau. Ngoài ra, khi kiểm tra tôi thấy rằng các giá trị NSTimeInterval cho các sự kiện này là trên độ lớn ~ 10^(- 300). Điều này có vẻ kỳ quặc như một NSTimeInterval là vụ phải báo cáo giây kể từ khi hệ thống khởi động là nó không?

Tôi cũng đã cố gắng theo dõi NSDate của lần chạm trước đó và sử dụng nó cùng với [NSDate timeIntervalSinceNow]. Điều này mang lại kết quả xa lạ hơn, trả về một giá trị khoảng 6 lần. Một lần nữa, kể từ timerIntervalSinceNow trả về một NSTimeInterval, giá trị này là rất lạ.

Tôi không hiểu gì về dấu thời gian? sự kiện? Bất kỳ trợ giúp nào về điều này sẽ được đánh giá cao! Cảm ơn thời gian của bạn

một số mã hỗ trợ:

Trong sampleController.h:

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

Trong 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 có chức năng tích hợp vào 'UIGestureRecognizer'. –

Trả lời

4

Các UIPanGestureRecognizer có proerty velocityInView mà bạn có thể tìm cách sử dụng. Tài liệu là here

Ngoài ra, bạn có thể tìm thấy thông tin này là wenderlich ray tutorial.

(và đây không phải là một chút - nhưng một vài tìm kiếm trên google sẽ tải nhiều tài liệu về loại điều này. Tiết kiệm tất cả việc kéo tóc cho câu hỏi cuộc sống lớn hơn ;-)

+0

Tôi biết về UIPanGestureRecognizer nhưng cũng đang gặp sự cố. Có lẽ một số thông tin cơ bản về những gì tôi đang làm việc; các trò chơi là của một loạt cốc-cốc, và như vậy tôi liên tục sử dụng touchesBegan: và touchesMoved: để cập nhật trạng thái của paddle ect. Tôi đã thử sử dụng UIPanGestureRecognizer để chỉ cập nhật tốc độ vuốt bằng cách sử dụng [sender velocityInView:] bên trong phương thức chọn hành động của mục tiêu.Tuy nhiên, khi làm điều này, bất cứ khi nào một UIPanGesture được nhận ra, nó sẽ làm gián đoạn touchesMoved: chức năng một số cách. Khuyên bảo? –

+0

xin lỗi, tìm hiểu về tài sản cancelsTouchesInView. Hoạt động hoàn hảo ngay bây giờ. –

+0

vui vì bạn đã sắp xếp! –