Как уволить SKScene?

Когда я закончу с SKScene, есть ли способ отменить SKScene из моего класса SKScene?

Если не вернуться в мой Viewcontroller, где я представляю SKScene [skView presentScene:theScene]; Есть ли способ перезапустить сцену или удалить из моего SKView?

Справочник по классам SKScene и Справочник по классам SKView не помогают.

Обновить:

Следующий код удаляет мою сцену из моего SKView [yourSKView presentScene:nil]; но когда я снова в своем контроллере, сцена все еще работает в фоновом режиме. Я всегда могу поставить его на паузу, когда игра закончится, и меня отправят обратно в мой контроллер представления (меню), но мне интересно, есть ли другой способ, кроме приостановки, например, полное его удаление?

-(void)endTheGame {
    [highscoreLabel removeFromSuperview];
    NSLog(@"Game Over");
   //would like to end here before calling the below method in my view controller
    [self.delegate mySceneDidFinish:self];
}

7 ответов

Решение

"Вы не можете перейти" Вернуться к контроллеру представления "из сцены. Сцена - это представление, контроллер представления управляет и отображает представления. Используйте контроллер представления для изменения представлений. Помните, что сам контроллер представления не является представлением". -Wharbio

Лучшее решение здесь - создать еще один View Controller. Этот вид контроллера будет моим меню. Тогда другой viewcontroller будет выступать в роли хоста для skscene.

В моей ситуации я затем использую свой view-контроллер меню, чтобы отключить viewcontroller, отображаемый в skview.

Столкнувшись с подобной проблемой, я наткнулся на ваш вопрос, и поскольку никто не дал достойного ответа, вот как я решил его:

  1. в моей сцене я назвал обе строки
[self removeFromParent];
[self.view presentScene:nil];
  1. в моем контроллере (контроллере, который отображает SKScene) я изменил код шаблона от Apple, которая создавала и представляла мою сцену из viewDidLoad, чтобы создать и представить мою сцену в viewWillAppear, только если сцена представления - ноль

вот мой код Swift, даже если вы используете Objective C, вы поймете, что он делает; ключевая строка - это тест if skView.scene == nil:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    let skView = self.view as SKView
    if skView.scene == nil {
        let scene = GameScene(size:skView.bounds.size)
        scene.controller = self
        skView.ignoresSiblingOrder = true
        scene.scaleMode = .AspectFill
        skView.presentScene(scene)
    }
}

Ты можешь использовать:

 [yourSKView presentScene:nil];

удалить сцену.

Изнутри вашего SKSceneможно просто сделать [self.view presentScene:aNewScene] представить другую сцену

Я полностью удаляю сцены, используя этот блок в моем контроллере вида: очевидно, вам нужно будет объявить ваш размер и "newSKview"

SKView * skView = (SKView *)self.view;

SKScene *newScene = [[newSKView alloc]initWithSize:size];
newScene.scaleMode = SKSceneScaleModeAspectFill;
SKScene *oldScene=(skView.scene);
[oldScene removeFromParent];
[skView presentScene:newScene];

Это прекрасно работает для меня. Ни одна из моих сцен не сохранилась и не является сильной.

Я предпочитаю использовать дополнительный для SKView а также Notification Center где UIViewController сделал SkScene.

Функция обратного вызова

      @objc func cb_dismissingVC(_ notificaiton: Notification) {
    self.dismiss(animated: true, completion: nil)
}

Может быть, мой вариант будет полезен:

[[self.scene childNodeWithName:@"YourChildNodeName"] removeFromParent];
Другие вопросы по тегам