title: Swift 3 (SpriteKit): Reseting the GameScene after the game ends
body: <p>I am wanting to 'reset' and 'restart' the GameScene so it is as if the GameScene was first called. I have looked at different methods for doing this, but each time I get a warning that I'm trying to add a node to a parent which already has a parent. However, in my code I delete all my existing nodes so I'm really confused as to how to reset the GameScene. This is how I do it now (this code is called when I want to restart the GameScene from scratch and it is called within the GameScene class):</p>
  
  <pre><code>let scene = GameScene(size: self.size)
  scene.scaleMode = .aspectFill
  let animation = SKTransition.fade(withDuration: 1.0) 
  self.view?.presentScene(scene, transition: animation)
  self.removeAllChildren()
  self.removeAllActions()
  self.scene?.removeFromParent()
  </code></pre>
  
  <p><strong><em>1.Edited:</em></strong> I realised that why I was getting this warning: "I'm trying to add a node to a parent which already has a parent" was because I had all the variables for the scene outside of the class and as global variables. However, now when the game restarts, the game is in the bottom left corner. Why is this the case and how do I fix this? - <em>FIXED</em></p>
  
  <p><strong><em>2.Edited:</em></strong> Everything works fine now, but now my concern is that <code>deinit{}</code> isn't called even though every node is deleted and the fps doesn't drop over time. Here is what I have in my GameViewController for setting the scene and in my GameScene (every instance relating to the scenes so basically all that is relevant):</p>
  
  <pre><code>import UIKit
  import SpriteKit
  import GameplayKit
  
  var screenSize = CGSize()
  
  class GameViewController: UIViewController {
  
  override func viewDidLoad() {
      super.viewDidLoad()
      if let view = self.view as! SKView? {
          // Load the SKScene from 'GameScene.sks'
          if let scene = SKScene(fileNamed: "GameScene") {
              // Set the scale mode to scale to fit the window
              scene.scaleMode = .aspectFill
              screenSize = scene.size     
              // Present the scene
              view.presentScene(scene)
          }
  
          view.ignoresSiblingOrder = true
  
          view.showsFPS = true
          view.showsNodeCount = true
      }
  }
  </code></pre>
  
  <p>Then my GameScene is basically: </p>
  
  <pre><code>import SpriteKit
  import GameplayKit
  
  class GameScene: SKScene, SKPhysicsContactDelegate {
  //Declare and initialise variables and enumerations here
  
  deinit{print("GameScene deinited")}
  
  override func didMove(to view: SKView) {
       //Setup scene and nodes
  }
  
  override func touchesBegan(_ touches: Set&lt;UITouch&gt;, with event: UIEvent?) {
      //Do other things depending on when and where you touch
  
      //When I want to reset the GameScene 
      let newScene = GameScene(size: self.size)
      newScene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
      newScene.scaleMode = self.scaleMode
      let animation = SKTransition.fade(withDuration: 1.0)
      self.view?.presentScene(newScene, transition: animation)
  }
  </code></pre>
  
  <p>Any answers would be greatly appreciated :)</p>