SKScene 在 presentViewController 之后重复

Posted

技术标签:

【中文标题】SKScene 在 presentViewController 之后重复【英文标题】:SKScene duplicate after a presentViewController 【发布时间】:2014-03-18 10:26:46 【问题描述】:

我不明白为什么我的不起作用。

用例:

    测试 1: 我启动游戏,从第一个场景点击播放按钮 (presentScene),然后我进入第二个场景。没问题。 测试 2: 我启动游戏,点击第一个场景中的选项按钮 (presentViewController)。在 Optin 控制器上,我单击以关闭 ViewControllerAnimated。如果我想点击播放按钮,屏幕上没有变化,但游戏很明显。我不明白为什么场景会留在屏幕上,为什么没有过渡。

没有错误输出。

代码控制器:

- (void)viewDidLoad

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showParam) name:kNotificationShowParam object:nil];
    //...
    SKView * skView = (SKView *)self.view;
    SKScene * scene = [[MenuScene alloc ]initWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    [skView presentScene:scene];


- (void)showParam

    ParamViewController *ParamView = [[crazyButterflyParamViewController alloc]init];
    [self presentViewController: ParamView animated: YES completion:^ 
    ];

代码参数控制器:

//method on button
-(void)goToMenu

    [self.view.window.rootViewController dismissViewControllerAnimated:YES completion:^
    ];

代码菜单场景:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    for (UITouch* touch in touches)
    
        if ([_button containsPoint:[touch locationInNode:_button.parent]])
        
            SKTransition *transition = [SKTransition fadeWithDuration:0.4];
            SKScene *scene = [[GameScene alloc] initWithSize:self.size];
            scene.scaleMode = SKSceneScaleModeAspectFill;
            [self.scene.view presentScene:scene transition:transition];
            break;
        


        if ([_buttonParam containsPoint:[touch locationInNode:_buttonParam.parent]])
        
            [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationShowParam object:nil];
            break;
        
    

【问题讨论】:

检查 self.view.window.rootViewController 是否真的是您要关闭的控制器。验证 viewDidLoad 没有被第二次调用,如果是,则表明创建了一个新的 SKView。检查内存泄漏和对象没有在它们应该释放的地方,特别是 SK 视图控制器。这个问题听起来好像您在原始 SKView 仍在内存中时创建了第二个 SKView。 我在viewDidLoad之后加了一个断点,但是只调用了一次。 【参考方案1】:

现在好了!

我已将通知替换为来自菜单场景的呼叫:

if ([_buttonParam containsPoint:[touch locationInNode:_buttonParam.parent]])
    
        //[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationShowParam object:nil];
        [self.view.window.rootViewController presentViewController:_paramController animated: YES completion:^(void) 
            SKView * skView = (SKView *)self.view;
            MyScene *MenuScene = [[MyScene alloc]initWithSize:skView.bounds.size];
            MenuScene.scaleMode = SKSceneScaleModeAspectFill;
            [skView presentScene:MenuScene];
        ];
        break;
    

这样,完成后就可以找到原来的控制器了。

【讨论】:

以上是关于SKScene 在 presentViewController 之后重复的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SpriteKit 中的 SKScene 上显示 AdMob 横幅广告?

SceneKit中的SKScene

将 SKScene 添加到 UIViewController?

如何在 SKScene 中呈现 UIViewController?

从 SKScene 中删除 iAd

带有圆角矩形的 SKScene