SpriteKit - 返回到处于相同状态的持久场景。

时间:2013-12-10 23:48:29

标签: ios objective-c sprite-kit

这里简要提到了能够从中断的地方返回到前一个场景的概念:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/DesigningGameswithSpriteKit/DesigningGameswithSpriteKit.html

除此之外,我找不到关于这个主题的更多文件。我知道在像Cocos2D这样的其他框架中你可以在堆栈上弹出场景,甚至可以同时运行多个场景。

如何在SpriteKit中使用它。

我有一个游戏,带有用于选择角色的滑动菜单。选择角色后,场景变为另一个菜单。我希望用户能够点击后退按钮并显示前一个场景,他们选择的角色在全视图中。

目前,我将前一个场景作为一个新场景展示。其中的原因是在新鲜状态下创建它,第一个字符在普通视图中,而不是他们选择的字符。

这应该非常简单,但对于我的所有Google搜索,我都不知道如何实现这一点。

3 个答案:

答案 0 :(得分:2)

假设菜单场景也在Sprite Kit中实现,您可以创建一个模态视图控制器,显示它,并将Sprit Kit场景放在该模态视图上。

因此,具体来说,创建一个新的UIViewController继承类MenuViewController,以及一个新的SKScene继承类MenuScene。课程' MenuScene' MenuScene应该是您希望呈现的场景。像你通常连接MenuScene及其视图控制器一样挂钩MenuViewControllerSKScene。确保将原始场景的视图控制器作为原始SKScene的属性。

无论您想在何处展示此菜单,都可以使用原始SKScene进行呼叫:

MenuViewController *modalViewController = [[MenuViewController alloc] init]; [self.viewController presentModalViewController:modalViewController];

有一些更简单的方法可以转换b / w SKScene个实例,但如果你想让初始SKScene在后​​台运行,我相信这就是你必须要做的。

答案 1 :(得分:2)

我不知道是否还有人在检查这个,但我相信我有另一种方法来解决这个问题。

我制作了一个自定义的“PauseScene”,用户可以设置一个返回场景,这意味着当你准备好返回时,PauseScene的视图会显示返回场景。这是代码:

PauseScene.h

#import "MAScene.h"

@interface PauseScene : MAScene
@property (weak, nonatomic, readonly) SKScene * returnScene;

-(void)setReturnScene:(SKScene *)otherScene;


@end

PauseScene.m

#import "PauseScene.h"
#import "MASpriteButton.h"


@interface PauseScene ()
@property (strong, nonatomic) MASpriteButton * resumeButton;
@end


@implementation PauseScene


-(void)setReturnScene:(SKScene *)otherScene
{
    _returnScene = otherScene;
}


-(void)didMoveToView:(SKView *)view
{
    [self createContent];
}

-(void)createContent
{

    __weak typeof(self) weakMe = self;

    MASpriteButton * resume = [[MASpriteButton alloc] initWithBackgroundImageNamed:@"cardback.png" andSelectedImageNamed:@"cardback.png" andCallbackBlock:^{

        NSLog(@"removing...");
        [weakMe.view presentScene:self.returnScene];
    }];

    resume.size = CGSizeMake(self.widthToHeightRatio * 20, self.heightToWidthRatio * 20);
    resume.position = CGPointMake(self.size.width/2, self.size.height/2);


    self.resumeButton = resume;
    [self addChild:self.resumeButton];
    [self setBackgroundColor:[UIColor blueColor]];
}


@end

我使用它的方式是当用户点击游戏场景中的暂停按钮时,我称之为:

self.paused = YES;
PauseScene * pScene = [[PauseScene alloc] initWithSize:self.size];
[pScene setReturnScene:self];
[self.view presentScene:pScene];

请注意,此小块中的self是游戏场景。

通过让暂停场景保持一个指向游戏场景的弱指针,它可以保留一个指向返回场景的指针,而不会在暂停场景被解除分配时解除分配。

PS MAScene类只是SKScene类的一个小扩展,我刚刚添加了几个东西。如果有人想要,请告诉我。

答案 2 :(得分:0)

在调用新的

之前,你应该保持指向离开场景的强指针

以下是通过单例实现的实例(实际上通常是带有场景指针的单例,没有魔法)

@interface Global : NSObject

+ (Global*)sharedInstance;

@property (strong, nonatomic) SKScene *mainScene;
@end

和.m文件

@implementation Global

+ (instancetype) sharedInstance{
    static Global *_sharedInstance = nil;

    static dispatch_once_t oncePredicate;

    dispatch_once(&oncePredicate, ^{
        _sharedInstance = [[Global alloc] init];
    });
    return _sharedInstance;
}

@end