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

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

4 ответа

Решение

Я понятия не имею, как сделать это в 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"];

предполагая, что вращающий изображение - это ваш UIImageView.

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

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

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

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

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

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

а также

[sprite stopAction:action];

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

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

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

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

- (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"];
}

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

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

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

Другие вопросы по тегам