16

我正在尝试为 iPhone 开发轮盘游戏。如何动画(旋转)轮盘?

4

4 回答 4

19

在 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”)

于 2009-07-26T18:51:53.010 回答
17

我不知道如何在 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 秒。旋转被分成两半,因为核心动画将进入下一个最接近的状态,所以在动画想要向另一个方向旋转之前,你最多可以旋转半个旋转。也就是说,这里的 pi 弧度(180 度)旋转了半圈,但如果你使用 (1.5f * pi) 作为旋转角度,它只会旋转四分之一圈。同样,如果您使用 (0.999f * pi),圆将以顺时针方式旋转。

你会想要实现你的轮子的加速和减速,在这个例子中,CAKeyframeAnimation 将取代 CABasicAnimation。

于 2009-01-29T22:08:07.047 回答
5

您可以将视图旋转一定数量的弧度,无论它是小于完整旋转还是完整旋转的多个倍数,而无需将旋转拆分为多个部分。例如,以下代码将每秒旋转一次视图,持续指定的秒数。您可以轻松地对其进行修改,以通过一定数量的旋转或一定数量的弧度来旋转视图。

- (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"];
}
于 2009-09-14T19:41:10.090 回答
3

有几种方法可以做到这一点。

如果您有轮子的逐帧动画,请查看 AtlasDemo(cocos2d 发行版的一部分)。

否则,看看 Sprite 的 RotateBy: 方法。

于 2009-02-07T01:20:00.320 回答