【iPhoneアプリ】「cocos2d for iPhone」でゲームアプリを作ってみる(CCActionを複数使って複雑なアクションを作る)


タイトル通りです。cocos2dの機能を紹介します。
今回は前回
紹介したCCActionを更に有効に使うためのクラスなどを紹介します。
CCActionを複数組み合わせる事で複雑な動きを表現させることができます(^ω^)


CCAction関連のメソッドとクラス


cocos2dでは、

・前回の記事
【iPhoneアプリ】「cocos2d for iPhone」でゲームアプリを作ってみる(CCActionで色々な動きを表現)

で紹介したCCAcitonの他にも、
CCActionを複数組み合わせるCCActionが用意されています。

例えば、「フェードインするアクション」と、「180度回転するアクション」を
同時に実行するアクションみたいなものが作れます。

さらにその繋げたアクションを「3回繰り返す」ようなアクションも作成できます。

このような仕組みを利用すれば、ゲームに使えそうな複雑な動きが作れますね(^ω^)

クラス名アクション内容
CCSequence複数のCCActionを順番に動かす
CCSpawn複数のCCActionを同時に動かす
CCRepeatCCActionを指定した回数繰り返して動かす
CCRepeatForeverCCActionを無限に繰り返す
CCActionのreverseメソッド逆の動きをするCCActionを作成
CCDelayTime一定時間停止させる
CCCallBlockブロック内に書かれた処理を実行する
CCCallFunc指定したメソッドを実行する

いくつか作成例を紹介してみます。

CCSequenceで複数のCCActionを順番に実行する


複数のアクションを指定して、順番に動かすアクションを作れます。
・180度回転する
・1秒待機する
・右に100移動する
というアクションを作る時は以下のように。

    CCRotateBy *rotate   = [CCRotateBy actionWithDuration:1 angle:180];
    CCMoveBy   *move     = [CCMoveBy actionWithDuration:1 position:ccp( 100, 0 )];
    CCDelayTime *delay   = [CCDelayTime actionWithDuration:1];
    CCSequence *sequence = [CCSequence actions:rotate,delay,move, nil];
    [アクション対象 runAction:sequence];



CCSpawnで複数のCCActionを同時に実行する


