Как я могу использовать анимацию в cocos2d?

Я пытаюсь разработать рулетку для iPhone. Как я могу настроить анимацию (вращение) платы Roulette?

Ответ 1

Я не знаю, как это сделать в cocos2d (или даже что это такое), но вы можете сделать это с помощью Core Animation либо с CALayers, либо с UIViews. Вероятно, самым простым способом было бы создать UIImageView, содержащий изображение вашего колеса рулетки и оживить его.

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

CATransform3D rotationTransform = CATransform3DMakeRotation(1.0f * M_PI, 0, 0, 1.0);

CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];

rotationAnimation.toValue = [NSValue valueWithCATransform3D:rotationTransform];
rotationAnimation.duration = 0.25f;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = 10; 

[rotatingImage.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];

Предполагая, что rotatingImage является вашим UIImageView.

В этом примере колесо будет вращаться 5 раз, причем каждое вращение занимает 0,5 секунды. Вращения разделены пополам, потому что Core Animation перейдет в следующее ближайшее состояние, так что больше всего вы можете вращать что-то наполовину, пока анимация не захочет вращаться в другом направлении. То есть, поворот pi радиан (180 градусов) идет по полукругу, но если вы используете (1.5f * pi) для вашего угла поворота, он будет только четверть круга. Аналогично, если вы использовали (0.999f * pi), кружок вращался по часовой стрелке.

Вы хотите реализовать ускорение и замедление вашего колеса, а для тех, кто в этом примере заменит CAKeyframeAnimation, заменит CABasicAnimation.

Ответ 2

Это довольно просто в Cocos2D:

[sprite runAction:[RotateBy actionWithDuration:dur angle:360]];

сделать один оборот или

id action = [RepeatForever actionWithAction: [RotateBy actionWithDuration:dur angle:360]];
[sprite runAction:action];

и

[sprite stopAction:action];

если вам нужно постоянно вращаться.

Не забудьте удостовериться, что преобразование спрайта Anchor установлено в центр изображения. И я предполагаю, что следующий вопрос должен возникнуть - как заставить его останавливаться плавно;)

Подробнее о действиях: http://lethain.com/entry/2008/oct/03/notes-on-cocos2d-iphone-development (он для более старой версии, поэтому он использует устаревшее "do" вместо "runAction" )

Ответ 3

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

- (void) runSpinAnimationWithDuration:(CGFloat) duration;
{
    CABasicAnimation* rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ];
    rotationAnimation.duration = duration;
    rotationAnimation.cumulative = YES;
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

    [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

Ответ 4

Есть несколько способов сделать это.

Если у вас есть покадровая анимация для колеса, посмотрите AtlasDemo (часть дистрибутива cocos2d).

В противном случае взгляните на метод Sprite RotateBy:.