等待CCMoveTo完成?

4
我正在使用cocos2d制作一款BlackJack游戏,但是我似乎无法找到解决问题的方法。我试图使初始发牌屏幕如下所示:
  • 第一张卡片精灵将从屏幕外移动到玩家手中
  • 第二张卡片精灵将从屏幕外移动到荷官手中
  • 第三张卡片精灵将移动到玩家手中
  • 第四张卡片精灵将移动到荷官手中
为了做到这一点,我从Player和Dealer类中都调用了drawCard方法:
[self.player drawCard];
[self.dealer drawCard];
[self.player drawCard];
[self.dealer drawCard];

在drawCard方法中:
-(void) drawCard {
.......
id move = [CCMoveTo actionWithDuration:0.4 position:ccp(x, y)];
        [card.sprite runAction:move];
......
}

我希望第一张卡片在移动到指定位置后再开始移动第二张卡片,但实际情况是四张卡片几乎同时开始移动。请帮我解决这个问题 :(

1个回答

2
你可以用两种方式来实现:1. 使用 CCDelayTime 2. 使用 CCCallBlock 1. 使用 CCdelayTime
   [self.player drawCard:0]; 
   [self.dealer drawCard:0.5f]; 
   [self.player drawCard:1.0f]; 
   [self.dealer drawCard:1.5f];

    -(void) drawCard:(float)delay
    {
       if(!delay)
       {
          id move = [CCMoveTo actionWithDuration:0.4 position:ccp(x, y)];
          [card.sprite runAction:move];
       }
       else
       {
          id delay    = [CCDelayTime actionWithDuration:delay];
          id move     = [CCMoveTo actionWithDuration:0.4 position:ccp(x, y)];
          id sequence = [CCSequence actions:delay, move, nil];
          [card.sprite runAction:sequence];
       }

    }

2. Using CCCallBlock

    -(void) drawCard:(id)inCard
    {
        mCardIndex++; //in init mCardIndex=0

        id move    = [CCMoveTo actionWithDuration:0.4 position:ccp(x, y)];
        id calBlk  = [CCCallBlock actionWithBlock:^{

                            if(mCardIndex <= TOTAL_CARD)
                            {
                                //here get rightCard
                                [self drawCard:newCard];
                            }
                    }];
        id sequence = [CCSequence actions: move, calBlk,  nil];

        [inCard.sprite runAction:sequence];    
    }

非常感谢,它起作用了!不过我有一个问题:我认为一个操作需要在下一行执行之前完成?是否有更优雅的方法来实现相同的结果?(我在考虑多线程/ performselector:afterDelay 或 waitUntilDone) - Kayden Bui
更新了我的回答...在cocos2d中,使用CCCallBlock比performselector更好。 - Guru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接