2014-03-27 30 views
0

我希望NSMuttableArray中的每个对象都能出现4秒。而不是消失。并通过这种方式迭代来自数组的所有项目。而我得到的结果是所有项目都出现,并且在期间后一起消失。带时间延迟的目标c循环

-(void)showTreasures{ 


for (int i = 0; i < _treasures.count; i++) 
{ 
    SKSpriteNode *obj = [_treasures objectAtIndex:i]; 

SKAction *show = [SKAction runBlock:^{ 
    obj.hidden = NO; 
}]; 

SKAction *wait = [SKAction waitForDuration:4]; 


SKAction *hide = [SKAction runBlock:^{ 
    obj.hidden = YES; 
}]; 

SKAction *sequence = [SKAction sequence:@[show, wait, hide]]; 
[obj runAction:sequence completion:^{ 

    NSLog(@"Item %d", i); 
}]; 

} 

}

+0

'runAction:completion:'是异步的。它启动该动作,然后立即返回。你正在快速连续地开始'_treasures.count'独立行动,所以它们似乎会同时发生。您可能需要一个序列,其中包含所有操作,因为您希望它们互相依赖。或者,使用runBlock操作作为最后一个操作,并让它创建要执行的下一个操作序列。 –

回答

0

何不你用数组来建立一个所有动作的列表,然后运行所有这些动作的序列?

-(void)showTreasures 
{ 
    NSMutableArray *actions = [NSMutableArray array]; 

    for (int i = 0; i < _treasures.count; i++) 
    { 
     SKSpriteNode *obj = [_treasures objectAtIndex:i]; 

     SKAction *show = [SKAction runBlock:^{ 
      obj.hidden = NO; 
     }]; 

     SKAction *wait = [SKAction waitForDuration:4]; 

     SKAction *hide = [SKAction runBlock:^{ 
      obj.hidden = YES; 
     }]; 

     SKAction *finish = [SKAction runBlock:^{ 
      NSLog(@"Item %d", i); 
     }]; 

     [actions addObjectsFromArray:@[show, wait, hide, finish]]; 
    } 

    SKAction *sequence = [SKAction sequence:actions]; 
    [obj runAction:sequence completion:^{ 
     NSLog(@"Finished all items"); 
    }]; 
} 
+0

谢谢你杰弗里托马斯,我的事情你的方法是正确的! – user1614097

4

我认为这是递归方法,方法,调用本身做好。 您可以创建了所有对象(SKSpriteNode)的阵列,并再次传递到第一(或最后)需要对象和运行适当的行动的方法,删除对象和调用方法:

NSMutableArray *arrOfObject = //arrat with all of the sprites you want to show 
[self runShowAction:arrOfObject]; 

-(void)runShowAction:(NSMutableArray*)array { 

    //if no object in the array return 
    if(array.count <= 0) return; 

    SKSpriteNode *obj = [array firstObject]; 
    //Run your code here 
    //... 


    //On completion remove object from array and run this method again 
    [obj runAction:sequence completion:^{ 

     NSLog(@"Item %d", i); 

     [array removeObject:obj]; 
     [self runShowAction:array]; 
    }]; 
}