CCSequence在下一个开始之前不等待动作完成

时间:2013-05-27 14:28:21

标签: objective-c cocos2d-iphone

我正在使用cocos2D写一个二十一点游戏。 我使用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];
}
}

1 个答案:

答案 0 :(得分: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];
}