Вопрос

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

Это было полезно?

Решение

Я понятия не имею, как это сделать в 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 перейдет в следующее ближайшее состояние, поэтому максимум, что вы можете повернуть, — это половина поворота, прежде чем анимация захочет повернуть в другом направлении.То есть вращение радиана Пи (180 градусов) здесь происходит на полукруг, но если бы вы использовали (1,5f * пи) для угла поворота, оно бы совершало только четверть круга.Аналогично, если бы вы использовали (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 (это для более старой версии, поэтому вместо runAction используется устаревшее «do»)

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

- (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:метод.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top