Как уволить 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.
Столкнувшись с подобной проблемой, я наткнулся на ваш вопрос, и поскольку никто не дал достойного ответа, вот как я решил его:
- в моей сцене я назвал обе строки
[self removeFromParent]; [self.view presentScene:nil];
- в моем контроллере (контроллере, который отображает 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];