Sprite Kit - Determine vector of swipe gesture to flick sprite

后端 未结 3 1674
感动是毒
感动是毒 2021-02-02 04:14

I have a game where circular objects shoot up from the bottom of the screen and I would like to be able to swipe them to flick them in the direction of my swipe. My issue is, I

相关标签:
3条回答
  • 2021-02-02 04:19

    Here's an example of how to detect a swipe gesture:

    First, define instance variables to store the starting location and time .

        CGPoint start;
        NSTimeInterval startTime;
    

    In touchesBegan, save the location/time of a touch event.

    -(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;
    }
    

    Define parameters of the swipe gesture. Adjust these accordingly.

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

    In touchesEnded, determine if the user's gesture was a swipe by comparing the differences between starting and ending locations and time stamps.

    - (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 讨论(0)
  • 2021-02-02 04:24

    In touchesBegan save the touch location as a CGPoint you can access throughout your app.

    In touchesEnded calculate the distance and direction of your initial touch (touchesBegan) and ending touch (touchesEnded). Then apply the appropriate Impulse.

    To refrain from double hitting, add a bool canHit that you set to NO when the impulse is applied and set back to YES when you are ready to hit again. Before applying the impulse, make sure canHit is set to YES.

    0 讨论(0)
  • 2021-02-02 04:43

    There is another way to do it, you can add a pan gesture and then get the velocity from it:

    First add pan gesture in your view:

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

    Then handle the gesture:

    - (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..>
        }
    }
    
    0 讨论(0)
提交回复
热议问题