以加速度的角度移动 UIImage

Move a UIImage at a angle with acceleration

我有一系列 UIImageViews 都连接在 IBOutlet 集合中,我想以设定的加速度以它们面向的任何角度移动它们。

我做的第一件事是随机将它们放在一个角度(即:35、90、70、270 度),现在我想移动它们。

图像是平面图标,我想以特定角度(无论它们当前面对的角度)和特定加速度(例如 2-4 像素或其他)移动每个平面图标。

唯一的问题是我不太确定如何以给定的加速度以给定的角度移动 UIImage

有没有办法用 Core Animation 做到这一点?

非常感谢


更新:

我用单独的对象重写了方法来处理飞机本身并尝试使用 UIBezierPath;

   // Angles for airplane icons
    VICAirplane *plane1 = [[VICAirplane alloc] initWithX:48 withY:104 withAngle:140 withSpeed:5];
    VICAirplane *plane2 = [[VICAirplane alloc] initWithX:50 withY:250 withAngle:60 withSpeed:7];
    VICAirplane *plane3 = [[VICAirplane alloc] initWithX:280 withY:75 withAngle:240 withSpeed:12];
    VICAirplane *plane4 = [[VICAirplane alloc] initWithX:230 withY:270 withAngle:120 withSpeed:3];
    VICAirplane *plane5 = [[VICAirplane alloc] initWithX:148 withY:225 withAngle:85 withSpeed:10];
    VICAirplane *plane6 = [[VICAirplane alloc] initWithX:175 withY:225 withAngle:85 withSpeed:8];

    self.airplanes = @[plane1,plane2,plane3,plane4,plane5,plane6];

    UIImage *sprite = [UIImage imageNamed:@"Plane Shadow"];
    CGFloat spriteWidth = sprite.size.width;
    CGFloat spriteHeight = sprite.size.height;

    for (VICAirplane *planeObj in self.airplanes) {
        CALayer *plane = [CALayer layer];
        plane.bounds = CGRectMake(0, 0, spriteWidth, spriteHeight);
            plane.position = CGPointMake(planeObj.x, planeObj.y);
            plane.contents = (id)(sprite.CGImage);
            CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(planeObj.angle);
            [plane setAffineTransform:rotateTransform];
            [self.view.layer addSublayer:plane];

            // Animate it
            UIBezierPath *path = [UIBezierPath bezierPath];
            [path moveToPoint:CGPointMake(100.0, 100.0)];

[path addLineToPoint:CGPointMake(200.0, 200.0)];
    [path addLineToPoint:CGPointMake(100.0, 300.0)];

    CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    anim.path = path.CGPath;
    anim.rotationMode = kCAAnimationRotateAuto;
    anim.repeatCount = HUGE_VALF;
    anim.duration = 8.0;
    anim.autoreverses = YES;
    [plane addAnimation:anim forKey:@"race"];
    }

我想做的是根据每个平面的角度生成 UIBezierPath 并以

的速度移动它

但我认为 moveToPoint 不会帮助解决这个问题

谢谢

我有一个潜在的替代解决方案,我现在正在 using/working;

// Angles for airplane icons
    _sprite = [UIImage imageNamed:@"Plane"];
    CGFloat spriteWidth = _sprite.size.width;
    CGFloat spriteHeight = _sprite.size.height;
    self.velocity=1.0;

    //Random x&y points
    CGFloat x;
    CGFloat y;

    //VICAirplane *plane1 = [[VICAirplane alloc] initWithX:48 withY:104 withAngle:0 withSpeed:10];

    x = (CGFloat) (arc4random() % (int) self.view.frame.size.width);
    y = (CGFloat) (arc4random() % (int) self.view.frame.size.height);
    UIImageView *theBug = [[UIImageView alloc] initWithFrame:CGRectMake(x, y, spriteWidth, spriteHeight)];
    [theBug setBackgroundColor:[UIColor redColor]];
    [theBug setImage:_sprite];
    [self.view addSubview:theBug];


    double delayInSeconds = 1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){




                 //Calculate the angle to rotate
                 CGFloat newX = (CGFloat) (arc4random() % (int) self.view.frame.size.width);
                 CGFloat newY = (CGFloat) (arc4random() % (int) self.view.frame.size.height);
                 CGPoint rotateToLocation = CGPointMake(newX, newY);

                 theBug.layer.anchorPoint = CGPointMake(0.5, 0);
                 float angleToRotate = atan2f(theBug.transform.tx-newX, theBug.transform.ty - newY);

                 if (theBug.transform.tx < newX)
                     angleToRotate *= 1;


                 [UIView animateWithDuration:4
                                       delay:0
                                     options:UIViewAnimationOptionCurveLinear
                                  animations:^{
                                      theBug.transform = CGAffineTransformRotate(theBug.transform, angleToRotate);
                                  } completion:^(BOOL finished) {

                                      [UIView animateWithDuration:2
                                                            delay:0.0
                                                          options:UIViewAnimationOptionCurveLinear
                                                       animations:^{
                                                           theBug.center = rotateToLocation;
                                                       } completion:^(BOOL finished) {
                                                           NSLog(@"Finished");


                                                       }];                             
                                  }];



            });

这是我对这个问题的解决方案。非常感谢。