我遇到了一个非常不寻常的问题 - 据我所知 - 迅捷3.我正在创建一个SpriteKit iOS游戏。问题在于SKSpriteNode
。我通过
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()
中添加子节点并将其隐藏起来,找到了解决方法。然后只是在接触发生时不加掩饰;但我更好奇为什么会出现这个问题,如果我做错了什么。
提前致谢!
答案 0 :(得分:1)
我找到了一个解决方法,只需在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不会有所作为。
问题是代码中的某个节点被设置为nil。
这是一个如何发生这种情况的例子:
// Touchesended on ios:
override func mouseUp(with event: NSEvent) {
node.removeFromParent() // or, node = nil
addChild(node) // crash!!
}