2014-10-24 19 views
5

Tôi có một trò chơi mà các đối tượng hình tròn bắn lên từ dưới cùng của màn hình và tôi muốn có thể vuốt chúng để vuốt chúng theo hướng vuốt của tôi. Vấn đề của tôi là, tôi không biết làm thế nào để tính toán vector/hướng của swipe để có được các đối tượng tròn để có được flicked theo hướng thích hợp với vận tốc thích hợp.Sprite Kit - Xác định vector của cử chỉ vuốt để flick sprite

Vectơ tĩnh "(5,5)" Tôi đang sử dụng cần được tính theo tốc độ và hướng vuốt của thao tác vuốt. Ngoài ra, tôi cần phải chắc chắn rằng một khi tôi thực hiện liên lạc đầu tiên với đối tượng, nó không còn xảy ra, như để kiềm chế không đánh đôi đối tượng. Dưới đây là những gì tôi đang làm hiện tại:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

for (UITouch *touch in touches) { 
    CGPoint location = [touch locationInNode:self]; 

    SKNode* node = [self nodeAtPoint:location]; 
    [node.physicsBody applyImpulse:CGVectorMake(5, 5) atPoint:location]; 
} 
} 

Trả lời

9

Dưới đây là ví dụ về cách phát hiện cử chỉ vuốt:

Đầu tiên, xác định biến mẫu để lưu trữ vị trí và thời gian bắt đầu.

CGPoint start; 
    NSTimeInterval startTime; 

Khi chạm, hãy lưu vị trí/thời gian của sự kiện chạm.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    /* Avoid multi-touch gestures (optional) */ 
    if ([touches count] > 1) { 
     return; 
    } 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    // Save start location and time 
    start = location; 
    startTime = touch.timestamp; 
} 

Xác định các thông số của các cử chỉ swipe. Điều chỉnh những điều này cho phù hợp.

#define kMinDistance 25 
#define kMinDuration 0.1 
#define kMinSpeed  100 
#define kMaxSpeed  500 

Chạm vàoĐược xác định xem cử chỉ của người dùng có bị trượt hay không bằng cách so sánh sự khác biệt giữa vị trí bắt đầu và kết thúc và dấu thời gian.

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    // Determine distance from the starting point 
    CGFloat dx = location.x - start.x; 
    CGFloat dy = location.y - start.y; 
    CGFloat magnitude = sqrt(dx*dx+dy*dy); 
    if (magnitude >= kMinDistance) { 
     // Determine time difference from start of the gesture 
     CGFloat dt = touch.timestamp - startTime; 
     if (dt > kMinDuration) { 
      // Determine gesture speed in points/sec 
      CGFloat speed = magnitude/dt; 
      if (speed >= kMinSpeed && speed <= kMaxSpeed) { 
       // Calculate normalized direction of the swipe 
       dx = dx/magnitude; 
       dy = dy/magnitude; 
       NSLog(@"Swipe detected with speed = %g and direction (%g, %g)",speed, dx, dy); 
      } 
     } 
    } 
} 
+0

của bạn một ông chủ! Cảm ơn anh! –

+0

Điều này hoạt động như kéo không trượt. –

+0

@ iTroyd23 điều chỉnh 'kMinSpeed' và' kMaxSpeed' (và các hằng số khác) khi cần – 0x141E

0

Lưu vị trí cảm ứng dưới dạng CGPoint bạn có thể truy cập trong suốt ứng dụng của mình.

Trong touchesEnded tính toán khoảng cách và hướng của chạm ban đầu của bạn (chạm vàoBegan) và kết thúc chạm (chạm vàoĐược quay). Sau đó áp dụng Impulse thích hợp.

Để tránh nhấn đúp, hãy thêm bool canHit mà bạn đặt thành NO khi xung được áp dụng và đặt trở lại CÓ khi bạn sẵn sàng nhấn lại. Trước khi áp dụng xung, hãy đảm bảo canHit được đặt thành CÓ.

+0

Tôi hiểu điều đó, nhưng tôi đang gặp khó khăn trong việc tìm ra mã cho nó. Bạn có thể cung cấp mẫu mã không? –

1

Có một cách khác để làm điều đó, bạn có thể thêm một cử chỉ chảo và sau đó nhận được vận tốc từ nó:

Đầu tiên thêm cử chỉ chảo theo quan điểm của bạn:

UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)]; 
    [self.view addGestureRecognizer:gestureRecognizer]; 

Sau đó xử lý cử chỉ:

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer 
{ 
    if (recognizer.state == UIGestureRecognizerStateBegan) { 
     CGPoint location = [recognizer locationInView:recognizer.view]; 
     if ([_object containsPoint:location]){ 
      self.movingObject = YES; 
      <.. object start moving ..> 
     } 

    } else if (recognizer.state == UIGestureRecognizerStateChanged) { 

     if (!self.movingObject) 
      return; 

     CGPoint translation = [recognizer translationInView:recognizer.view]; 
     object.position = CGPointMake(object.position.x + translation.x, object.position.y + translation.y); 

     [recognizer setTranslation:CGPointZero inView:recognizer.view]; 

    } else if (recognizer.state == UIGestureRecognizerStateEnded) { 

     if (!self.movingObject) 
      return; 

     self.movingObject = NO; 
     float force = 1.0f; 
     CGPoint gestureVelocity = [recognizer velocityInView:recognizer.view]; 
     CGVector impulse = CGVectorMake(gestureVelocity.x * force, gestureVelocity.y * force); 

     <.. Move object with that impulse using an animation..> 
    } 
} 
Các vấn đề liên quan