我需要创建可重复的动作序列(CCMoveBy,CCMoveTo),但是他们需要使用随机参数(位置,持续时间)。我写了两个方法:
-(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中运行序列的动作停止但是,CCMove *动作和moveRandomVector中的其他动作不会。也许您知道我可以实施的不同方法吗?
答案 0 :(得分:0)
最后,我将负责启动操作的代码移动到更新方法。每次调用更新时,我都会检查是否可以运行一系列操作(布尔变量)。如果我可以运行它然后将变量设置为NO,但在顺序的最后一个操作之后我调用方法,它检查我是否可以再次运行序列。它很舒服,因为它允许我更改影响动作的变量(CCMoveBy,CCMoveTo),它类似于CCRepeatForever。