Как уволить 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];
}

person 4GetFullOf    schedule 20.02.2014    source источник
comment
отклонить контроллер представления? В конце концов, если вы больше не хотите представлять сцену, вы можете (и должны) просто полностью отказаться от SKView.   -  person LearnCocos2D    schedule 21.02.2014
comment
Удалось ли это решить? У меня такая же проблема. Невозможно вернуться к контроллеру представления со сцены   -  person jeddi    schedule 26.05.2014
comment
Вы не можете вернуться к контроллеру представления из сцены. Сцена - это представление, контроллер представления управляет и отображает представления. Используйте контроллер представления для изменения представления. Помните, что сам по себе контроллер представления не является представлением.   -  person Wharbio    schedule 24.07.2014


Ответы (6)


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

  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)
    }
}
person Alex    schedule 12.12.2014
comment
Если бы ваш ответ был менее запутанным, это помогло бы. У вас есть сочетание стремительности и объективности c. Я не уверен, что фрагменты вашего кода согласуются с вашим текстом. Вы упоминаете контроллер представления, но показываете процедуру из игровой сцены? В моем случае я установил две точки останова в контроллере представления, одну в viewdidload, а другую в viewwillappear. Оба попадают при запуске, но ни один из них не попадает после метода, который вы использовали в игровой сцене на шаге 1. - person netskink; 12.12.2016

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

 [yourSKView presentScene:nil];

убрать сцену.

person AndyOS    schedule 20.02.2014
comment
здорово, да, это удаляет сцену из моего skview, но когда я перенаправлен в меню, сцена все еще работает в фоновом режиме? Другой способ, а не пауза в сцене, когда игра окончена, есть ли другой способ? - person 4GetFullOf; 21.02.2014
comment
Находится ли меню в родительском контроллере представления? Можете ли вы опубликовать код, который вы используете для перехода в меню? - person AndyOS; 21.02.2014
comment
Да, меню является родительским контроллером представления - person 4GetFullOf; 21.02.2014
comment
Как он все еще работает, если вы установили его на ноль? Вы рассматривали возможность размещения меню в отдельном контроллере представления? Итак, у VC1 есть меню, которое может вызывать VC2, на котором размещается SKScene. Когда игра закончится, попросите VC1 закрыть VC2. - person AndyOS; 21.02.2014
comment
да, мне кажется, что для того, чтобы просто остановить сцену, нужно много работы, не так ли? Я не уверен, почему он все еще работает, я установил его на ноль .. - person 4GetFullOf; 21.02.2014
comment
Я предпочитаю использовать два виртуальных канала, это дает лучший контроль и гарантирует, что ваш SKScene будет удален вместе с использованием памяти. Вы по-прежнему можете использовать VC2, чтобы приостановить игру, но если вы хотите удалить его, используйте VC1. Также я обычно помещаю в SKScene меню с такими функциями, как пауза для перезапуска. - person AndyOS; 21.02.2014
comment
хорошо, я оставлю вопрос открытым для других ответов - person 4GetFullOf; 21.02.2014
comment
Когда я делаю это в своем контроллере представления, сцена полностью освобождается, она еще не запущена. Вам не нужны два контроллера представления, чтобы остановить сцену, более вероятно, что где-то есть цикл сохранения, удерживающий сцену в памяти. Раньше это было ошибкой в ​​SpriteKit, где SKScenes сохранялись даже после этого, но теперь это исправлено. Так что, если это все еще проблема, цикл сохранения будет где-то в вашем коде. - person Marcus; 18.02.2016

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

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

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

person 4GetFullOf    schedule 11.08.2014
comment
Нет другого выхода. Если я сделаю это так, я получаю много предупреждений о памяти и время от времени игра вылетает? - person productioncoder; 03.10.2014

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

person Yaman    schedule 20.02.2014
comment
это, кажется, решение для всех из моих поисков этого ответа. но я не этого хочу. Я хочу вернуться в меню (что я уже успешно делаю) в моем контроллере представления. Вероятно, это когда я вернусь в свое меню, и вы нажмете кнопку, чтобы снова запустить игру и представить сцену в том же месте, где она остановилась. Определите причину, по которой мне нужно как-то закрыть или перезапустить сцену. - person 4GetFullOf; 21.02.2014
comment
Вы уверены, что представляете новую сцену, т.е. выполняете alloc / init, а не существующую сцену, сохраненную в ivar? - person Yaman; 21.02.2014

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

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

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

У меня это отлично работает. Ни одна из моих сцен не сохранилась и не стала сильной.

person Wharbio    schedule 24.07.2014

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

[[self.scene childNodeWithName:@"YourChildNodeName"] removeFromParent];
person Romchas    schedule 17.04.2014
comment
OP спрашивает, как удалить сцены, а не узлы - person James Paul Mason; 12.07.2014