2012-06-14 1 views
2

Таким образом, у меня есть основная игра scenerario:cocos2d работает последовательность, чтобы на разных целях

Некоторый блок перемещается близко к вражескому отряду, стреляет снаряд, а затем жизнь вражеского блока регулируется. Моя проблема в том, что я не уверен, как планировать эти три события запускать один за другим. Если бы все эти действия выполнялись по одной и той же цели, то это было бы очень просто, но есть две разные цели.

Что было бы лучше всего подходит для этого?

код выглядит следующим образом:

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 это все еще кажется довольно сложным, потому что я думаю, мне придется добавить дополнительный вызов между всеми этими действиями, чтобы возобновить запланированные действия для следующей цели.

Любые идеи?

Спасибо!

+0

Я отметил ответ Джеймса как правильный, потому что он был первым и самым близким к тому, что я просил, хотя другие решения действительны и необходимы. Хотелось бы отметить несколько :( – SpaceBear

+0

Хотя все еще нечестно по отношению к другим, которые правильно ответили, вы можете изменить существующий ответ, чтобы сделать его более полным. Или напишите свой собственный, что является объединением других ответов и отметьте это как полное. –

ответ

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]]; 
+0

проблема с этим подходом заключается в том, что CCCallFuncO - это действие в этом случае, а не фактическая анимация или что-то еще. Все они будут выполняться последовательно, но поскольку они являются просто вызовами функций, они происходят мгновенно. Надеюсь, это имеет смысл. Для Например, в моем случае да, спрайт начинает двигаться, но через секунду он удаляется, потому что сам вызов функции не имеет времени, в отличие от анимации движения. Поэтому я даже не вижу ничего летающего. :( – SpaceBear

+0

Итак, я добавил решение таймаута Justin между звонками :) – SpaceBear

1

Согласовано с Джеймсом. Кроме того, вы могли бы добавить задержку, если было какое-то действие, которое вы хотели бы дать немного больше времени, прежде чем другие будут запущены ...

[CCDelayTime actionWithDuration: 0.5];

+0

Я использовал ваше решение с примером Джеймса :) – SpaceBear

1

вы можете создать массив своих действий, а затем scedule некоторый метод, чтобы называть их по одному. Например

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

он будет работать действиям один за другим, и вы даже можете добавить действия в массив в то время как другие действия, которые еще не сделали.

+0

Я думаю, что по дороге мне придется придумать что-то вроде того, что вы предлагаете. Я как бы занимаюсь легкой дорогой, изучая эти вещи и прототипы :) – SpaceBear

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); 
+0

Лучший ответ! – Narek

Смежные вопросы