記事一覧

Cocos2d解説(4) アニメーション

■CCSpriteFrameによるコマアニメーション

アニメーションは、一定時間ごとにスプライトの画像情報を変更させることなので、考え方としては前回説明したアクション系クラスと同じである。
そのためのクラスとしては CCAnimation が用意されており、これに何コマ目にどの画像を表示させるかを指定すればよい。

単純に考えれば画像ファイル名が記述された配列でも渡せば済みそうだが、ここでもテクスチャアトラスの考え方がベースにあるため、テクスチャ名と切り出し情報の組み合わせによって各コマの情報を指定することになる。
その1コマ分に相当するのが CCSpriteFrame である。

CCTexture2D* texture = [[CCTexture2d alloc]
initWithImage:@"texture.png"]; //テクスチャを読み込み※1
CCSpriteFrame* frame1 = [CCSpriteFrame frameWithTexture:texture rect:rect1]; //※2
CCSpriteFrame* frame2 = [CCSpriteFrame frameWithTexture:texture rect:rect2];
.
.

このようにすると各コマの情報を生成できる。
これら複数の CCSpriteFrame を NSArrayに格納して CCAnimationに渡すことで画像切り替え情報、つまりアニメーションの内容がセットされる。

NSArray* animFrames = [NSArray arrayWithObjects: frame1, frame2, …. , nil];
CCAnimation *anim = [CCAnimation animationWithFrames:animFrames delay:0.1f];

この CCAnimation がアクション系オブジェクトとしてそのまま使用できれば良いのだが、クラスの継承関係上は別物となっており、アクションとして使用する際にはアクションオブジェクトである CCAnimate の形に変換してから runAction: する必要がある。

CCAnimate *animate = [CCAnimate actionWithAnimation:anim];
[aSprite runAction:anim];

以上の操作によりコマアニメーションが動作する。


※1)もちろんテクスチャキャッシュを使用してもよい
※2)CCSpriteFrameの初期化コードがCCSpriteと似ているのでなんとなく同じもののような気がしてしまうが(少なくとも僕は違いが理解できず???となった)、CCSpriteFrameはあくまで各コマの情報更新なのでscaleやpositionの情報を持っていないし(CCSpriteFrame.hを見れば、実際それしか変数を持っていないのがわかる)、CCNodeにaddChildすることなどもできない。