【问题标题】:Presenting a scene in SpriteKit without discarding the previous?在 SpriteKit 中呈现场景而不丢弃之前的场景?
【发布时间】:2014-07-16 15:30:45
【问题描述】:

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

我的问题:有没有办法在不丢弃前一个的情况下堆叠或推送场景(最好使用过渡动画)?我在 SKScene 的 Apple 文档中找不到用于此特定目的的方法。

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

【问题讨论】:

  • Kobold Kit 具有带过渡的推送/弹出场景功能,应该很容易提取/调整:github.com/KoboldKit/KoboldKit/blob/master/KoboldKit/… 请注意,当有一个场景“推到顶部”时,“背景”场景既不活动也不绘制最近的一个”。
  • 您也可以尝试设置一个委托来来回传达场景,以便您的第二个场景(关卡场景)可以访问菜单场景。此外,您的所有其他级别都将具有相同的委托,您可以在菜单中设置一个方法来提取每个级别的信息。

标签: ios objective-c sprite-kit skscene


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多