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) | 日記

2013年03月08日

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

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

今日はCocos2d-xのパラパラアニメーションを調べてみたいと思います。
クイズに正解したときとかにキャラクターを動かしたいですよね!
きっと、UIKit(Objective-C)のUIImageView の animationImages の様な仕組みがあるはず!

本家のサイトに分かりやすく書いてありました(英語ですけど)
http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Animations
# ここを読めばこのブログは読まなくても。。。


そこを参考に自分のアプリでは
以下のような感じでパラパラアニメーション実装しようかと思ってます。


// まずはパタパタアニメーションするスプライトを準備
CCSprite* sprite = CCSprite::create("kasakun_1.png");

// 置き場所を決めて
sprite->setPosition( ccp(size.width/2-100, size.height/2) );

// 配置!
this->addChild(sprite,1);


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

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

// ファイル名を生成
char szImageFileName[128] = {0};

// 例) kasakun_1.png kasakun_2.png kasakun_3.png ... とファイル名を作る
sprintf(szImageFileName, "kasakun_%01d.png", i);

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

}

// 0.6秒間の間に 5フレーム切替表示を行う
animation->setDelayPerUnit( 0.6f / 5.0f );

// 全フレーム表示後は1フレームに戻る
animation->setRestoreOriginalFrame(true);

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

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


これでずっっとアニメーションを繰り返します。

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


posted by itokami1123 at 01:14| Comment(0) | 日記

2013年02月27日

iAdが出なくなりました。。。

小学生向けの算数先生にiAdを入れていたのですが
まったくでなくなりました。

https://developer.apple.com/support/ios/iad-network.htmlをみて納得しました。。。

Please note: Apple policy does not allow for iAd rich media ads in apps designed for children.
ご注意:Appleの方針は、子供たちのために設計されたアプリのIADはリッチメディア広告を許可しません。

なるほどですねぇ。とほほ。
posted by itokami1123 at 00:28| Comment(0) | 日記