首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpriteKit -返回到一个持久化的场景,在相同的状态下,它被留在。

SpriteKit -返回到一个持久化的场景,在相同的状态下,它被留在。
EN

Stack Overflow用户
提问于 2013-12-10 23:48:28
回答 3查看 2.9K关注 0票数 1

我们在这里简要地提到了能够返回到以前的场景的概念:PG/DesigningGameswithSpriteKit/DesigningGameswithSpriteKit.html

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

我如何让它在SpriteKit中工作。

我有一个游戏与一个滑动菜单的字符选择。在选择一个字符时,场景将更改为另一个菜单。我希望用户能够按下一个后退按钮,并呈现上一个场景,在那里,他们选择的字符在全视图中。

现在,我已经把前一幕呈现为一个新的场景。哪一个原因创建它在一个新的状态,第一个字符在普通视图,而不是他们选择的字符。

这应该是非常简单的,但对于我的谷歌搜索,我不知道如何实现。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-31 03:10:41

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

我定制了一个"PauseScene“,用户可以设置返回场景,这意味着当您准备返回时,PauseScene的视图将显示返回场景。下面是代码:

PauseScene.h

代码语言:javascript
复制
#import "MAScene.h"

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

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


@end

PauseScene.m

代码语言:javascript
复制
#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

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

代码语言:javascript
复制
self.paused = YES;
PauseScene * pScene = [[PauseScene alloc] initWithSize:self.size];
[pScene setReturnScene:self];
[self.view presentScene:pScene];

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

通过使暂停场景保持到游戏场景的弱指针,当暂停场景被取消时,它可以保持指向返回场景的指针而不去分配它。

PS -- MAScene类只是SKScene类的一个小扩展,我只是向它添加了一些东西。如果有人也想要的话,请告诉我。

票数 3
EN

Stack Overflow用户

发布于 2013-12-11 00:18:31

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

因此,具体来说,创建一个新的UIViewController继承类MenuViewController和一个新的SKScene继承类MenuScene。类“MenuScene”MenuScene应该是您想要呈现的场景。将MenuSceneMenuViewController连接起来,就像通常会挂起SKScene及其视图控制器一样。确保将原始场景的视图控制器作为原始SKScene的属性。

无论您想在哪里显示该菜单,都可以从原始SKScene调用:

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-03-15 15:09:45

在调用new之前,您应该保留指向离开场景的强指针。

下面是通过单例实现的例子(实际上通常使用场景指针,没有魔法)

代码语言:javascript
复制
@interface Global : NSObject

+ (Global*)sharedInstance;

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

和.m文件

代码语言:javascript
复制
@implementation Global

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

    static dispatch_once_t oncePredicate;

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

@end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20507790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档