spawn(スポーン)は「生む」という意味があるそうです、聞きなれない単語ですね(´ω`)
複数のアクションを指定して、同時にに動かすアクションを作れます。
・180度回転する
・右に100移動する
・フェードアウトする
というアクションを作る時は以下のように。

    CCRotateBy *rotate  = [CCRotateTo actionWithDuration:1 angle:180];
    CCMoveBy   *move    = [CCMoveBy actionWithDuration:1 position:ccp( 100, 0 )];
    CCMoveBy   *fadeOut = [CCFadeOut actionWithDuration:1];
    CCSpawn *spawn = [CCSpawn actions:rotate,move,fadeOut, nil];
    [アクション対象 runAction:spawn];



CCRepeat,CCRepeatForeverでCCActionを繰り返す


アクションを指定して、何回も繰り返します。
CCSequenceと組み合わせて左右に移動し続けるアクションを作ってみます。
右に移動するアクションを左に移動するアクションを作ってもできますが、
今回はCCActionのreverseメソッドを使って実装してみます。


    CCMoveBy *move = [CCMoveBy actionWithDuration:0.5 position:ccp( 50, 0 )];
    CCActionInterval *reverse = [move reverse];
    CCSequence *seq = [CCSequence actions:move,reverse, nil]; // 左右に移動するアクション
    CCRepeat * repeat = [CCRepeat actionWithAction:seq times:3]; // 3回繰り返す
    [アクション対象 runAction:repeat];



四行目を以下のようにCCRepeatForever使うように修正すれば、
無限に繰り返します。
  CCRepeatForever *repeat = [CCRepeatForever actionWithAction:seq ];



CCCallBlock,CCCallFuncで特定の処理を実行する


用意されたアクション以外にも特定の処理を使いたい時に使います。
主にCCSequenceを組み合わせて使うことになると思います。

・180度回転する
・ログを出力する
この2つの処理を無限に繰り返す時は以下のようにします。
    CCRotateBy *rotate = [CCRotateBy actionWithDuration:1 angle:180];
    CCCallBlock *call  = [CCCallBlock actionWithBlock:^(void){
        CCLOG(@"call");
    }];
    CCSequence *seq = [CCSequence actions:rotate,call, nil];
    CCRepeatForever *repeat = [CCRepeatForever actionWithAction:seq ];
    [アクション対象 runAction:repeat];






サンプルプログラム


今回紹介した例をまとめたものを用意しました。

-GitHubはこちら
github.com/ouka-tenshi/iOS-Sample/tree/master/Cocos2dActionSampleEx

デフォルトのテンプレートプロジェクトから
HelloWorldLayer.mとHelloWorldLayer.hを修正しています。
「tenko.png」というファイルを「Resources」グループ内に追加して下さい。

・HelloWorldLayer.h(インスタンス変数追加)
// HelloWorldLayer
@interface HelloWorldLayer : CCLayer <GKAchievementViewControllerDelegate, GKLeaderboardViewControllerDelegate>
{
    CCSprite *tenko;
}



・HelloWorldLayer.m(initメソッド内を修正,メソッド追加)
-(id) init
{
	// always call "super" init
	// Apple recommends to re-assign "self" with the "super's" return value
	if( (self=[super init]) ) {
        
		// 画面サイズを取得
		CGSize winSize = [[CCDirector sharedDirector] winSize];
        
        // Action対象のスプライト
        tenko = [CCSprite spriteWithFile:@"tenshi.png"];
        tenko.position = ccp( winSize.width/2 , winSize.height/2);
        [self addChild:tenko];
        
        
        // CCActionを実行させる用のメニューを作成
        [CCMenuItemFont setFontName:@"AppleGothic"];
        [CCMenuItemFont setFontSize:25];
        CCMenuItemFont *menu1 = [CCMenuItemFont itemWithString:@"sequence"
                                                        target:self
                                                      selector:@selector(sequence:)];
        CCMenuItemFont *menu2 = [CCMenuItemFont itemWithString:@"spawn"
                                                        target:self
                                                      selector:@selector(spawn:)];
        CCMenuItemFont *menu3 = [CCMenuItemFont itemWithString:@"repeat"
                                                        target:self
                                                      selector:@selector(repeat:)];
        CCMenuItemFont *menu4 = [CCMenuItemFont itemWithString:@"call"
                                                        target:self
                                                      selector:@selector(call:)];
        CCMenu *menu = [CCMenu menuWithItems:menu1,menu2,menu3,menu4, nil];
        [menu alignItemsVerticallyWithPadding:10];
        menu.position = ccp( 100, winSize.height/2  );
        
        [self addChild:menu];
        
        
	}
	return self;
}

-(void)sequence:(id)sender{
    CCRotateBy *rotate = [CCRotateBy actionWithDuration:1 angle:180];
    CCMoveBy   *move = [CCMoveBy actionWithDuration:1 position:ccp( 100, 0 )];
    CCDelayTime *delay = [CCDelayTime actionWithDuration:1];
    CCActionInterval *reverseRotate = [rotate reverse];
    CCActionInterval *reverseMove   = [move reverse];
    CCSequence *sequence = [CCSequence actions:rotate,move,delay,reverseRotate,reverseMove, nil];
    [tenko runAction:sequence];
}
-(void)spawn:(id)sender{
    CCRotateBy *rotate  = [CCRotateTo actionWithDuration:1 angle:180];
    CCMoveBy   *move    = [CCMoveBy actionWithDuration:1 position:ccp( 100, 0 )];
    CCMoveBy   *fadeOut = [CCFadeOut actionWithDuration:1];
    CCSpawn *spawn = [CCSpawn actions:rotate,move,fadeOut, nil];
    [tenko runAction:spawn];
}
-(void)repeat:(id)sender{
    CCMoveBy *move = [CCMoveBy actionWithDuration:0.5 position:ccp( 50, 0 )];
    CCActionInterval *reverse = [move reverse];
    CCSequence *seq = [CCSequence actions:move,reverse, nil];
    CCRepeat * repeat = [CCRepeat actionWithAction:seq times:3];
    [tenko runAction:repeat];
}
-(void)call:(id)sender{
    CCRotateBy *rotate = [CCRotateBy actionWithDuration:1 angle:180];
    CCCallBlock *call  = [CCCallBlock actionWithBlock:^(void){
        CCLOG(@"call");
    }];
    CCSequence *seq = [CCSequence actions:rotate,call, nil];
    CCRepeatForever *repeat = [CCRepeatForever actionWithAction:seq ];
    [tenko runAction:repeat];
}



【実行結果】
【iPhoneアプリ】「cocos2d for iPhone」でゲームアプリを作ってみる(CCActionを複数使って複雑なアクションを作る):サンプルプログラム




次回はタッチイベントについて紹介します。



       |
       |
 : : :::::::,. -─´、て
::: :: :::Σco===、!,_
: : :: :::::l´i(ノリハノリ)   CCAnimationもやりたかった…しかし元気が足りない…
 : : :::::ルlリ⊃⊂ヽ
 : : ::::(( //xxxxヽ、─────────────────
    /~~~
  ./


関連記事

コメントは受け付けていません。