ios - 在不丢弃前一个场景的情况下在 SpriteKit 中呈现一个场景?

标签 ios objective-c sprite-kit skscene

我的情况是我有一个 GameMenuScene,在用户选择关卡后,我想呈现 LevelScene。但是我不想丢弃之前的 GameMenuScene 因为 LevelScene 实际上是 GameMenuScene@property 并且用户是否完成关卡将被保存为 LevelScene@propertyGameMenuScene 应该能够在用户完成或退出关卡。如果我简单地使用 presentScene:transitionGameMenuScene 将被丢弃,信息无法传回。

我的问题:有没有一种方法可以将场景堆叠或推到彼此之上而不丢弃之前的场景(最好使用过渡动画)?我在 SKScene 的 Apple 文档中找不到用于此特定目的的方法。

注意:另一个 StackOverflow 对类似问题的回答建议创建一个新的 UIViewController,在其中显示 LevelScene,然后显示 UIViewController模态地。但我希望 Apple 文档中有一种我错过的现有方法,它可以模态地呈现场景本身,而无需创建 UIVIewControllers

最佳答案

SKScenes 没有类似于导航 Controller 的功能,可让您推送和弹出场景。您将需要编写代码来管理和呈现您的场景。

这是一个简单的 View Controller 实现,它允许您在两个场景之间切换(通过滑动)而不会丢弃另一个场景。

@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

关于ios - 在不丢弃前一个场景的情况下在 SpriteKit 中呈现一个场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24784814/

相关文章:

ios - 为什么导航栏内容在 iOS 11 上显示,而在 iOS 10 上不显示?

iphone - 在设备上找不到过度发布的对象调试

ios - 在属性集上定义 setter 方法

objective-c - PrepareForSegue 与 UIImagePickerController

ios - 检测 SKSpriteNode 何时完全低于另一个 SKSpriteNode

ios - Swift 获取字符串中最后一次出现字符后的子字符串

objective-c - 如何在输入 View 移动时使 VoiceOver 工作

ios - 如何检查 NSArray 是否包含特定索引处的任何对象?

ios - 没有 init 方法时如何正确子类化 SKNode?

swift - SKLabelNode 边界和边界问题