这里简要提到了能够从中断的地方返回到前一个场景的概念:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/DesigningGameswithSpriteKit/DesigningGameswithSpriteKit.html
除此之外,我找不到关于这个主题的更多文件。我知道在像Cocos2D这样的其他框架中你可以在堆栈上弹出场景,甚至可以同时运行多个场景。
如何在SpriteKit中使用它。
我有一个游戏,带有用于选择角色的滑动菜单。选择角色后,场景变为另一个菜单。我希望用户能够点击后退按钮并显示前一个场景,他们选择的角色在全视图中。
目前,我将前一个场景作为一个新场景展示。其中的原因是在新鲜状态下创建它,第一个字符在普通视图中,而不是他们选择的字符。
这应该非常简单,但对于我的所有Google搜索,我都不知道如何实现这一点。
答案 0 :(得分:2)
假设菜单场景也在Sprite Kit中实现,您可以创建一个模态视图控制器,显示它,并将Sprit Kit场景放在该模态视图上。
因此,具体来说,创建一个新的UIViewController继承类MenuViewController
,以及一个新的SKScene继承类MenuScene
。课程' MenuScene' MenuScene
应该是您希望呈现的场景。像你通常连接MenuScene
及其视图控制器一样挂钩MenuViewController
和SKScene
。确保将原始场景的视图控制器作为原始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