SOHOゆいちのサイト
cocos2dのサンプルを勉強がてら読みといていくメモです。テストコードのActionManagerTestを読んでいってみます。全体の流れは前回追いかけてみたので、今回は個々のテストのCCLayerクラスの中を見てみます。
アクションの最中に、オブジェクトが設置されているLayerを削除した場合の挙動のテストのようです。
CCSprite *child = [CCSprite spriteWithFile:@"grossini.png"]; [child setPosition:ccp(200,200)]; [self addChild:child z:1];
画像を使ってスプライトを生成し、それを、Layerに設置しています。
[child runAction:[CCRotateBy actionWithDuration:1.5f angle:90]];
1.5秒で90度回転するアニメーションアクションをセットしています。アクションは
[オブジェクト runAction: アクション]
で指定するようです。
[child runAction:[CCSequence actions:
[CCDelayTime actionWithDuration:1.4f],
[CCFadeOut actionWithDuration:1.1f],
nil]
];
続いて、1.4秒の待機、1.1秒でのフェードアウトを実行しています。複数のアクションを連続して実行する場合
[オブジェクト runAction: [CCSequence Actions:アクション1,アクション2,,,,]];
と指定します。これは、以下のようにアクションシーケンスを先に変数に入れる形でも書けます。
CCSequence* seq = [CCSequence actions:[CCDelayTime actionWithDuration:1.4f],
[CCFadeOut actionWithDuration:1.1f],
nil];
];
[child runAction:seq];
[self runAction:[CCSequence actions:
[CCDelayTime actionWithDuration:1.4f],
[CCCallFunc actionWithTarget:self selector:@selector(removeThis)],
nil]
];
さらに1.4秒待って、[self removeThis]を実行します。
removeThis関数では、次の処理が実行されます。
[parent_ removeChild:self cleanup:YES]; [self nextCallback:self];
親オブジェクトから自分自身を削除し、次のテストをnextCallbackで呼び出します。
ここで、「parent_」はCCLayerクラスで自動にセットされる親オブジェクトで、
cleanupはtrueを指定するとそのインスタンス自体が開放されます。
ここでクラッシュしないことを確認するテストのようです。
アクションのシーケンスを中断して、別のアクションを実行するテスト(ぽいのですが、コードを見る限り、停止されるアクションが無いように見えるので、間違っているかもしれません。
CCSprite *grossini = [CCSprite spriteWithFile:@"grossini.png"];
[self addChild:grossini];
[grossini setPosition:ccp(200,200)];
[grossini runAction: [CCSequence actions:[CCMoveBy actionWithDuration:1 position:ccp(150,0)],
[CCCallFuncN actionWithTarget:self selector:@selector(bugMe:)],nil]
];
前のテスト同様に画像を使って、スプライトを生成し、移動アクションの後に、bugMeメソッドを呼び出しています。
[node stopAllActions]; //After this stop next action not working, if remove this stop everything is working [node runAction:[CCScaleTo actionWithDuration:2 scale:2]];
bugMeメソッドでは、stopAllActionsを実行した後、サイズを2秒かけて2倍にするアクションがセットされています。が、、、stopAllActionsはもともとセットされていたアクションの実行を停止するものだと思うのですが、CCCallFuncNのアクションの後に自分でアクションを追加して、stopAllActionsをコメントアウトしても挙動の違いが見当たらなかったので、時間があるときにもう少し調べてみます。
[grossini runAction: [CCSequence actions:
[CCMoveBy actionWithDuration:1 position:ccp(150,0)],[CCCallFuncN actionWithTarget:self selector:@selector(bugMe:)],
[CCMoveBy actionWithDuration:1 position:ccp(0,0)],<-この部分を追加
nil]
];
スプライトをポーズ状態で、画面へセットし3秒後に動かす(ポーズを解除する)テストで、scheduleとCCActionManagerが登場します。
-(void) onEnter
{
[super onEnter];
他のテストと異なりonEnterメソッドに実装します。これは、ポーズ状態でオブジェクトを配置するのはinitではなくonEnterのあとである必要があるからのようです。
CCSprite *grossini = [CCSprite spriteWithFile:@"grossini.png"]; [self addChild:grossini z:0 tag:kTagGrossini]; [grossini setPosition:ccp(200,200)];
画像からスプライトを生成します。addChildする際のtagはオブジェクトにタグをセットして、このタグからオブジェクトを見つけ出すことができる目印です。
CCAction *action = [CCMoveBy actionWithDuration:1 position:ccp(150,0)]; [[CCActionManager sharedManager] addAction:action target:grossini paused:YES];
1秒かけて移動するアクションをpaused状態でセットします。「paused:YES」がpaused状態であることを示します。
[self schedule:@selector(unpause:) interval:3];
3秒後にunpauseメソッドを実行します。
スケジュールのセットは
[オブジェクト schedule: @selector(メソッド名) interval: 呼び出し間隔]
で指定できます。
unpauseメソッドでは
[self unschedule:_cmd];
スケジュールのクリア
CCNode *node = [self getChildByTag:kTagGrossini];
タグ名を利用してのオブジェクトの取得
[[CCActionManager sharedManager] resumeTarget:node];
対象のオブジェクトのポーズ解除
を行っています。
アクションを一度セットした後、削除するテスト
CCMoveBy* move = [CCMoveBy actionWithDuration:2 position:ccp(200,0)]; CCCallFunc* callback = [CCCallFunc actionWithTarget:self selector:@selector(stopAction:)]; CCSequence* sequence = [CCSequence actions:move, callback, nil]; sequence.tag = kTagSequence;
移動した後にstopActionを呼び出すアクションシーケンスを生成し、シーケンスにタグをセットします。
CCSprite *child = [CCSprite spriteWithFile:@"grossini.png"]; [child setPosition:ccp(200,200)]; [self addChild:child z:1 tag:kTagGrossini];
画像からスプライトを生成し、タグをセットして配置します。
[child runAction:sequence];
作成したアクションシーケンスを実行します。
stopActionでは
id sprite = [self getChildByTag:kTagGrossini]; [sprite stopActionByTag:kTagSequence];
タグから、オブジェクトを取得し、アクションをタグで指定して停止しています。
用意された試験だと、停止の後にアクションがないので本当に止まっているかを確認するには
CCSequence* sequence = [CCSequence actions:move, callback, nil];
のところを
CCSequence* sequence = [CCSequence actions:move, callback, [move reverse], nil];
としたほうが分かり良いと思います。
www.bshe.org (created by itassist.info)