Как связать CAAffineTransforms в одной анимации? - PullRequest
0 голосов
/ 02 декабря 2011

Я пытаюсь заставить спрайта покачиваться, когда он ходит, но независимо от того, что я делаю, он либо поднимается и остается, либо выполняет обе анимации одновременно, и вы фактически не видите движения. Ниже я разместил код, который у меня есть на данный момент. Может кто-нибудь поправить меня?

Я также пытался использовать делегаты Animation и использовать animationDidStop, но, похоже, это тоже не сработало.

- (void)walkAnimation {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2];
    [UIView setAnimationRepeatCount:2];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationRepeatAutoreverses:TRUE];
    CGAffineTransform bobUP = CGAffineTransformMakeTranslation(0, -10);
    //CGAffineTransform bobDOWN = CGAffineTransformMakeTranslation(0, +10);
    //CGAffineTransform bob = CGAffineTransformConcat(bobUP, bobDOWN);
    _spriteLayer.affineTransform = bobUP;
    [UIView commitAnimations];
    _spriteLayer.affineTransform = CGAffineTransformIdentity;
}

1 Ответ

1 голос
/ 02 декабря 2011

Вы не можете связать эти два преобразования вместе в одной анимации так, как вы к ней приближаетесь. Этот CGAffineTransformConcat создает преобразование, которое представляет выполнение одного преобразования за другим. Первый переводит -10 для y, затем второй переводит +10 для y. Если вы делаете их один за другим, вы вернетесь туда, откуда начали. Когда вы назначаете результирующее преобразование слою спрайта, вы просто указываете ему вообще не двигаться.

У вас есть два варианта для достижения того, что вы ищете:

Вариант 1. Посмотрите на анимации ключевых кадров (посмотрите CAKeyframeAnimation). Это позволит вам указать состояние свойств в разных точках с помощью анимации. Это, вероятно, потребует немного больше обучения, но конечный результат, вероятно, будет более читабельным и обслуживаемым.

Вариант 2: две анимации - по одной для каждого перевода. В конце каждой анимации, если вы хотите, чтобы качание продолжалось, запустите другую анимацию. Это может быть запутанным и сложным, если вам нужно будет внести изменения позже.

Также, в любом случае, я бы предложил использовать константу для вашего значения перевода. Магические числа также сделают будущие изменения требующими больших усилий. Вам также следует перейти к использованию блочной анимации для анимации UIView (посмотрите animateWithDuration: animations:)

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