【问题标题】:Pausing across multiple view controllers, what does -> do?跨多个视图控制器暂停,-> 做什么?
【发布时间】:2014-11-23 00:00:39
【问题描述】:

我第一次尝试暂停场景/节点,希望有人可以帮助我了解正在发生的事情。

我有 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 (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 交谈?或者我如何正确地告诉两个 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

【问题讨论】:

  • 当您只暂停场景时,场景的更新方法会继续被调用。如果您暂停视图,它将暂停所有内容。前提是您仅使用 Sprite Kit 计时方法,而不是 NSTimer、performSelector:afterDelay: 或 dispatch_ 计时方法。
  • 您可以在更新开始时签入。 if(yourScene.paused) return;
  • 你能解释一下主要问题是什么吗?

标签: objective-c sprite-kit


【解决方案1】:

我建议您避免为您的 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 其视图是否已暂停。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多