2017-09-17 142 views
1

我遇到了一個非常不尋常的問題 - 據我瞭解 - 迅速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()中添加子節點並隱藏它。然後在接觸發生時不要隱瞞;但我更爲好奇爲什麼這個問題正在發生,如果我做錯了什麼。

在此先感謝!

+0

:SKSpriteNode'這裏你都隱含展開可選的,當你如果你使用這個接觸函數你的節點是零,所以節點等於零的錯誤被拋出,爲了擺脫這個,你應該聲明變量爲非可選像'var gameOverBackground = SKSpriteNode()'或者像這樣希望它是可選的'var gameOverBackground:SKSpriteNode? ='SKSpriteNode()'或簡單'var gameOverBackground:SKSpriteNode?'但在這種情況下,它仍然是零,但它不會崩潰 – 3stud1ant3

+2

@ 3stud1ant3你的建議可能工作,但你的推理是錯誤的('!'只是告訴編譯器「程序員將確保這個值在使用時不爲零」,以允許他們在其他地方初始化它。問題是該節點爲零,儘管在didMove中初始化了 – Fluidity

+0

@Fluidity感謝您的輸入,將會牢記在心 – 3stud1ant3

回答

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不會有所作爲。

問題是在你的代碼中的某個地方節點被設置爲零。

這裏是怎麼會發生的一個例子:我想是因爲你在聲明節點爲'無功gameOverBackground您收到錯誤

// Touchesended on ios: 
override func mouseUp(with event: NSEvent) { 
    node.removeFromParent() // or, node = nil 
    addChild(node) // crash!! 
}