How do I measure the velocity of a swipe?

前端 未结 4 1817
北荒
北荒 2021-02-11 03:21

I\'m developing a game that will use the force of the swipe as a variable user input.

I read from the documentation that on the touchesEnded event, I can get the allTouc

4条回答
  •  不要未来只要你来
    2021-02-11 03:51

    Solve like this

    - (void)rotateAccordingToAngle:(float)angle
    {
        [spinWheel setTransform:CGAffineTransformRotate(spinWheel.transform, angle)];
    }
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    {    
        [spinWheel.layer removeAllAnimations];
        previousTimestamp = event.timestamp;
    }
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [touches anyObject];
        if (touch.view==spinWheel)
        {
            UITouch *touch = [touches anyObject];
            CGPoint center = CGPointMake(CGRectGetMidX([spinWheel bounds]), CGRectGetMidY([spinWheel bounds]));
            CGPoint currentTouchPoint = [touch locationInView:spinWheel];
            CGPoint previousTouchPoint = [touch previousLocationInView:spinWheel];
            CGFloat angleInRadians = atan2f(currentTouchPoint.y - center.y, currentTouchPoint.x - center.x) - atan2f(previousTouchPoint.y - center.y, previousTouchPoint.x - center.x);
    
            [self rotateAccordingToAngle:angleInRadians];
    
            CGFloat angleInDegree = RADIANS_TO_DEGREES(angleInRadians);
            revolutions+= (angleInDegree/360.0f);
        }
    }
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [touches anyObject];
        if (touch.view==spinWheel) 
        {
            NSTimeInterval timeSincePrevious = event.timestamp - previousTimestamp;
            CGFloat revolutionsPerSecond = revolutions/timeSincePrevious;
            NSLog(@"%.3f",revolutionsPerSecond);
            [self startAnimationWithRevolutions:revolutionsPerSecond forTime:5.0f];
        }
        revolutions = 0;
    }
    
    - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
    {
        spinWheel.userInteractionEnabled = TRUE;
        if (timerUpdate) {
            [timerUpdate invalidate];
            timerUpdate = nil;
        }
    }
    -(void)updateTransform{
        spinWheel.transform = [[spinWheel.layer presentationLayer] affineTransform];
    }
    -(void)startAnimationWithRevolutions:(float)revPerSecond forTime:(float)time
    {
        spinWheel.userInteractionEnabled = FALSE;
        float totalRevolutions = revPerSecond * time;
    
        timerUpdate = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(updateTransform) userInfo:nil repeats:YES];
    
        [CATransaction begin];
        [CATransaction setValue:[NSNumber numberWithFloat:time] forKey:kCATransactionAnimationDuration];
    
        CABasicAnimation* spinAnimation = [CABasicAnimation
                                           animationWithKeyPath:@"transform.rotation"];
        CGAffineTransform transform = spinWheel.transform;
        float fromAngle = atan2(transform.b, transform.a);
        float toAngle = fromAngle + (totalRevolutions*4*M_PI);
        spinAnimation.fromValue = [NSNumber numberWithFloat:fromAngle];
        spinAnimation.toValue = [NSNumber numberWithFloat:toAngle];
        spinAnimation.repeatCount = 0;
        spinAnimation.removedOnCompletion = NO;
        spinAnimation.delegate = self;
        spinAnimation.timingFunction = [CAMediaTimingFunction functionWithName:
                                        kCAMediaTimingFunctionEaseOut];
        [spinWheel.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
        [CATransaction commit];
    }
    

提交回复
热议问题