我的情况是我有一个GameMenuScene
,在用户选择一个级别后,我想要呈现LevelScene
。但我不希望丢弃之前的GameMenuScene
因为LevelScene
实际上是@property
GameMenuScene
,并且用户是否完成该级别将被保存为@property
LevelScene
GameMenuScene
,presentScene:transition
应该能够在用户完成或退出关卡后访问。如果我只使用GameMenuScene
,则UIViewController
将被丢弃,并且信息无法传回。
我的问题:是否有办法将场景叠加或推到彼此之上而不丢弃之前的场景(最好使用过渡动画)?我在找不到SKScene的Apple文档中找不到这种特定用途的方法。
注意:另一个StackOverflow对类似问题的回答建议创建一个新的LevelScene
,在其中显示UIViewController
,然后以模式方式显示UIVIewControllers
。但是我希望Apple文档中有一个现有的方法,我错过了以模态方式呈现场景本身,而不必创建{{1}}。
答案 0 :(得分:2)
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