iPhone用のルーレットゲームを開発しようとしています。ルーレット ボードをアニメーション化 (スピン) するにはどうすればよいですか?
4 に答える
Cocos2Dでは非常に簡単です。
[sprite runAction:[RotateBy actionWithDuration:dur angle:360]];
1ターンするか
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」を使用します)
cocos2d(またはそれが何であるか)でこれを行う方法はわかりませんが、CALayersまたはUIViewsのいずれかでCoreAnimationを使用してこれを行うことができます。おそらく最も簡単な方法は、ルーレット盤の画像を含む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秒かかります。Core Animationは次に近い状態になるため、回転は半分に分割されます。したがって、アニメーションが他の方向に回転する前に、何かを回転できるのは半回転です。つまり、ここでの円周率(180度)の回転は半円になりますが、回転角に(1.5f * pi)を使用した場合は、4分の1円になります。同様に、(0.999f * pi)を使用した場合、円は時計回りに回転します。
ホイールの加速と減速を実装する必要があります。これらの場合、この例ではCAKeyframeAnimationがCABasicAnimationの代わりになります。
ビューが 1 回転未満であるか、1 回転の倍数であるかに関係なく、回転を分割することなく、ラジアン単位でビューを回転させることができます。例として、次のコードは、指定された秒数の間、1 秒に 1 回、ビューをスピンします。ビューを特定の回転数またはラジアン数だけスピンするように簡単に変更できます。
- (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 の RotateBy: メソッドを見てください。