2014-09-12 4 views
0

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

-(void)buttonAnimation{ 
    SKAction *HUDzoom = [SKAction scaleTo:3 duration:1]; 
    SKAction *HUDzoomOut = [SKAction scaleTo:1.0 duration:1]; 
    SKAction *HUDAnimation = [SKAction sequence:@[HUDzoom, HUDzoomOut]]; 

    [self.startButton runAction:[SKAction repeatActionForever:HUDAnimation]]; 
} 

-(void)loadScene{ 
    SKScene *restart = [[Level_1 alloc] initWithSize:self.size]; 
    [self.view presentScene:restart]; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 

    SKNode *node = [self nodeAtPoint:location]; 

    if ([node.name isEqualToString:@"startLevel1"]){ 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
       [self loadScene]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self buttonAnimation]; 
      }); 
     }); 

    } 
} 

ответ

3

Это потому, что вы загружаете сцену асинхронно, и только после того, как это будет сделано, вы начинаете кнопку анимации асинхронно:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    // loading the scene 
    [self loadScene]; 

    // when scene has finished loading, animate the button asynchronically 
    // (this makes no sense) 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self buttonAnimation]; 
    }); 
}); 

Вместо этого вы должны запустить анимацию, а затем загрузить сцену асинхронно.

[self buttonAnimation]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     [self loadScene]; 
}); 

Кнопка оживляется Sprite действий Kit, в то время как вы можете начать анимацию асинхронно он не будет делать всю анимацию асинхронно. Вместо этого вам просто нужно убедиться, что любые блокирующие методы, такие как loadScene, запускаются асинхронно.

+0

Работает отлично. Большое спасибо! –

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