cocos2dでアクションを使う – CCAnimateとstopAction.
前回まででかなり複雑なアクションを組めるようになったと思います。今回は発展編、っていうか残りの知っておくべきことといったほうがいいでしょう。次の2点を解説していきます。
- 画像を切り替え、パラパラ漫画のようにアニメーションにする方法
- アクションを途中で止める方法
パラパラ漫画のようなアニメーションを作る方法
アニメーションを描画するためには、まずそのアニメーションに使いたい画像をすべて登録しなければなりません。これらをセットにし、アクションクラスへ渡してやります。
このセットを作るためにcocos2dではCCAnimationクラスが用意されており、このクラスのオブジェクトに、”どの画像を使うか”、”何秒ごとに画像を切り替えていくか”、”何回ループさせるか”などを登録します。
アニメーションオブジェクトを今度はアクションクラスのCCAnimateに登録します。こうすることで作成したアニメーションをSequenceやSpawnに入れて、他のアクションと同じように実行することができるようになります。
CCAnimationクラスとCCAnimateクラスは名前がややこしいので間違えないようにしないといけません。
実際に作ったサンプルコードを載せておきます。今回は2つの画像”red_circle.png”と”green_circle.png”を用意し、これらを交互に表示するアニメーションを作りました。
-(id) init { if( (self=[super init]) ) { CGSize wSize = [[CCDirector sharedDirector] winSize]; /*アニメーションさせるスプライトの読み込み*/ CCSprite* circle1 = [CCSprite spriteWithFile:@"red_circle.png"]; circle1.position = ccp(wSize.width / 2, wSize.height / 2); [self addChild:circle1]; /*アニメーションオブジェクトを作る*/ CCAnimation* animObj = [CCAnimation animation]; [animObj addSpriteFrameWithFilename:@"red_circle.png"]; [animObj addSpriteFrameWithFilename:@"green_circle.png"]; animObj.loops = -1; animObj.delayPerUnit = 0.5; /*アクションオブジェクトとしてアニメーションを登録*/ CCAnimate* animAction = [CCAnimate actionWithAnimation:animObj]; [circle1 runAction:animAction]; } return self; }
13行目でアニメーションオブジェクト”animObj”を作り、次の2行で画像を登録しセットにしています。アニメーションで表示される順番はここに記述した順番です。
18行目は何回ループさせるかを設定しています。−1で無限ループになります。19行目は何秒ごとに画像を切り替えるかを設定しています。今回は0.5秒ごとに切り替わるよう設定しました。
最後にこれをCCAnimeteクラスのアニメーションとして登録してやると、アニメーションのアクションが作成されます。
このように何枚もの画像を順番に表示させることでキャラクターのアニメーションを実現することができます。
アクションを途中で止める方法
プログラムを書いていると、アクションの実行中でも、何か他のイベントの発生などで、現在のアクションを中断する必要があるケースが幾度もあります。そのような場合のためにアクションクラスにはストップアクションメソッドが用意されています。
例えば、先ほどのアクションを止めたい時には次の文でストップさせることができます。
[circle1 stopAction:animAction];
しかし、この書き方ができるのは、止めたいアクションが同じメソッド内で定義されている時だけです。大抵の場合、違うメソッドでアクションをストップしなければならないイベントは起こります(例えばタッチなど)。
そのような場合、cocosでは特定のアクションをタグを使って取得することができるようになっています。
タグの使いかた
cocos2dではアクションを取得する他にも、スプライトやレイヤーといったノードもタグを使って登録しておき、別のメソッドでそれらを呼び出せるようになっています。
スプライトやレイヤーのタグ付けや、賢いタグの付け方はまた別の回に解説しますが、とにかくアニメーションにもタグが付けられるのです。
タグはNSInteger型で設置します。先ほどの”animAction”アクションにタグを付ける場合は以下のようにします。
animAction.tag = 1;
これでこのアクションには1というタグが付けられました。これを他のメソッド内でストップさせるときには次のように記述します。
[circle1 stopActionByTag:1];
”circle1”はアクションを設定されているオブジェクトです。
また、そのオブジェクトが実行しているすべてのアクションを止める方法もあります。
[circle1 stopAllActions];
このように書くことで、circle1が実行しているアクションをすべて停止させることができます。