添加孩子以外的didMove范围
问题描述:
我遇到了一个非常不寻常的问题 - 据我了解 - 迅速3.我创建一个SpriteKit iOS游戏。问题出在SKSpriteNode
。我通过添加孩子以外的didMove范围
var gameOverBackground : SKSpriteNode!
这正好位于类中创建节点。然后我初始化在didMove()
功能节点,像这样
override func didMove(to view: SKView) {
gameOverBackground = SKSpriteNode.init(texture: SKTexture(image: #imageLiteral(resourceName: "UIbg")), size: CGSize(width: (self.scene?.size.width)!/1.5, height: (self.scene?.size.height)!/1.5))
gameOverBackground.position = CGPoint(x: 0, y: 0)
gameOverBackground.zPosition = 10
gameOverBackground.name = "GameOverBackground"
}
现在问题出现了,当我稍后再试并添加节点作为孩子的场景。我的联系功能,像这样
func didBegin(_ contact: SKPhysicsContact) {
if (contact with many nodes) {
self.addChild(self.gameOverBackground)
}
}
我不断收到错误的节点等于nil
这样做。我找到了一个解决方法,只需简单地在didMove()
中添加子节点并隐藏它。然后在接触发生时不要隐瞒;但我更为好奇为什么这个问题正在发生,如果我做错了什么。
在此先感谢!
答
我发现了一个解决方法,只需在didMove()中添加子节点并隐藏它即可。然后在接触发生时不要隐瞒;但我更为好奇为什么这个问题正在发生,如果我做错了什么。
这意味着您的节点在didMove中并不是非零,但在您的联系人代表时,此处的某个地方已成为零。
这里是你的代码的例子,只是简化了一下:
var node: SKSpriteNode!
override func didMove(to view: SKView) {
node = SKSpriteNode(color: .blue, size: CGSize(width: 25, height: 25))
}
// Touchesbegan on ios:
override func mouseDown(with event: NSEvent) {
addChild(node)
}
的代码运行正常,当你点击屏幕上出现的节点。
Touchesbegan/didBegin不会有所作为。
问题是在你的代码中的某个地方节点被设置为零。
这里是怎么会发生的一个例子:我想是因为你在声明节点为'无功gameOverBackground您收到错误
// Touchesended on ios:
override func mouseUp(with event: NSEvent) {
node.removeFromParent() // or, node = nil
addChild(node) // crash!!
}
:SKSpriteNode'这里你都隐含展开可选的,当你如果你使用这个接触函数你的节点是零,所以节点等于零的错误被抛出,为了摆脱这个,你应该声明变量为非可选像'var gameOverBackground = SKSpriteNode()'或者像这样希望它是可选的'var gameOverBackground:SKSpriteNode? ='SKSpriteNode()'或简单'var gameOverBackground:SKSpriteNode?'但在这种情况下,它仍然是零,但它不会崩溃 – 3stud1ant3
@ 3stud1ant3你的建议可能工作,但你的推理是错误的('!'只是告诉编译器“程序员将确保这个值在使用时不为零”,以允许他们在其他地方初始化它。问题是该节点为零,尽管在didMove中初始化了 – Fluidity
@Fluidity感谢您的输入,将会牢记在心 – 3stud1ant3