2011-11-06 4 views
5

तो मेरे वर्तमान संस्करण इस तरह दिखता है: Animation Movieचेतन कई बार बात और अधिक स्वाभाविक रूप

मैं काफी कोर-एनिमेशन के लिए नया हूँ तो क्या मैं प्राप्त करने का प्रयास वहाँ वर्तमान की तरह कई बिंदुओं हैं कि है, एक टेनिस बॉल मशीन की तरह, विभिन्न कोणों, ऊंचाइयों और गति से बाएं बॉक्स से आगे बढ़ना।

enter image description here

पहले समस्या यह है कि मेरी "गेंद" नहीं लगती है जैसे कि यह गुरुत्वाकर्षण से पकड़ लिया जाता है और यह भी पहली बार में गति तेजी से पर्याप्त नहीं है, है।

भी, शुरुआत के बीच भिन्न दूरी के साथ इस एनीमेशन को कई बार कैसे करें।

अगर कुछ अस्पष्ट है, तो कृपया एक टिप्पणी छोड़ दें।

मेरे वर्तमान कोड:

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

मैं सुझाव देंगे कि आप का उपयोग कर देखो [Cocos2d/box2d] (http://www.cocos2d-iphone.org/) अपने "एनीमेशन चलाने के लिए "एक भौतिकी सिमुलेशन के रूप में। यदि आप यथार्थवादी गुरुत्वाकर्षण और कण आंदोलनों को चाहते हैं, तो ऐसा लगता है कि ऐसा होना चाहिए। – aroth

+0

मुझे लगता है कि मुझे ऐसी निर्भरता की आवश्यकता नहीं है। यह केवल मेरे आवेदन में एक एकल (और बहुत महत्वपूर्ण नहीं) दृश्य के लिए है। – choise

+0

चूंकि आप गेंद को मूल भौतिकी को शामिल करने की कोशिश कर रहे हैं, तो कैडिसप्ले लिंक का उपयोग करेंगे और गेंद को एनिमेट करने से बार-बार अपनी स्थिति बदलना स्वीकार्य होगा? क्या किसी के पास इस समाधान के खिलाफ कुछ है? –

उत्तर

1

गुरुत्वाकर्षण मॉडल करने का सबसे आसान तरीका बुनियादी भौतिकी में सीखने वाले उन परावर्तक समीकरणों के साथ है। संक्षेप में, नीचे दिया गया कार्य प्रारंभिक स्थिति, एक गति, और कोण (रेडियंस में, जहां 0 दाईं ओर है) लेता है। एक कैलियर स्थिति में दिखाई देता है और उस गति और कोण पर गोली मार दी जाती है।

मैं एक कैडिसप्ले लिंक (जो प्रभावी रूप से एक टाइमर है जो आपकी फ्रेम दर के साथ सिंक्रनाइज़ करता है) का उपयोग कर रहा है ताकि फ़ंक्शन को बहुत तेज़ी से कॉल किया जा सके। हर बार समारोह कहलाता है, बिंदु स्थानांतरित हो जाता है। क्षैतिज गति निरंतर है और गुरुत्वाकर्षण अनुकरण करने के लिए प्रत्येक फ्रेम के नीचे लंबवत गति बढ़ जाती है (`vy - = 0.5f;)। यदि आप अधिक/कम गुरुत्वाकर्षण चाहते हैं, तो बस इस 0.5 एफ मान के साथ गड़बड़ करें।

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

और इंटरफ़ेस:

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

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

@end 
1

मैं वहाँ चीजों की एक जोड़ी आप यहाँ कर सकते हो सकता है लगता है।
- एक KCAMediaTimingFunctionEaseOut के बजाय kCAMediaTimingFunctionLinear का उपयोग करना है।
- दूसरा यह है कि जहां भी हो, गेंद के पतन के केंद्र में अपना नियंत्रण बिंदु सेट करना है। इसे आज़माएं:

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"]; 

तब आपको विभिन्न पथों के लिए नियंत्रण बिंदु को स्थानांतरित करने में सक्षम होना चाहिए।

+0

यह एक सीधी रेखा – choise

+0

बनाता है बिल्कुल! तो आपको वक्र प्राप्त करने के लिए नियंत्रण बिंदु चर के साथ क्या करना चाहिए। उदाहरण के लिए, एक वक्र के लिए 200 मान को x मान को बाहर ले जाएं। –

संबंधित मुद्दे