Как анимировать свойство contentsRect вдоль пути? - PullRequest
2 голосов
/ 13 июня 2011

У меня загружен лист спрайта png и соответствующий файл plist, и я пытаюсь анимировать свойство contentsRect CALayer для отображения анимации спрайта из вышеупомянутого аппрайтового листа. Вот код:

CGFloat width = myLayer.frame.size.width;
CGFloat height = myLayer.frame.size.height;
myLayer.bounds = CGRectMake( 0, 0, width, height );
myLayer.contentsGravity = kCAGravityCenter;
myLayer.contents=(id)pImage; // This is my sprite sheet


CAKeyframeAnimation *keyFrameContentsRectAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contentsRect"];
keyFrameContentsRectAnimation.path = pAnimationPath; // This is a path to animate on
keyFrameContentsRectAnimation.values = pRects; // This is an array of normalized CGRects representing sprite sheet
keyFrameContentsRectAnimation.fillMode = kCAFillModeRemoved;
keyFrameContentsRectAnimation.calculationMode = kCAAnimationDiscrete;
keyFrameContentsRectAnimation.duration=pAnimationDuration;
keyFrameContentsRectAnimation.repeatCount = 1;

Приведенный выше код работает, как и ожидалось, до тех пор, пока я отключаю анимацию пути (т. Е. Закомментируем свойство пути из keyFrameContentsRectAnimation) - анимация работает, а contentsRect перемещается по моей таблице спрайтов.

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

Итак, я подумал, что если я создам путь из этих точек смещения и добавлю его в свойство пути моей анимации, которое должно решить проблему. К сожалению это не тот случай ... Как только я добавляю свойство пути, вместо анимации спрайтов я вижу целое изображение листа спрайта на время анимации ... Что я пропустил?

1 Ответ

2 голосов
/ 13 июня 2011

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

myLayer.bounds = CGRectMake( 0, 0, 256.0, 256.0 ); //my sprite dimentions

myLayer.contentsGravity = kCAGravityCenter;
myLayer.contents=(id)pImage; // This is my sprite sheet


CAKeyframeAnimation *keyFrameContentsRectAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contentsRect"];

keyFrameContentsRectAnimation.values = pRects; // This is an array of normalized CGRects representing sprite sheet
keyFrameContentsRectAnimation.fillMode = kCAFillModeRemoved;
keyFrameContentsRectAnimation.calculationMode = kCAAnimationDiscrete;
keyFrameContentsRectAnimation.duration=pAnimationDuration;
keyFrameContentsRectAnimation.repeatCount = 1;  

CAKeyframeAnimation* kfanim = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
kfanim.path = pAnimationPath;
kfanim.values = pRects;
kfanim.fillMode = kCAFillModeBoth;
kfanim.calculationMode = kCAAnimationDiscrete;
kfanim.duration=pAnimationDuration;
kfanim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];


NSArray *animations = [NSArray arrayWithObjects:keyFrameContentsRectAnimation,
                       kfanim, nil];

CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
[animationGroup setDuration:pAnimationDuration];
[animationGroup setRepeatCount: 1];
[animationGroup setAnimations:animations];
...