проблема с использованием CABasicAnimation для анимации нескольких CALayers - PullRequest
0 голосов
/ 23 марта 2011

У меня было много проблем с анимацией в приложении для настольных игр для iPhone.я использую следующую функцию для анимации компьютерного игрока, перемещающего счетчик:

-(void)animateCounterMoveFor:(int)playerType counterId:(int)countId {

    // set up the move to an end point
    CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"position"];
    [move setDuration:3.5];
    [move setToValue:[NSValue valueWithCGPoint:CGPointMake((xPos), (yPos))]];
    [move setFillMode:kCAFillModeForwards];
    [move setRemovedOnCompletion:NO];
    CAMediaTimingFunction *tf = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [move setTimingFunction:tf];

    // enable the animation stop to set layer to right position
    [move setValue:[NSNumber numberWithInt:countId] forKey:@"counterId"];
    [move setValue:[NSNumber numberWithInt:playerType] forKey:@"playerType"];
    [move setDelegate:self];

    // add move to the layer
    [layer addAnimation:move forKey:@"moveAnimation"];

}

.. и затем делегат устанавливает позицию слоя и удаляет анимацию, когда она закончена (в противном случае счетчик перемещается обратно в свою начальную позицию).

-(void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag {

    NSNumber *counterId = [anim valueForKey:@"counterImageId"];
    NSNumber *playerId = [anim valueForKey:@"playerType"];

    int countId = [counterId intValue];
    int playId = [playerId intValue];

// code here gets position information using counter and player id

    // set the final position of the layer when the anim stops, then remove the anim
    [layer setPosition:CGPointMake(xPos, yPos)];
    [layer removeAnimationForKey:@"moveAnimation"];

}

Все это прекрасно работает, когда один счетчик движется, но когда один счетчик берет другой, я использую один и тот же метод для перемещения обоих.Я подумал, что копия анимации была передана на слой, и я мог вызвать его, чтобы переместить первый контрольный слой, а затем снова вызвать его, чтобы он переместил второй.Я выхожу из объекта и создаю две разные анимации движения, но только второй счетчик движется.animationDidStop: вызывается дважды, и каждый раз передается правильная информация о счетчике.

Есть идеи о том, как заставить это работать?Я пролистал довольно много вопросов о CAAnimation / CALayer, так что, думаю, проблема не только в этом;)

1 Ответ

2 голосов
/ 27 марта 2011

Почему вы не знаете конечную позицию раньше времени?

Я бы просто установил положение объекта в методе animateCounterMoveFor:: в противном случае он вернется к исходной позиции, посколькуКалайер фактически не двигается, пока вы его не установите.

-(void)animateCounterMoveFor:(int)playerType counterId:(int)countId {

    // set up the move to an end point
    CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"position"];
    [move setDuration:3.5];
    [move setToValue:[NSValue valueWithCGPoint:CGPointMake((xPos), (yPos))]];
    [move setFillMode:kCAFillModeForwards];
    [move setRemovedOnCompletion:NO];
    CAMediaTimingFunction *tf = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [move setTimingFunction:tf];


    [layer addAnimation:move forKey:@"position"];   // Replaces the previous position animation on the layer
    [layer setPosition:CGPointMake(xPos, yPos)];        // Sets the final position after animation is finished

    // enable the animation stop to set layer to right position
    [move setValue:[NSNumber numberWithInt:countId] forKey:@"counterId"];
    [move setValue:[NSNumber numberWithInt:playerType] forKey:@"playerType"];
    [move setDelegate:self];

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...