Я хочу «перезагрузить» и «перезапустить» GameScene, так что, как будто GameScene был сначала вызван. Я смотрел на различные методы для этого, но каждый раз, когда я получаю предупреждение, что я пытаюсь добавить узел к родительскому, у которого уже есть родитель. Однако в моем коде я удаляю все мои существующие узлы, поэтому я действительно запутался в том, как сбросить GameScene. Вот как я это делаю сейчас (этот код вызывается, когда я хочу, чтобы перезапустить GameScene с нуля, и это называется в классе GameScene):Swift 3 (SpriteKit): Сессия GameScene после окончания игры
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()
1.Edited: я понял, что почему Я получал это предупреждение: «Я пытаюсь добавить узел к родительскому, у которого уже есть родительский элемент», потому что у меня были все переменные для сцены вне класса и как глобальные переменные. Однако теперь, когда игра возобновляется, игра находится в левом нижнем углу. Почему это так и как я могу это исправить? - FIXED
2.Edited: в настоящее время штраф Все работает, но теперь мое дело в том, что deinit{}
не называется, хотя каждый узел удаляется и кадр не падает с течением времени. Вот что у меня в GameViewController для установки сцены и в моем GameScene (в каждом случае, относящийся к сценам поэтому в основном все, что имеет отношение):
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
}
}
Тогда мой GameScene является в основном:
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<UITouch>, 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)
}
Любые ответы были бы весьма благодарны :)
О «попытке добавить узел к родительскому, у которого уже есть родительский элемент», я бы сказал, что вы сделали какой-то беспорядок :) Это может произойти, если старая сцена не освобождена, а вы храните узлы глобально и пытаетесь их добавить к текущей сцене. Тем не менее, это просто догадка, может быть, ваш старый sccene будет освобожден должным образом, и вы действительно пытаетесь добавить узел к другому родителю. Таким образом, требуется больше информации. В какой момент вы добавляете узел в сцену, когда получаете эту ошибку? – Whirlwind
Хорошо, если все переменные в файле сцены игры определены вне класса (включая узлы, которые получают эту ошибку)? Это может быть проблема? –
^Это сработало, но теперь, когда игра перезапустила игру в левом нижнем углу экрана? Как это исправить? –