如何在SKScene过渡之间设置微调器?

时间:2014-03-24 18:48:57

标签: ios sprite-kit

我有一个非常重量级的场景需要5秒才能加载 我想要一些带有微调器的加载屏幕在等待加载时出现 - 这是什么优雅的解决方案?

我的场景加载时,我应该制作中间场景并在其上显示微调器吗?

我可以在后台线程中分配和initWithSize场景吗?

我现在就是这样做的:

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

但是当我按下按钮时 - 游戏冻结了这5秒钟并且没有为玩家提供任何反馈意见。

将其标记为coco2d,因为它具有非常相似的API和问题。

2 个答案:

答案 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

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添加类方法中,该方法加载场景的所有资源:

+(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中使用Apple。

最后,GameSceneViewController的{​​{1}}方法:

viewWillAppear