Дубликат SKScene после presentViewController

Я не понимаю, почему мой не работает.

Вариант использования:

  1. Тест 1: я запускаю игру, я нажимаю кнопку воспроизведения (presentScene) из первой сцены, поэтому я перехожу ко второй сцене. Без проблем.
  2. Тест 2: я запускаю игру, нажимаю кнопку Option (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;
        }
    }
}

person Alexandre Ouicher    schedule 18.03.2014    source источник
comment
Убедитесь, что self.view.window.rootViewController действительно является контроллером, который вы хотите отключить. Убедитесь, что viewDidLoad не вызывается во второй раз, если это так, это будет означать, что был создан новый SKView. Проверьте наличие утечек памяти, соответственно, объекты, которые не освобождаются там, где должны, особенно контроллер представления SK. Проблема звучит так, как будто вы создаете второй SKView, пока исходный SKView все еще находится в памяти.   -  person LearnCocos2D    schedule 18.03.2014
comment
Я добавил точку останова после viewDidLoad, но она вызывается только один раз.   -  person Alexandre Ouicher    schedule 18.03.2014


Ответы (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;
    }

При этом я могу найти оригинальный контроллер после завершения.

person Alexandre Ouicher    schedule 18.03.2014