Swift: Desalocar o GameScene após a transição para uma nova cena?
Então, eu li várias perguntas sobre isso, mas a maioria está no Objective-C e não encontrei nenhuma que resolva / responda diretamente. Eu sou novo na programação aqui, por favor, explique todas as sugestões realmente.
Eu preciso entender comodesalocar meu GameScene após o término do jogo. A razão pela qual eu preciso fazer isso é porque, após o término do jogo, faço a transição para um novo SKScene (a cena do game over) e quando faço a transição para o meu GameScene, o GameScene não é totalmente redefinido ou estou gerando um novo GameScene a cada vez .
Digo isso porque minha contagem de quadros por segundo diminui toda vez que eu jogo e volto para o GameScene, de modo que, se eu fizer isso o suficiente, não posso mais jogar o jogo. Isto é um problema.
Não entendo por que isso acontece porque, quando faço a transição para o meu game over, removo tudo do GameScene:
self.viewController!.performSegueWithIdentifier("goToGameOver", sender: nil)
self.removeAllChildren()
self.removeAllActions()
self.scene?.removeFromParent()
Eu também li aqui:Após o fechamento do SKScene, a memória permanece alta que a remoção do SKView que contém um SKScene desaloca o SKScene; portanto, quando minhas cenas GameScene e game over são deixadas, eu removo AMBAS as visualizações de suas superviews assim:
override func viewDidDisappear(animated: Bool) {
print("its gone")
self.view.removeFromSuperview()
}
Mas nada afeta a contagem decrescente de quadros por segundo e o jogo continua atrasado. Eu não entendo o que não estou fazendo e não sei dizer se a cena do jogo acabou ou não estou desalocando o GameScene.
Como desaloco o GameScene? O que mais eu deveria estar fazendo?
EDITAR:
A contagem de nós e a contagem de empates permanecem a mesma toda vez que faço a transição para o GameScene, de modo que isso não parece ser um problema. Eu tentei testar sedeinit
foi chamado durante a transição entre cenas (eu não tinha umdeinit
antes) usando isso na classe GameScene:
} //<**End of GAMESCENE**
deinit {
print("Deinit was called")
}
E nada é impresso tãodeinit
não está sendo chamado.
EDIT 2:
@alex_p Aqui está o que eu tenho no meu GameViewController-
class GameViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
var scene1: GameScene?
var scene2: GameScene?
var skView: SKView?
// Action to present next Scene
@IBAction func nextSceneAction(sender: AnyObject) {
print("Next scene")
// Create new GameScene object
scene2 = GameScene(fileNamed:"GameScene")
// Present scene2 object that replace the scene1 object
skView!.presentScene(scene2) //ERROR ON THIS LINE
scene1 = nil
}
E eu chamo esse método do meu GameScene assim:
self.viewController.nextSceneAction(self)
Copiei o seu exatamente, mas estou recebendo o errounexpectedly found nil while unwrapping an Optional value
na linha comentada acima. Deinit em não ser chamado.