0

I am writing a blackjack game using cocos2D. Im using CCSequence a lot and in numerous places in my code have issues with it. The problem I'm having is that one action is firing before the previous one is done running. for example:

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

so myCallFunc2 would start running before myCallFun1 finishes. I have the same problem in other parts of my code when using CCSequence, actions would start in order but not wait for an action to finish before the next one starts.

Is there a better way to sequence actions, or maybe even a substitute to CCSequence?

here is the method that myCallFun1 calls:

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

1 回答 1

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];
}
于 2013-05-28T00:42:25.753 回答