暂停多个视图控制器,做什么 - >做?

时间:2014-11-21 09:06:25

标签: objective-c sprite-kit

这里有一些noobie问题我第一次试图暂停一个场景/节点,希望有人可以帮我理解发生了什么。

我有2个VC GameViewController.m(包含我的GameUI相关代码) GameScene.m(包含我的游戏相关代码和我的主节点“myWorld”)。

来自GameViewController.m 如果我跑

_scene.paused = YES; 

屏幕上的所有内容都会暂停,并且没有任何动作,但如果我通过

取消游戏
_scene.paused = NO;

你可以告诉我的GameScene.m“myWorld”节点继续运行,因为当我取消暂停游戏进入超级快进并赶上该位置时,如果我没有暂停的话就会这样。

我尝试过其他几行,比如

self.view.paused = YES;

然后Xcode建议我改为

self->_skView.paused = YES;

当我这样做时,它有效!并成功暂停了所有内容,包括GameScene.m中的“myWorld”代码。但是怎么样?我不明白? 有人可以告诉我“ - >”是什么在这做???

另外在我的其他VC GameScene.m中,我的更新方法中有一行代码,等待游戏暂停通过

if (self.paused==YES)

但是当我从GameViewController.m运行这个新代码时,“self-> _skView.paused = YES;”

if if(self.paused == YES)“if”条件在这里不符合。

GameScene.m
-(void)update:(CFTimeInterval)currentTime {
if (self.paused==YES) {
//do stuff

如何编写“if”条件,以便GameViewController.m“self-> _skView.paused = YES;” GameScene.m中是否满足“if”条件?

我想我要问的是我如何从一个VC谈到另一个?或者我如何正确地告诉两个VC游戏暂停等?

任何帮助都会很棒我的代码

GameViewController.m

@implementation GameViewController {
SKView *_skView; 
GameScene *_scene; 
}

- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];

if (!_skView) {
    _skView =
    [[SKView alloc] initWithFrame:self.view.bounds];
    GameScene *scene =
    [[GameScene alloc] initWithSize:_skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    [_skView presentScene:scene];
    [self.view addSubview:_skView];
    [self.view sendSubviewToBack:_skView];

    _scene = scene;
    __weak GameViewController *weakSelf = self;
}
}

//My pause method
//was    
//_scene.paused = YES;
//now
self->_skView.paused = YES;

//My unpause method
//was    
//_scene.paused = NO;
//now
self->_skView.paused = NO;

GameScene.m

-(void)didMoveToView:(SKView *)view {
SKNode *myWorld = [SKNode node];
[self addChild:myWorld];

-(void)update:(CFTimeInterval)currentTime {
if (self.paused==YES) {
//do stuff

1 个答案:

答案 0 :(得分:0)

我建议你不要为你的SKScene子类创建一个实例变量(ivar)。如果您在某些时候没有将ivar设置为nil,则当您转换到另一个场景时,SpriteKit将不会释放场景。此外,您不需要SKView的ivar,因为您可以通过self访问它。以下是如何从视图控制器和场景子类暂停SKView的示例:

在视图控制器中,

暂停SKView

((SKView *)self.view).paused = YES;

并检查视图是否已暂停

if (((SKView *).self.view).paused) {
   // Do something
}

SKScene子类中(例如GameScene),

暂停SKView

self.view.paused = YES;

并检查视图是否已暂停

if (self.view.paused) {
   // Do something
}

您可以使用委派机制告诉视图控制器暂停其视图或询问VC是否暂停其视图。