Воспроизведение анимации в последовательности в цели c - PullRequest
1 голос
/ 22 мая 2010

Я пытаюсь воспроизводить анимации последовательно, но у меня возникают проблемы при их воспроизведении, поскольку цикл for выполняет итерацию по списку объектов в массиве.

он будет перемещаться по массиву, но он выиграл 'не проигрывая каждый, он просто проигрывает последний.

-(void) startGame {
    gramma.animationDuration = 0.5;

    // Repeat forever
    gramma.animationRepeatCount = 1;
    int r = arc4random() % 4;
    [colorChoices addObject:[NSNumber numberWithInt:r]];

    int anInt = [[colorChoices objectAtIndex:0] integerValue];
    NSLog(@"%d", anInt);
    for (int i = 0; i < colorChoices.count; i++) {

        [self StrikeFrog:[[colorChoices objectAtIndex:i] integerValue]];
        //NSLog(@"%d", [[colorChoices objectAtIndex:i] integerValue]);
        sleep(1);

    }
}

он проходит весь цикл очень быстро, и сон ничего не делает, чтобы позволить ему воспроизводить каждую анимацию ... какие-либо предложения?

Ответы [ 2 ]

0 голосов
/ 22 мая 2010

Я подозреваю, что знаю, что не так, но не знаю, как «исправить» это, в зависимости от того, насколько «правильным» вы хотите быть. Происходит все просто - Objective C не вызывает функции, он передает сообщения. Когда вы делаете [self StrikeFrog], сообщение помещается в очередь для выполнения, как только очередь может быть очищена; вы, вероятно, получаете все сообщения в конце, потому что StrikeFrog не вызывается перед сном - он вызывается всякий раз, когда поток очереди разблокируется. Например, в однопоточном приложении чистый эффект будет состоять в том, что он будет спать в течение (colorChoices.count) секунд, а затем выполнит все события StrikeFrog после выхода из цикла for, поскольку это первый раз, когда очередь событий может отправлять ваши события. Другими словами, все «вызовы функций» в Obj C являются асинхронными, независимо от того, сколько потоков используется.

Я бы предложил перейти на более низкий уровень с C или на более высокий уровень с CoreAnimation. Если ни один из этих способов вам не подходит, вы можете попробовать NSObject executeSelector: withObject: afterDelay: , чтобы поставить в очередь целую группу событий, каждое из которых выполняется после некоторой задержки. У этого метода есть много проблем, с которыми вам придется разобраться, поэтому будьте осторожны.

0 голосов
/ 22 мая 2010

Используйте NSTimer, чтобы цикл обработки имел время для обработки.Рисование не начинается до тех пор, пока не вернется startGame.

Редактировать:

-(void) myTimerMethod:(NSTimer *)inTimer {
  if ( mPosition < [colorChoices count] ) {
    [self StrikeFrog:[[colorChoices objectAtIndex:mPosition] integerValue]];
    mPosition += 1;
  } else {
    [inTimer invalidate];
  }
}

Чтобы запустить его:

mPosition = 0;
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(myTimerMethod:) userInfo:nil repeats:YES];

Если вам необходимо остановить таймер на полпутисохраните ссылку на него, чтобы при необходимости можно было сделать его недействительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...