正确摆脱旧的SKScene?

时间:2014-11-13 21:53:36

标签: sprite-kit skscene

我的游戏中有一些问题,我想我找到了源码。首先,我在我的游戏中使用CMMotionManager来捕捉陀螺动作,如果用户在没有完全关闭应用程序的情况下两次玩游戏,陀螺仪可能会出现故障并停止收听用户,可能是因为有两个{{1 },所以有两个gameScene。我也在菜单中播放音乐,当我转换到CMMotionManager时,我必须明确地调用stop,它应该只是释放那个场景。

我不想处理多个视图控制器,所以我的想法是:

  1. 将旧场景作为参数传递到新场景
  2. 加载新场景后,将旧场景设置为gameScene
  3. 这可以解决我的问题吗?

1 个答案:

答案 0 :(得分:0)

致电SKView presentScene:presentScene:transition:将正确摆脱旧的SKScene。

但是,如果存在对旧场景的强引用,则不会释放该场景。我对这个问题的体验来自于试验和错误。

请查看此代码。当场景具有弱引用或强引用时,它进行演示。 https://gist.github.com/naterhat/5399eec40eaa23edbfbc

在没有看到您的代码的情况下,我解决问题的建议是删除除SKView以外的任何与场景的连接。当场景假设通过切换到新场景而取消分配时记录。如果有效,那么慢慢连接新代码。如果没有取消分配,仍然会引用旧场景。

您可以检查仪器以查看是否已取消分配场景。相反,我发现最好通过在场景的initdealloc方法中添加日志来实现此目的。

- (void)dealloc
{
    NSLog(@"%@ Scene DEALLOCATED", self.name);
}

- (instancetype)initWithSize:(CGSize)size
{
    if(self = [super initWithSize:size]){
        self.name = @"TEST";
        NSLog(@"%@ Scene CREATED", self.name);
    }
}

希望这有帮助。