SpriteKit – 以相同的状态返回到一个持久的场景。

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

除此之外,我无法find关于这个问题的更多文件。 我知道在其他框架,如Cocos2D,你可以popup场景在一个堆栈,甚至有多个场景在同一时间运行。

我如何得到这个在SpriteKit工作。

我有一个游戏与一个滑动菜单select字符。 select一个angular色后,场景变为另一个菜单。 我希望用户能够点击后退button,并显示前一个场景,他们select的angular色是全视angular。

目前我已经把前一个场景作为一个新场景呈现出来了。 哪一个原因造成它在一个新的状态,第一个字符在平面视图,而不是他们select的字符。

这应该是非常简单的,但对于我所有的search引擎,我不知道如何实现这一点。

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

我做了一个自定义的“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 

我用它的方式是,当用户在游戏场景中点击一个暂停button时,我将这些行称为:

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

请注意,在这个小块的self是游戏场景。

通过使暂停场景保持指向游戏场景的弱指针,当暂停场景被解除分配时,它可以保持指向返回场景的指针而不释放它。

PS MAScene类只是SKScene类的一个小扩展,我只是添加了一些东西。 如果有人也想让我知道。

假设菜单场景也在Sprite Kit中实现,您可以创build一个模式视图控制器,将其呈现,并将Sprit Kit场景放在该模式视图上。

因此,具体来说,创build一个新的UIViewControllerinheritance类MenuViewController和一个新的SKSceneinheritance类, MenuScene 。 类“MenuScene” MenuScene应该是您正在寻找的场景。 挂钩MenuSceneMenuViewController就像你通常挂钩一个SKScene及其视图控制器。 确保将原始场景的视图控制器作为原始SKScene的属性。

无论你想展示这个菜单,你都可以从原来的SKScene调用:

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

有一些简单的方法来转换b / w SKScene实例,但是如果你想保持SKScene在后台运行,我相信这是你必须做的。

在您拨打新电话之前,您应该保持强指针指向离开的场景

这里是通过单例实现的例子(实际上通常与单一的场景指针,没有魔法)

 @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