2009-07-21 6 views
1

J'ai une image de voiture dans un UIImageView, avec des animations de mouvement et de rotation. J'ai une image de marque de pneu dans un UIImageView, que j'ai ajouté comme sous-vue à la voiture. Cela signifie que les mêmes animations de mouvement et de rotation s'appliquent aux deux.Enregistrer la trace de l'image animée

Ce que je veux faire est laisser une traînée de marques de pneu.

Quelqu'un peut-il suggérer une stratégie sur la façon de faire cela?

Recherche par d'autres sujets que j'ai vu cet extrait, ne sais pas si je peux l'utiliser:

UIGraphicsBeginImageContext(drawingView.bounds.size); 
[drawingView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
//then display viewImage in another UIImageView... 

Si elle était utile, pas la moindre idée sur la façon de l'obtenir appelé lors d'une animation?

Répondre

1

Cet extrait n'est pas tout à fait ce que vous cherchez. Cet extrait enregistre ce qui est actuellement affiché dans le contexte en tant que UIImage. Vous pouvez également utiliser ImageContext pour dessiner, mais pas comme ça.

0

L'idéal serait que CAKeyframeAnimation notifie son délégué avant de faire l'image-clé suivante; Puisque je ne pense pas que ce soit possible (?), la seule façon de penser à faire quelque chose comme ça est d'utiliser un tableau de positions, et d'utiliser des instances consécutives de CABasicAnimation pour le faire. C'est comme un "pauvre" CAKeyframeAnimation.

Quelque chose comme ceci:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _step = 0; 
    _positions = [[NSArray alloc] initWithObjects:[NSValue valueWithCGPoint:CGPointMake(20.0, 20.0)], 
       [NSValue valueWithCGPoint:CGPointMake(40.0, 80.0)], 
       [NSValue valueWithCGPoint:CGPointMake(60.0, 120.0)], 
       [NSValue valueWithCGPoint:CGPointMake(80.0, 160.0)], 
       [NSValue valueWithCGPoint:CGPointMake(100.0, 200.0)], 
       [NSValue valueWithCGPoint:CGPointMake(120.0, 240.0)], 
       [NSValue valueWithCGPoint:CGPointMake(140.0, 280.0)], 
       [NSValue valueWithCGPoint:CGPointMake(160.0, 320.0)], 
       [NSValue valueWithCGPoint:CGPointMake(180.0, 360.0)], 
       [NSValue valueWithCGPoint:CGPointMake(200.0, 400.0)], 
       nil]; 
    [self moveToNextPosition]; 
} 

- (void)moveToNextPosition 
{ 
    if (_step < [_positions count] - 1) 
    { 
     CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
     animation.fromValue = [_positions objectAtIndex:_step]; 
     animation.toValue = [_positions objectAtIndex:(_step + 1)]; 
     animation.delegate = self; 
     animation.removedOnCompletion = YES; 
     [_sprite.layer addAnimation:animation forKey:@"position"]; 

     ++_step; 
    } 
    else 
    { 
     _sprite.center = [[_positions objectAtIndex:_step] CGPointValue]; 
    } 
} 

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished 
{ 
    UIImageView *trail = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sprite.png"]]; 
    trail.center = [[_positions objectAtIndex:_step] CGPointValue]; 
    [self.view insertSubview:trail belowSubview:_sprite]; 
    [trail release]; 

    [self moveToNextPosition]; 
} 

Dans ce cas, les animations exécuter un après l'autre, avec des valeurs spécifiées dans le _positions NSArray Ivar et le _step est incrémenté à chaque étape. Lorsque chaque animation s'arrête, nous dessinons une image de sprite en-dessous de celle que nous animons, et nous redémarrons notre animation, jusqu'à ce qu'il n'y ait plus de points à atteindre. Et puis nous finissons.

Espérons que cela aide!