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

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

4 ответов


Я понятия не имею, как это сделать в cocos2d (или даже что это такое), но вы можете сделать это с помощью основной анимации либо с 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 секунды. Вращения разделены пополам, потому что основная анимация перейдет в следующее ближайшее состояние, поэтому максимум, что вы можете повернуть, - это половина вращения, прежде чем анимация захочет повернуть в другом направлении. То есть, вращение Pi radian (180 градусов) здесь идет полукругом, но если вы использовали (1.5 f * pi) для своего угла поворота, это будет только четверть круга. Аналогично, если вы использовали (0.999 f * 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];

Если вам необходимо постоянно вращать.

не забудьте убедиться, что sprite 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).

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