2013-03-16 3 views
4

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

  • Первая карта спрайт будет перемещаться из-за экрана, чтобы руки игрока
  • Второй спрайт карты будет перемещаться из-за экрана в руке дилера
  • Третье -> игрок
  • Четвертый -> дилер

Для этого я вызываю метод 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]; 
...... 
} 

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

ответ

2

Вы можете сделать это в 2ways 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. Использование 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];  
    } 
+0

Спасибо, что это сработало! вопрос: я думал, что действие должно завершиться до того, как будет выполнена следующая строка? И есть ли более элегантный способ добиться этого же результата? (Я думаю, многопоточность/performselector: afterDelay или waitUntilDone) –

+0

обновил мой ответ ... вместо того, чтобы выполнятьselector его лучше использовать CCCallBlock в cocos2d. – Guru

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