2013年03月09日

Cocos2d-xのパラパラアニメーションの切替

Cocos2d-xでiPhoneとAndroid同時リリースがんばるぞ〜。

今日はパラパラアニメーションの切り替えを調べてみたいと思います。

パラパラアニメーションの情報をキャッシュ(覚えさせる)
CCAnimationCache を使用するようです。

【管理クラスの取り出し】
// アニメーションキャッシュはシングルトンクラスなのでどこからでも同じインスタンスが使えます。
CCAnimationCache *animationCache = CCAnimationCache::sharedAnimationCache();

【登録する時】
animationCache->addAnimation( CCAnimationのインスタンス, アニメーション名 );

【取り出し時】
CCAnimation *animation = animationCache->animationByName( アニメーション名 );


今回のゲームではアニメーションをキャッシュに登録する関数を作って
初期化時にまとめて登録するように作りました。

/**
* アニメーションキャッシュの追加
* 引数の説明
* fileName ファイル名の雛形 xxxx_%01d.png のように連番画像ファイル名の雛形を指定する
* cacheName キャッシュに登録する名前 この名前で取り出しが出来る
* startNum 画像ファイルの連番開始数値
* endNum 画像ファイルの連番終了数値
* isReverse trueにすると 画像ファイルのアニメーションを頭から最後に最後から頭までの逆再生を加える
* duration 全フレームを表示する秒数の指定
*/
void Game::addAnimationCache(const char *fileName, const char *cacheName, int startNum, int endNum , bool isReverse, float duration )
{
// アニメーションキャッシュはシングルトン
CCAnimationCache *animationCache = CCAnimationCache::sharedAnimationCache();

// アニメーションフレームを管理するクラス
CCAnimation *animation = CCAnimation::create();


// アニメーションのコマ分繰り返す
for (int i=startNum; i<=endNum; i++){

// ファイル名を生成
char szImageFileName[128] = {0};
sprintf(szImageFileName, fileName, i);

// アニメーション フレームに画像を追加
animation->addSpriteFrameWithFileName(szImageFileName);


}
// 用意した画像を反対の順番で格納する
if ( isReverse ){
for ( int i = endNum; i>=startNum; i-- ){

// ファイル名を生成
char szImageFileName[128] = {0};
sprintf(szImageFileName, fileName, i);

// アニメーション フレームに画像を追加
animation->addSpriteFrameWithFileName(szImageFileName);

}
}


// 引数の"duration"秒間の間で全フレームを表示
int frameCnt = (animation->getFrames())->count();
animation->setDelayPerUnit( duration/ frameCnt );

// 全フレーム表示後に最初のフレームにもどる設定
animation->setRestoreOriginalFrame(true);

// 出来たアニメーションをキャッシュに登録
animationCache->addAnimation( animation, cacheName );

}



初期化時のこんな感じ複数アニメーションを登録しておいて

// 通常の顔のアニメーションをキャッシュに登録
this->addAnimationCache( "kasakun_%01d.png", "normal", 1, 5, true, 1.0 );

// OKな顔のアニメーションをキャッシュに登録
this->addAnimationCache( "kasakun_OK_%01d.png", "ok", 1, 5, true, 1.0 );

// NGな顔のアニメーションをキャッシュに登録
this->addAnimationCache( "kasakun_NG_%01d.png", "ng", 1, 5, true, 1.0 );




通常のアニメーションを上で設定した"normal"から取得して実行します。

// 通常の顔のアニメーションを取得
CCAnimationCache *animationCache = CCAnimationCache::sharedAnimationCache();
CCAnimation *animation = animationCache->animationByName("normal");

// フレームアニメーションを繰り返す
CCRepeatForever *action = CCRepeatForever::create( CCAnimate::create(animation) );

// アニメーションを実行
sprite->runAction(action);



次はパラパラアニメーションの切り替え!
止めて別のアニメーションを設定&実行で出来ました。

// まず今の動きを止めます!
this->animationSprite->stopAllActions();

// キャッシュから "ng"という名前で登録されているアニメーションキャッシュ名を取得します。
CCAnimationCache *animationCache = CCAnimationCache::sharedAnimationCache();
CCAnimation *animation = animationCache->animationByName("ng");

// フレームアニメーションは繰り返し
CCRepeatForever *action = CCRepeatForever::create( CCAnimate::create(animation) );

// アニメーションを実行
this->animationSprite->runAction(action);




次はキャラクターを画面上をウロウロ動かしてみたいと思います。

posted by itokami1123 at 16:18| Comment(0) | 日記