2011-11-06 16 views
5

nên phiên bản hiện tại của tôi trông như thế này: Animation Movieđiểm animate nhiều lần và tự nhiên hơn

tôi là khá mới để lõi-hình động, vì vậy những gì tôi cố gắng để đạt được là có nhiều điểm giống như hiện tại, di chuyển từ hộp bên trái ở các góc độ khác nhau, chiều cao và tốc độ ra khỏi nó, giống như một máy bóng quần vợt.

enter image description here

vấn đề đầu tiên là, rằng tôi "quả bóng" không giống như nó được nắm lấy từ lực hấp dẫn và cũng là tốc độ lúc đầu là không đủ nhanh.

cũng, cách thực hiện hoạt ảnh này nhiều lần với khoảng cách thay đổi giữa đầu.

nếu có điều gì đó không rõ ràng, XIN VUI LÒNG để lại nhận xét.

mã hiện tại của tôi:

- (void)loadView { 
    [super loadView]; 

    self.view.backgroundColor = [UIColor lightGrayColor]; 

    CGPoint startPoint = CGPointMake(20, 300); 
    CGPoint endPoint = CGPointMake(300, 500); 

    UIBezierPath *trackPath = [UIBezierPath bezierPath]; 
    [trackPath moveToPoint:startPoint]; 
    [trackPath addQuadCurveToPoint:endPoint controlPoint:CGPointMake(endPoint.x, startPoint.y)]; 

    CALayer *point = [CALayer layer]; 
    point.bounds = CGRectMake(0, 0, 20.0, 20.0); 
    point.position = startPoint; 
    point.contents = (id)([UIImage imageNamed:@"point.png"].CGImage); 
    [self.view.layer addSublayer:point]; 

    CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
    anim.path = trackPath.CGPath; 
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
    anim.repeatCount = HUGE_VALF; 
    anim.duration = 2.0; 
    [point addAnimation:anim forKey:@"movepoint"]; 

    CALayer *caseLayer = [CALayer layer]; 
    caseLayer.bounds = CGRectMake(0, 0, 140.0, 150.0); 
    caseLayer.position = startPoint; 
    caseLayer.contents = (id)([UIImage imageNamed:@"case.png"].CGImage); 
    [self.view.layer addSublayer:caseLayer]; 

} 
+2

tôi đề nghị bạn nên xem xét sử dụng [cocos2d/Box2D] (http://www.cocos2d-iphone.org/) để chạy "hoạt hình của bạn "như một mô phỏng vật lý. Đó là những gì nó có vẻ như nó được cho là, nếu bạn muốn trọng lực thực tế và các chuyển động của hạt. – aroth

+0

tôi nghĩ rằng tôi không cần sự phụ thuộc như vậy. nó chỉ dành cho một lượt xem (và không quan trọng) trong ứng dụng của tôi. – choise

+0

Vì bạn đang cố gắng kết hợp vật lý cơ bản với quả bóng, sẽ sử dụng CADisplayLink và làm động viên bóng liên tục thay đổi vị trí của nó có thể chấp nhận được không? Có ai có bất cứ điều gì chống lại giải pháp này? –

Trả lời

1

Cách dễ nhất để mô hình trọng lực là với các phương trình parabol mà bạn học trong vật lý cơ bản. Tóm lại, hàm dưới đây có vị trí ban đầu, tốc độ và góc (IN RADIANS, trong đó 0 là bên phải). một CALayer xuất hiện ở vị trí và bị bắn ở tốc độ và góc đó.

Tôi đang sử dụng CADisplayLink (đây là bộ đếm thời gian đồng bộ hóa với tốc độ khung hình của bạn một cách hiệu quả) để gọi hàm nhanh chóng. Mỗi lần hàm được gọi, điểm được di chuyển. Tốc độ ngang là không đổi và tốc độ thẳng đứng tăng lên phía dưới mỗi khung hình để mô phỏng lực hấp dẫn (`vy - = 0.5f;). Nếu bạn muốn hấp dẫn nhiều hơn/ít hơn, chỉ cần lộn xộn xung quanh với giá trị 0,5f này.

- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 
     point = [[CALayer alloc] init]; 
     point.bounds = CGRectMake(0.0f, 0.0f, 10.0f, 10.0f); 
     point.backgroundColor = [UIColor redColor].CGColor; 
     point.position = CGPointMake(-10.0f, -10.0f); 
     [self.layer addSublayer:point]; 
     [point release]; 
    } 
    return self; 
} 

-(void)animateBallFrom:(CGPoint)start withSpeed:(CGFloat)speed andAngle:(CGFloat)angle  
    vx = speed*cos(angle); 
    vy = speed*sin(angle); 


    [CATransaction begin]; 
    [CATransaction setDisableActions:YES]; 
    point.position = start; 
    [CATransaction commit]; 

    displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(animate)]; 
    [displayLink setFrameInterval:2]; 
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 
} 

-(void)animate { 
    if (point.position.x + point.bounds.size.width/2.0f < 0.0f || point.position.x > self.bounds.size.width + point.bounds.size.width/2.0f || 
    point.position.y + point.bounds.size.height/2.0f < 0.0f || point.position.y > self.bounds.size.height + point.bounds.size.height/2.0f) { 
    [displayLink invalidate]; 
    } else { 
    [CATransaction begin]; 
    [CATransaction setDisableActions:YES]; 
    point.position = CGPointMake(point.position.x+vx, point.position.y-vy); 
    vy -= 0.5f; 
    [CATransaction commit]; 
    } 
} 

và giao diện:

@interface Bounce : UIView { 
    CALayer *point; 
    CADisplayLink *displayLink; 
    CGFloat vx, vy; 
} 

-(void)animateBallFrom:(CGPoint)start withSpeed:(CGFloat)speed andAngle:(CGFloat)angle; 

@end 
1

Tôi nghĩ rằng có thể có một vài điều bạn có thể làm ở đây.
- Một là sử dụng kCAMediaTimingFunctionLinear thay vì kCAMediaTimingFunctionEaseOut.
- Cách khác là đặt điểm điều khiển của bạn ở giữa bóng rơi, bất cứ nơi nào có thể. Hãy thử điều này:

CGPoint startPoint = CGPointMake(20, 300); 
CGPoint controlPoint = CGPointMake(160, 400); 
CGPoint endPoint = CGPointMake(300, 500); 

UIBezierPath *trackPath = [UIBezierPath bezierPath]; 
[trackPath moveToPoint:startPoint]; 
[trackPath addQuadCurveToPoint:endPoint controlPoint:controlPoint]; 

CALayer *point = [CALayer layer]; 
point.bounds = CGRectMake(0, 0, 20.0, 20.0); 
point.position = startPoint; 
point.contents = (id)([UIImage imageNamed:@"point.png"].CGImage); 
[self.view.layer addSublayer:point]; 

CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
anim.path = trackPath.CGPath; 
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
anim.repeatCount = HUGE_VALF; 
anim.duration = 2.0; 
[point addAnimation:anim forKey:@"movepoint"]; 

Sau đó, bạn có thể di chuyển điểm kiểm soát xung quanh các đường dẫn khác nhau.

+0

điều này tạo ra một đường thẳng – choise

+0

Chính xác! Vì vậy, những gì bạn nên làm là chơi xung quanh với biến điểm điều khiển để có được đường cong. Ví dụ, di chuyển giá trị x ra, nói 200, cho một đường cong. –

Các vấn đề liên quan