2

だから、私は基本的なゲームシーンラリオを持っています:

一部のユニットは敵ユニットに近づき、発射物を発射してから、敵ユニットのライフを調整します。私の問題は、これら3つのイベントを次々に実行するようにスケジュールする方法がわからないことです。これらすべてのアクションが同じターゲットで実行された場合、これは非常に簡単ですが、2つの異なるターゲットがあります。

これを行うための最良のアプローチは何でしょうか?

コードは次のようになります。

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を使用しても、次のターゲットのスケジュールされたアクションを再開するには、これらすべてのアクションの間にコールバックを追加する必要があると思うので、それでもかなり複雑に見えます。

何か案は?

ありがとう!

4

4 に答える 4

4

使ってみます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]];
于 2012-06-14T14:29:06.530 に答える
2

複数を実行するためにこのコードが必要になる場合があります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 );
于 2014-07-13T07:25:26.090 に答える
1

ジェームズに同意した。さらに、他のアクションが実行される前にもう少し時間をかけたいアクションがあった場合は、遅延を追加できます...

[CCDelayTime actionWithDuration:0.5];

于 2012-06-14T14:35:37.510 に答える
1

アクションの配列を作成してから、メソッドをスケジュールして1つずつ呼び出すことができます。例えば

- (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];
    }    
}

アクションを1つずつ実行し、他のアクションがまだ実行されていないときに、配列にアクションを追加することもできます。

于 2012-06-14T15:37:58.940 に答える