【发布时间】:2017-01-14 11:28:17
【问题描述】:
我想要“重置”和“重新启动”GameScene,就好像第一次调用了 GameScene。我已经查看了不同的方法来执行此操作,但是每次我收到警告说我正在尝试将节点添加到已经有父节点的父节点。但是,在我的代码中,我删除了所有现有节点,所以我对如何重置 GameScene 感到非常困惑。这就是我现在的做法(当我想从头开始重新启动 GameScene 时会调用此代码,并在 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: 我意识到为什么我会收到此警告:“我正在尝试将节点添加到已经有父节点的父节点”是因为我在课堂之外拥有场景的所有变量并作为全局变量。但是,现在当游戏重新开始时,游戏在左下角。为什么会出现这种情况,我该如何解决? - 已修复
2.Edited: 现在一切正常,但现在我担心的是 deinit{} 没有被调用,即使每个节点都被删除并且 fps 没有不会随着时间的推移而下降。这是我在 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)
}
任何答案将不胜感激:)
【问题讨论】:
-
关于“尝试将节点添加到已经有父节点的父节点”,我想说你弄得一团糟:) 如果旧场景没有被释放,并且你正在全局存储节点,就会发生这种情况并尝试将它们添加到当前场景中。不过,这只是一个猜测,也许您的旧场景已正确释放,而您实际上是在尝试将节点添加到另一个父节点。因此,需要更多信息。当您收到该错误时,您在什么时候将节点添加到场景中?
-
如果游戏场景文件中的所有变量都定义在类之外(包括出现此错误的节点),是否可以?会不会是这个问题?
-
^ 这行得通,但是现在当游戏在屏幕左下角重新开始游戏时?我该如何解决这个问题?
标签: swift sprite-kit reset skscene