我有一个非常重量级的场景需要5秒才能加载 我想要一些带有微调器的加载屏幕在等待加载时出现 - 这是什么优雅的解决方案?
我的场景加载时,我应该制作中间场景并在其上显示微调器吗?
我可以在后台线程中分配和initWithSize场景吗?
我现在就是这样做的:
MyScene *newScene = [[MyScene alloc] initWithSize:self.size];
SKTransition *transition = [SKTransition flipHorizontalWithDuration:1.0];
[self.view presentScene:newScene transition:transition];
但是当我按下按钮时 - 游戏冻结了这5秒钟并且没有为玩家提供任何反馈意见。
将其标记为coco2d,因为它具有非常相似的API和问题。
答案 0 :(得分: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 :(得分:2)
这是我的方法:
在Interface Builder中添加SKView
,加载图片,大白活动指示器到GameSceneViewController
:
为GameSceneViewController
添加控件的插座:
@interface GameSceneViewController : UIViewController
@property (nonatomic, weak) IBOutlet SKView *skView;
@property (weak, nonatomic) IBOutlet UIImageView *loadingScreen;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
@end
在SKScene
添加类方法中,该方法加载场景的所有资源:
+(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();
});
});
}
其中AGAssetLoadCompletionHandler
在GameScene.h
中定义为
/* Completion handler for callback after loading assets asynchronously. */
typedef void (^AGAssetLoadCompletionHandler)(void);
相同的方法在Sprite Kit Adventure Game中使用Apple。
最后,GameSceneViewController
的{{1}}方法:
viewWillAppear