反復可能な一連のアクション (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* アクションなどは停止しません。たぶん、私が実装できる別のアプローチを知っていますか?