在SpriteKit中呈现场景而不丢弃之前的场景?

时间:2014-07-16 15:30:45

标签: ios objective-c sprite-kit skscene

我的情况是我有一个GameMenuScene,在用户选择一个级别后,我想要呈现LevelScene。但我不希望丢弃之前的GameMenuScene因为LevelScene实际上是@property GameMenuScene,并且用户是否完成该级别将被保存为@property LevelScene GameMenuScenepresentScene:transition应该能够在用户完成或退出关卡后访问。如果我只使用GameMenuScene,则UIViewController将被丢弃,并且信息无法传回。

我的问题:是否有办法将场景叠加或推到彼此之上而不丢弃之前的场景(最好使用过渡动画)?我在找不到SKScene的Apple文档中找不到这种特定用途的方法。

注意:另一个StackOverflow对类似问题的回答建议创建一个新的LevelScene,在其中显示UIViewController,然后以模式方式显示UIVIewControllers。但是我希望Apple文档中有一个现有的方法,我错过了以模态方式呈现场景本身,而不必创建{{1}}。

1 个答案:

答案 0 :(得分:2)

SKScenes没有类似导航控制器的功能,允许您推送和弹出场景。您需要编写代码来管理和展示您的场景。

这是一个简单的视图控制器实现,允许您在两个场景之间切换(通过滑动),而不会丢弃其他场景。

@interface ViewController()

@property BOOL viewFlag;
@property SKScene *scene1;
@property SKScene *scene2;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                              initWithTarget:self action:@selector(handleSwipeGesture:)];
    swipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeGesture];

    // Create and configure scene 1.
    SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    self.scene1 = scene;

    // Present the scene 1.
    [skView presentScene:scene];

    // Create and configure scene 2.
    scene = [MySecondScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    self.scene2 = scene;
}

- (void) handleSwipeGesture:(id)sender
{
    SKView * skView = (SKView *)self.view;
    _viewFlag = !_viewFlag;
    if (_viewFlag) {
        [skView presentScene:_scene1];
    }
    else {
        [skView presentScene:_scene2];
    }
}

@end