2013-05-27 3 views
0

Я пишу игру в блэкджек, используя cocos2D. Я использую CCSequence много, и во многих местах в моем коде есть проблемы с ним. Проблема, с которой я сталкиваюсь, заключается в том, что одно действие срабатывает до того, как предыдущий выполняется. , например:CCSequence не ждет действия, чтобы закончить до следующего запуска

-(void)standButtonPressed:(id)sender 
{ 
    [self removeChildByTag:333]; 

    if ((splitNumber<3)&&(numberSplitHits>0)) 
    { 
     [self removeChildByTag:333]; 
     splitNumber++; 
     if ([[hands objectAtIndex:splitNumber]handTotal]==0) 
      goto end; 
     [self afterSpliting]; 
     [self addArrow]; 
     return; 
    } 

    end: 
    [self removeChildByTag:333]; 
    [[BackgroundLayer sharedBackground]menuSetup:hand gamePhase:3]; 
    BJDrawnCard *holeCard = [dealerHand getFlippedCard]; 
    [holeCard flipCard]; 
    [[SimpleAudioEngine sharedEngine] playEffect:SND_DEAL_CARD]; 
    [self generateDealerHandDisplay]; 
    [self updateDealerHandScoreDisplay]; 
    id myCallFun1 = [CCCallFunc actionWithTarget:self     selector:@selector(finishDrawingDealer)]; 
    id myCallFun2 = [CCCallFunc actionWithTarget:self selector:@selector(checkWhoWonHand)]; 
    id myCallFun3 = [CCCallFuncND actionWithTarget:[BackgroundLayer sharedBackground] selector:@selector(menuSetup:gamePhase:)data:(void*)6]; 
    CCDelayTime *delay = [CCDelayTime actionWithDuration:2]; 
    [self runAction:[CCSequence actions:myCallFun1,delay,myCallFun2,myCallFun3 ,nil]]; 
} 

так myCallFunc2 бы начать работать, прежде чем заканчивается myCallFun1. У меня такая же проблема в других частях моего кода при использовании CCSequence, действия начнутся по порядку, но не дождаться завершения действия до следующего запуска.

Есть ли лучший способ для последовательности действий или, может быть, даже замена CCSequence?

здесь метод, который myCallFun1 называет:

-(void)finishDrawingDealer 
{ 
if (dealerHand.handTotal<17) 
{ 
drawnCard=[havila drawFromDeck]; 
[drawnCard setDisplayFrame:[[CCSpriteFrameCache  sharedSpriteFrameCache]spriteFrameByName:drawnCard.imageFileName]]; 
CCMoveTo *move =[self animateDealerCards:drawnCard andPosition:[self dealerCardPosition]]; 
CCDelayTime *delay = [CCDelayTime 
         actionWithDuration:0.5]; 
[dealerHand getCard:drawnCard]; 

//Run the action 

numDealerHits++; 
[self performSelector:@selector(updateDealerHandScoreDisplay) withObject:nil afterDelay:1.0]; 


if (dealerHand.handTotal<17) { 
    id more = [CCCallFunc actionWithTarget:self selector:@selector(finishDrawingDealer)]; 


    [drawnCard runAction:[CCSequence actions:delay,move,delay,more,nil]]; 
} else { 
    [drawnCard runAction:[CCSequence actions:delay,move,delay,nil]]; 
} 
if (dealerHand.handTotal>21) 

    [self dealerBusted]; 
} 
} 
+0

Вы должны просмотреть свой способ отступов кода. –

+0

Как вы заметили, что myClassFun2 вызывается до завершения myClassFun1? Я полагаю, вы регистрируете его или используете отладчик. Также отправьте код или что бы вы ни пришли с этим заключением. –

+0

Что делает myClassFun1? можете ли вы опубликовать реализацию? – giorashc

ответ

2

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

Вместо этого вы можете вызвать следующий метод в конце каждого метода, как показано ниже. Я также заметил, что вам нужна задержка, которую вы можете сделать с последовательностью и CCCallFunc.

- (void)finishDrawingDealer 
{ 
    //Do your work that takes time 

    //Once it has finished 
    id callNextMethod = [CCCallFunc actionWithTarget:self selector:@selector(checkWhoWonHand)]; 
    id sequence = [CCSequence actions:[CCDelayTime actionWithDuration:2.0f], callNextMethod, nil]; 
    [self runAction:sequence]; 
} 
+0

Это сработало !!! спасибо кучу –

+0

Почему бы просто не назначить селектор, используя 'CCScheduler', тогда? Нет необходимости запускать действия. Кроме того, вы должны использовать 'CCCallBlock' вместо' CCCallFunc', так или иначе, если вы находитесь на Cocos2D 2.x. –

+0

Да, правда, это сработает. CCCallFunc отлично работает, если у вас уже есть методы. Единственное, что мне не нравится, это CCCallFuncND, поскольку это не сработает с ARC. –

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