在目标c中按顺序播放动画

时间:2010-05-21 23:00:55

标签: ios animation

我正在尝试按顺序播放动画但我在播放它们时遇到问题,因为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 :(得分:0)

使用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];

如果您需要能够在中途停止计时器,请保留对它的引用,以便您可以根据需要使其无效。

答案 1 :(得分:0)

我怀疑我知道什么是错的,但不知道“正确”修复它,取决于你想要的“正确”。发生的事情很简单 - Objective C不会调用函数,它会传递消息。当您执行[self StrikeFrog]时,只要队列可以耗尽,就会在队列中放置一条消息;你可能在最后收到所有的消息,因为 StrikeFrog在睡眠之前没有被调用 - 只要队列线程被解除阻塞就会被调用。例如,在单线程应用程序中,净效应是睡眠(colorChoices.count)秒,然后在退出for循环后执行所有StrikeFrog事件,因为这是事件队列第一次发送你的活动。换句话说,无论使用了多少线程,Obj C中的所有“函数调用”都是异步的。

我建议使用CoreAnimation进行较低级别的C或更高级别。如果这些都不适合您,您可以尝试NSObject performSelector:withObject:afterDelay:排队一系列事件,每次事件都会在延迟一段时间后执行。不过,这种方法有很多问题需要解决,所以要小心。