1

反復可能な一連のアクション (CCMoveBy、CCMoveTo) を作成する必要がありますが、ランダムなパラメーター (位置、期間) を使用する必要があります。私は2つの方法を書きました:

-(void) randomizeVec

-(void) calcTiltDuration

実際、これらのパラメーターは外部変数 (要因) に依存します。私はそのようなことはできません:

id randomize = [CCCallFuncN actionWithTarget:self selector:@selector(randomizeVec)];
id calcTilt = [CCCallFuncN actionWithTarget:self selector:@selector(calcTiltDuration)];
CCMoveBy* tilt = [CCMoveBy actionWithDuration:mTIltDuration position:randomVec];
CCMoveTo* restore = [CCMoveTo actionWithDuration:mTIltDuration position:initialTowerNodePos];
CCDelayTime* wait = [CCDelayTime actionWithDuration:0.1];
CCSequence* seq = [CCSequence actions:wait,calcTilt,randomize, tilt, restore, nil];
[aNode runAction:[CCRepeatForever actionWithAction:seq]];

値は一度コピーされ、randomizeVec と calcTiltDuration はアクションに影響しないため、次のメソッドを作成しました。

-(void) moveRandomVector:(CCNode*) node
{
    int dx = rand_between(-1, 2) * mShakeFactor *2 ;
    int dy = rand_between(-1, 2) * mShakeFactor *2;
    CCMoveBy* action = [CCMoveBy actionWithDuration:0.1/mShakeFactor position:CGPointMake(dx, dy)];
    CCMoveTo* action2 = [CCMoveTo actionWithDuration:0.1/mShakeFactor position:initialTowerNodePos];
    CCEaseInOut* easyTilt = [CCEaseInOut actionWithAction:action rate:0.1];
    CCEaseInOut* easyRestore = [CCEaseInOut actionWithAction:action2 rate:0.1];
    CCSequence* seq = [CCSequence actions:easyTilt,easyRestore , nil];
    [node runAction:seq];
}

これは CCCallFuncN 経由で呼び出されます:

id action = [CCCallFuncN actionWithTarget:self selector:@selector(moveRandomVector:)];
CCSequence* sq = [CCSequence actionOne:action two:[CCDelayTime actionWithDuration:0.1]];
[towerNode runAction:[CCRepeatForever actionWithAction:sq]];

因子は外部メソッドで変化します (mShakeFactor)。

適切なアプローチですか?私は Cocos2d の専門家ではなく、CCCallFuncN を含むシーケンスを実行するアクションが停止する状況を心配していますが、moveRandomVector 内の CCMove* アクションなどは停止しません。たぶん、私が実装できる別のアプローチを知っていますか?

4

1 に答える 1

0

最後に、アクションの開始を担当するコードを update メソッドに移動しました。更新が呼び出されるたびに、一連のアクション (ブール変数) を実行できるかどうかを確認します。実行できる場合は、変数を NO に設定しますが、シーケンスの最後のアクションの後、メソッドを呼び出して、シーケンスを再度実行できるかどうかを確認します。アクションに影響を与える変数 (CCMoveBy、CCMoveTo) を変更でき、CCRepeatForever に似ているので快適です。

于 2012-08-31T13:58:43.190 に答える