Objective c cocos2d在不同目标上按顺序运行序列

Objective c cocos2d在不同目标上按顺序运行序列,objective-c,cocos2d-iphone,Objective C,Cocos2d Iphone,所以,我有一个基本的游戏场景: 一些单位靠近敌人单位,发射射弹,然后调整敌人单位的生命。我的问题是,我不知道如何安排这三个活动一个接一个地进行。如果所有这些操作都是在同一个目标上完成的,那么这将非常容易,但是有两个不同的目标 这样做的最佳方法是什么 代码如下所示: Unit* unit = [self getActiveUnit]; Unit* enemy = [self getEnemyInRange:unit]; CGpoint A = unit.sprite.position; CGPo

所以,我有一个基本的游戏场景:

一些单位靠近敌人单位,发射射弹,然后调整敌人单位的生命。我的问题是,我不知道如何安排这三个活动一个接一个地进行。如果所有这些操作都是在同一个目标上完成的,那么这将非常容易,但是有两个不同的目标

这样做的最佳方法是什么

代码如下所示:

Unit* unit = [self getActiveUnit];
Unit* enemy = [self getEnemyInRange:unit];

CGpoint A = unit.sprite.position;
CGPoint B = [self getPositionClose:enemy for:unit];

CCSequence* unitMove = [self generateUnitMoveFrom:A to:B];

Projectile* proj = [self generateProjectile];
CCSequence* projMove = [self generateProjMoveFrom:A to:B];

CCSequence* attackDone = [self generateAttackDoneFor:unit enemy:enemy];

// This is the part that i don't know how to do
// Execute these in order and sequentially, not at the same time
[unit.sprite runAction:unitMove];
[proj.sprite runAction:projMove];
[proj.sprite runAction:removeSprite];
[self runAction:attackDone];
最好的方法是什么?即使使用CCActionManager,它仍然看起来相当复杂,因为我认为我必须在所有这些操作之间添加一个额外的回调,以恢复下一个目标的预定操作

有什么想法吗


谢谢

我会尝试使用
CCSequence

[self runAction:[CCSequence actions:
  [CCCallFuncO actionWithTarget:unit.sprite selector:@selector(runAction:) object:unitMove],
  [CCCallFuncO actionWithTarget:proj.sprite selector:@selector(runAction:) object:projMove],
  [CCCallFuncO actionWithTarget:proj.sprite selector:@selector(runAction:) object:removeSprite],
  [CCCallFunc actionWithTarget:self selector:@selector(attackDone)],
                     nil]];

同意詹姆斯的观点。另外,如果在运行其他操作之前,您希望给一些操作更多的时间,那么您可以添加延迟

[CCDelayTime actionWithDuration:0.5]


您可以创建一个动作数组,然后安排一些方法逐个调用它们。比如说

- (void) playManyActionsOneByOne
{
    // create some actions and add them to the
    // mutable array m_actionsContainer

    [self runNextActionInArray];
}

- (void) runNexActionInArray
{
    if( [m_actionsContainer count > 0] )
    {
        id nextAction = [m_actionsContainer objectAtIndex:0];
        id callback = [CCCallFunc actionWithTarget: self selector: @selector(runNextActionInArray)];
        id sequence = [CCSequence actionOne: nextActon two: callback];
        [neededNode runAction: sequence];

        [m_actionsContainer removeObjectAtIndex:0];
    }    
}

它将一个接一个地运行操作,当其他操作尚未完成时,您甚至可以将操作添加到阵列中。

您可能需要此代码来运行多个
CCAction
每个操作针对不同的CCNode/CCSprite/…);但要按顺序启动所有

CCMoveBy *moveUpAction = CCMoveBy::create(0.5,ccp(0,400));
CCMoveBy *moveRightAction = CCMoveBy::create(1,ccp(300,0));
CCMoveBy *moveDownAction = CCMoveBy::create(1,ccp(0,-400));

CCTargetedAction *mm = CCTargetedAction::create(someNode_1,moveUpAction);
CCTargetedAction *rr = CCTargetedAction::create(someNode_2,moveRightAction);
CCTargetedAction *dd = CCTargetedAction::create(someNode_3,moveDownAction);

// Here we first run 'moveUpAction' on someNode_1.
// After finishing that Action we start 'moveRightAction' on someNode_2
// After finishing the Action, we start ...
CCSequence *targetedSeq = CCSequence::create(mm,rr,dd,NULL);
whateverNode->runAction(targetedSeq );

这种方法的问题在于,在这种情况下,CCCallFuncO是动作,而不是实际的动画或其他东西。所有这些都将按顺序执行,但由于它们只是函数调用,因此会立即执行。我希望这是有道理的。例如,在我的例子中,是的,精灵开始移动,但在瞬间它被移除,因为函数调用本身与运动动画不同,没有超时。所以,我甚至没有看到任何东西飞(因此,我添加了Justin的通话间隔超时解决方案:)我将您的解决方案与James的示例一起使用:)我认为今后我将不得不提出类似于您建议的内容。在学习这些知识和原型设计时,我选择了一条简单的道路:)我将James的答案标记为正确的答案,因为这是第一个也是最接近我所问的问题,尽管其他解决方案是有效和必要的。希望我能标记多个答案:(尽管对其他回答正确的人来说仍然不公平,但你可以修改现有答案使其更完整。或者写下你自己的答案,将其他答案合并,并将其标记为完整。