与CCSequence一起使用的CCCallFuncN中的操作

时间:2012-08-30 15:00:40

标签: ios cocos2d-iphone

我需要创建可重复的动作序列(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中的其他动作不会。也许您知道我可以实施的不同方法吗?

1 个答案:

答案 0 :(得分:0)

最后,我将负责启动操作的代码移动到更新方法。每次调用更新时,我都会检查是否可以运行一系列操作(布尔变量)。如果我可以运行它然后将变量设置为NO,但在顺序的最后一个操作之后我调用方法,它检查我是否可以再次运行序列。它很舒服,因为它允许我更改影响动作的变量(CCMoveBy,CCMoveTo),它类似于CCRepeatForever。