我正在尝试按顺序播放动画但我在播放它们时遇到问题,因为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);
}
}
它在整个周期中移动非常快,睡眠没有做任何事情让它播放每个动画......有什么建议吗?
答案 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:排队一系列事件,每次事件都会在延迟一段时间后执行。不过,这种方法有很多问题需要解决,所以要小心。