代码iphone图像绘制线

时间:2011-04-15 18:16:44

标签: iphone xcode animation uiimageview drawing

大家好,我是法国人,所以请原谅我的英语。所以我想做一个像飞行控制这样的游戏。当我从像平面的图像中画线时,我希望飞机跟随那条线。我怎么能这样做呢?

1 个答案:

答案 0 :(得分:1)

  1. 要绘制线条,请在视图中实施touchesBegan:touchedMove:touchedEndedtouchesCancelled:或查看控制器,并使用触摸点构建路径(CGPathRef)。
  2. 要使对象沿着线移动,请创建CAKeyframeAnimation,设置路径并将其指定给对象的图层。
  3. 修改示例代码

    当您拥有CGPathRef path时,创建动画就像以下一样简单:

    CAKeyframeAnimation* animation = [CAKeyframeAnimation animation];
    animation.path = thePath;
    animation.duration = 2;
    animation.rotationMode = kCAAnimationRotateAuto; // object auto rotates to follow the path
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    

    最后,将动画分配给图层:

    [layer1 addAnimation:animation forKey:@"position"];
    

    编辑2:示例应用程序:

    我为你建立了一个名为PathAnimation的整个项目。

    编辑3:这是我在PathAnimation项目中使用的代码:

    //
    //  CustomView.m
    //  PathAnimation
    //
    //  Created by Dominique d'Argent on 19.04.11.
    //  Copyright 2011 Nicky Nubbel. All rights reserved.
    //
    
    #import "CustomView.h"
    
    
    @implementation CustomView
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            object = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow"]];
            object.frame = CGRectMake(10.0, 30.0, 20.0, 20.0);
    
            [self addSubview:object];
    
            [self createPath];
        }
        return self;
    }
    
    
    - (void)dealloc
    {
        [object release];
    
        [super dealloc];
    }
    
    #pragma mark - Custom drawing
    
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect {
        CGContextRef g = UIGraphicsGetCurrentContext();
        CGFloat bgColor[4] = {1.0f, 1.0f, 1.0f, 1.0f};
    
        CGContextSetFillColor(g, bgColor);
        CGContextFillRect(g, self.frame);
    
        CGFloat color[4] = {1.0f, 0.0f, 0.0f, 1.0f};
        CGContextAddPath(g,path);
        CGContextSetStrokeColor(g, color);
        CGContextDrawPath(g, kCGPathStroke);
    
        CGPoint position = CGPathGetCurrentPoint(path);
        CGContextAddArc(g, position.x, position.y, 5.0f, 0.0f, 2 * M_PI, 0);
        CGContextSetFillColor(g, color);
        CGContextDrawPath(g, kCGPathFill);
    }
    
    #pragma mark - Path creation
    - (void)createPath {
        path = CGPathCreateMutable();
        CGPathMoveToPoint(path, NULL, object.center.x, object.center.y);
    }
    
    #pragma mark - Touch handling
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch   = [touches anyObject];
        CGPoint position = [touch locationInView:self];
    
        if (CGRectContainsPoint(object.frame, position)) {
            // start animation
            [self go];
        }
        else {
            CGPoint lastPosition = CGPathGetCurrentPoint(path);
    
            if (CGPointEqualToPoint(lastPosition, object.center)) {
                CGFloat angle = -atan2f(position.x - lastPosition.x, position.y - lastPosition.y);
                angle += M_PI_2;
    
                object.layer.transform = CATransform3DMakeRotation(angle, 0.0, 0.0, 1.0);
            }
    
            CGPathAddLineToPoint(path, NULL, position.x, position.y);
    
            [self setNeedsDisplay];
        }
    }
    
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    }
    
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    }
    
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    }
    
    #pragma mark - Animations
    
    - (void) go {
        NSLog(@"go");
    
        object.layer.transform = CATransform3DIdentity;
    
        CAKeyframeAnimation* animation = [CAKeyframeAnimation animation];
        animation.path = path;
        animation.duration = 5.0;
        animation.rotationMode = kCAAnimationRotateAuto; // object auto rotates to follow the path
        animation.removedOnCompletion = NO;
        animation.fillMode = kCAFillModeForwards;
    
        [object.layer addAnimation:animation forKey:@"position"];
        object.center = CGPathGetCurrentPoint(path);
    
        [self createPath];
    }
    
    @end