2014-03-24 85 views
2

我有一個非常重量級的場景,需要5秒加載。
我希望有一個加載屏幕,並在其等待加載時出現一個微調器,這是什麼優雅的解決方案?如何在SKScene轉換之間設置微調器?

當我的場景加載時,我應該製作中間場景並在其上顯示微調嗎?

我可以在後臺線程中分配和initWithSize場景嗎?

這裏是我如何做到這一點現在:

MyScene *newScene = [[MyScene alloc] initWithSize:self.size]; 
SKTransition *transition = [SKTransition flipHorizontalWithDuration:1.0]; 
[self.view presentScene:newScene transition:transition]; 

但只要我按下按鈕 - 遊戲凍結這些5秒鐘,不提供反饋的球員是怎麼回事。

標記爲coco2d,因爲它有非常相似的API和問題。

+1

韋恩·哈特曼的答案很可能你需要的東西,但它是可能的(可能)你的一些延遲5秒的來源於事情發生在我這應該發生在後臺。例如,如果您正在加載資源,則無需阻止UI線程。你可以開始你的微調,然後在後臺加載你的內容,並在完成後回調主線程加載你的新場景。 – dokkaebi

+0

@dokkaebi這聽起來似乎合理。我可以在後臺線程中執行場景的alloc init,然後在主線程中使用它嗎? – Dvole

+0

這取決於在初始化期間發生了什麼。如果它不觸及視圖層次結構,那應該沒問題。我沒有使用精靈套件,所以你必須仔細檢查它是如何工作的。 – dokkaebi

回答

2

不要在後臺線程上這樣做。你可以做的是首先展示你的微調,然後dispatch_async實際過渡:

// Write code for showing your spinner 

dispatch_async(dispatch_get_main_queue(), ^{ 
    MyScene *newScene = [[MyScene alloc] initWithSize:self.size]; 
    SKTransition *transition = [SKTransition flipHorizontalWithDuration:1.0]; 
    [self.view presentScene:newScene transition:transition]; 
}); 

這將顯示您的微調,並在下次運行循環執行的過渡。

+1

切線,但是'dispatch_async'在你不關心延遲時間的時候會更漂亮一些,語義更準確。 – dokkaebi

+0

@dokkaibi完全同意! –

+0

但是因爲我的微調旋轉主線程,不會加載東西在同一個線程停止旋轉? – Dvole

2

這裏是我的方法:

在Interface Builder中添加SKView,導入圖像,大白活動指示到GameSceneViewController

enter image description here

爲添加的控件添加網點GameSceneViewController

@interface GameSceneViewController : UIViewController 

@property (nonatomic, weak) IBOutlet SKView *skView; 
@property (weak, nonatomic) IBOutlet UIImageView *loadingScreen; 
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator; 

@end 

在您的SKScene a DD類方法,它加載的所有資產的場景:

+(void)loadSceneAssetsWithCompletionHandler:(AGAssetLoadCompletionHandler)handler { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     // Load the shared assets in the background. 
     [self loadSceneAssets]; 

     if (!handler) { 
      return; 
     } 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Call the completion handler back on the main queue. 
      handler(); 
     }); 
    }); 
} 

其中AGAssetLoadCompletionHandlerGameScene.h定義爲

/* Completion handler for callback after loading assets asynchronously. */ 
typedef void (^AGAssetLoadCompletionHandler)(void); 

同樣的方式使用蘋果在他們Sprite Kit Adventure Game

最後,GameSceneViewControllerviewWillAppear方法:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.activityIndicator startAnimating]; 

    if (!self.skView.window) { 
     [self.view addSubview:self.skView]; 
    } 

    [GameScene loadSceneAssetsWithCompletionHandler:^{ 
     GameScene *scene = [[GameScene alloc] initWithSize:self.skView.bounds.size]; 
     scene.scaleMode = SKSceneScaleModeAspectFit; 
     [self.skView presentScene:scene transition:[SKTransition crossFadeWithDuration:1]]; 
     [self.activityIndicator stopAnimating]; 

     [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
      self.loadingScreen.alpha = 0.0f; 
     } completion:NULL]; 

    }]; 
}